diff --git a/gradle.properties b/gradle.properties index c942764d..8fa9a071 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,10 +3,10 @@ org.gradle.daemon=false # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.21.3 - yarn_mappings=1.21.3+build.2 - loader_version=0.16.7 - fabric_version=0.106.1+1.21.3 + minecraft_version=1.21.4 + yarn_mappings=1.21.4+build.2 + loader_version=0.16.9 + fabric_version=0.111.0+1.21.4 # Mod Properties group=com.minelittlepony @@ -19,7 +19,7 @@ org.gradle.daemon=false modrinth_project_id=JBjInUXM # Dependencies - modmenu_version=12.0.0-beta.1 - kirin_version=1.20.3+1.21.3 - hd_skins_version=6.14.1+1.21.3 - mson_version=1.11.1+1.21.3 + modmenu_version=13.0.0-beta.1 + kirin_version=1.20.3+1.21.4 + hd_skins_version=6.14.2+1.21.4 + mson_version=1.11.1+1.21.4 diff --git a/src/main/java/com/minelittlepony/api/model/ModelAttributes.java b/src/main/java/com/minelittlepony/api/model/ModelAttributes.java index 9d7306c6..8b2b8488 100644 --- a/src/main/java/com/minelittlepony/api/model/ModelAttributes.java +++ b/src/main/java/com/minelittlepony/api/model/ModelAttributes.java @@ -130,6 +130,7 @@ public class ModelAttributes { public Arm mainArm; public Hand activeHand; + @Deprecated public ItemStack heldStack = ItemStack.EMPTY; public int itemUseTime; diff --git a/src/main/java/com/minelittlepony/api/model/Models.java b/src/main/java/com/minelittlepony/api/model/Models.java index f5c2dde8..b2d0c5a5 100644 --- a/src/main/java/com/minelittlepony/api/model/Models.java +++ b/src/main/java/com/minelittlepony/api/model/Models.java @@ -1,7 +1,7 @@ package com.minelittlepony.api.model; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Util; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/minelittlepony/api/pony/PonyData.java b/src/main/java/com/minelittlepony/api/pony/PonyData.java index 86161571..5c8e375d 100644 --- a/src/main/java/com/minelittlepony/api/pony/PonyData.java +++ b/src/main/java/com/minelittlepony/api/pony/PonyData.java @@ -6,6 +6,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.ComparisonChain; import com.minelittlepony.api.pony.meta.*; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.*; import java.util.function.Function; @@ -70,6 +72,20 @@ public record PonyData ( private static final Function OF_RACE = Util.memoize(race -> new PonyData(race, TailLength.FULL, TailShape.STRAIGHT, Gender.MARE, SizePreset.NORMAL, DEFAULT_MAGIC_COLOR, true, 0, Wearable.EMPTY_FLAGS)); public static final PonyData NULL = OF_RACE.apply(Race.HUMAN); + public static final Codec CODEC = RecordCodecBuilder.create(i -> { + return i.group( + Race.CODEC.fieldOf("race").forGetter(PonyData::race), + TailLength.CODEC.fieldOf("tailLength").forGetter(PonyData::tailLength), + TailShape.CODEC.fieldOf("tailShape").forGetter(PonyData::tailShape), + Gender.CODEC.fieldOf("gender").forGetter(PonyData::gender), + SizePreset.CODEC.xmap(s -> (Size)s, s -> (SizePreset)s).fieldOf("size").forGetter(PonyData::size), + Codec.INT.fieldOf("glowColor").forGetter(PonyData::glowColor), + Codec.BOOL.optionalFieldOf("noSkin", false).forGetter(PonyData::noSkin), + Codec.INT.optionalFieldOf("priority", 0).forGetter(PonyData::priority), + Wearable.FLAGS_CODEC.fieldOf("gear").forGetter(PonyData::gear) + ).apply(i, PonyData::new); + }); + public static PonyData emptyOf(Race race) { return OF_RACE.apply(race); } diff --git a/src/main/java/com/minelittlepony/api/pony/meta/Flags.java b/src/main/java/com/minelittlepony/api/pony/meta/Flags.java index 8905d17e..a2715b34 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/Flags.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/Flags.java @@ -2,7 +2,12 @@ package com.minelittlepony.api.pony.meta; import net.minecraft.network.PacketByteBuf; +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + import java.util.*; +import java.util.stream.Collectors; public record Flags & TValue> ( T def, @@ -10,6 +15,15 @@ public record Flags & TValue> ( int colorCode ) implements Comparable>, TValue { + public static & TValue> Codec> codec(T def, Codec elementCodec) { + Codec> setCodec = Codec.list(elementCodec).xmap(elements -> elements.stream().distinct().collect(Collectors.toUnmodifiableSet()), set -> List.copyOf(set)); + return Codec.xor(setCodec.xmap(elements -> new Flags<>(def, elements, 0), flags -> flags.values()), RecordCodecBuilder.create(i -> i.group( + elementCodec.fieldOf("def").forGetter(Flags::def), + setCodec.fieldOf("values").forGetter(Flags::values), + Codec.INT.fieldOf("colorCode").forGetter(Flags::colorCode) + ).apply(i, Flags::new))).xmap(Either::unwrap, Either::left); + } + public static & TValue> Flags of(T def) { return new Flags<>(def, Set.of(), 0); } diff --git a/src/main/java/com/minelittlepony/api/pony/meta/Gender.java b/src/main/java/com/minelittlepony/api/pony/meta/Gender.java index 8a9a08d8..fcf588e1 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/Gender.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/Gender.java @@ -1,10 +1,16 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.StringIdentifiable; + +import com.mojang.serialization.Codec; + public enum Gender implements TValue { MARE(0), STALLION(0xffffff), ABOMONATION(0x888888); + public static final Codec CODEC = StringIdentifiable.createCodec(Gender::values); + private int triggerValue; Gender(int pixel) { diff --git a/src/main/java/com/minelittlepony/api/pony/meta/Race.java b/src/main/java/com/minelittlepony/api/pony/meta/Race.java index 64071f06..acaeb157 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/Race.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/Race.java @@ -1,5 +1,9 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.StringIdentifiable; + +import com.mojang.serialization.Codec; + public enum Race implements TValue { HUMAN (0x000000, false, false), EARTH (0xf9b131, false, false), @@ -15,6 +19,8 @@ public enum Race implements TValue { BATPONY (0xeeeeee, true, false), SEAPONY (0x3655dd, false, true); + public static final Codec CODEC = StringIdentifiable.createCodec(Race::values); + private final boolean wings; private final boolean horn; diff --git a/src/main/java/com/minelittlepony/api/pony/meta/SizePreset.java b/src/main/java/com/minelittlepony/api/pony/meta/SizePreset.java index f96e1bab..70a1da7f 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/SizePreset.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/SizePreset.java @@ -1,6 +1,9 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.StringIdentifiable; + import com.minelittlepony.api.config.PonyConfig; +import com.mojang.serialization.Codec; /** * Represents the different model sizes that are possible. @@ -20,6 +23,8 @@ public enum SizePreset implements Size { FOAL (0xffbe53, 0.25f, 0.6F, 0.5F), UNSET (0x000000, 1, 1, 1); + public static final Codec CODEC = StringIdentifiable.createCodec(SizePreset::values); + private final int triggerValue; private final float shadowSize; private final float scale; diff --git a/src/main/java/com/minelittlepony/api/pony/meta/TValue.java b/src/main/java/com/minelittlepony/api/pony/meta/TValue.java index cdb5525a..d1079ca2 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/TValue.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/TValue.java @@ -1,12 +1,14 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.StringIdentifiable; + import java.util.Arrays; import java.util.List; /** * Interface for enums that can be parsed from an image trigger pixel value. */ -public interface TValue { +public interface TValue extends StringIdentifiable { /** * Gets the pixel colour matching this enum value. */ @@ -24,6 +26,11 @@ public interface TValue { */ String name(); + @Override + default String asString() { + return name(); + } + default String getHexValue() { return toHex(colorCode()); } diff --git a/src/main/java/com/minelittlepony/api/pony/meta/TailLength.java b/src/main/java/com/minelittlepony/api/pony/meta/TailLength.java index 4650b405..eb967162 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/TailLength.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/TailLength.java @@ -1,5 +1,9 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.StringIdentifiable; + +import com.mojang.serialization.Codec; + public enum TailLength implements TValue { STUB (0x425844), QUARTER (0xd19fe4), @@ -7,6 +11,8 @@ public enum TailLength implements TValue { THREE_QUARTERS (0x8a6b7f), FULL (0x000000); + public static final Codec CODEC = StringIdentifiable.createCodec(TailLength::values); + private int triggerValue; TailLength(int pixel) { diff --git a/src/main/java/com/minelittlepony/api/pony/meta/TailShape.java b/src/main/java/com/minelittlepony/api/pony/meta/TailShape.java index db3def93..40956938 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/TailShape.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/TailShape.java @@ -1,11 +1,17 @@ package com.minelittlepony.api.pony.meta; +import net.minecraft.util.StringIdentifiable; + +import com.mojang.serialization.Codec; + public enum TailShape implements TValue { STRAIGHT(0), BUMPY (0xfc539f), SWIRLY (0x3eff22), SPIKY (0x3308c7); + public static final Codec CODEC = StringIdentifiable.createCodec(TailShape::values); + private int triggerValue; TailShape(int pixel) { diff --git a/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java b/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java index f23f829a..777ff380 100644 --- a/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java +++ b/src/main/java/com/minelittlepony/api/pony/meta/Wearable.java @@ -1,9 +1,11 @@ package com.minelittlepony.api.pony.meta; import net.minecraft.util.Identifier; +import net.minecraft.util.StringIdentifiable; import net.minecraft.util.math.ColorHelper; import com.minelittlepony.api.pony.Pony; +import com.mojang.serialization.Codec; import java.util.*; import java.util.function.Function; @@ -29,6 +31,9 @@ public enum Wearable implements TValue { public static final Flags EMPTY_FLAGS = Flags.of(NONE); + public static final Codec CODEC = StringIdentifiable.createCodec(Wearable::values); + public static final Codec> FLAGS_CODEC = Flags.codec(NONE, CODEC); + Wearable(int pixel, Identifier texture) { triggerValue = pixel; id = Pony.id(name().toLowerCase(Locale.ROOT)); diff --git a/src/main/java/com/minelittlepony/client/PonyDataLoader.java b/src/main/java/com/minelittlepony/client/PonyDataLoader.java index 6c28e039..3f71fd36 100644 --- a/src/main/java/com/minelittlepony/client/PonyDataLoader.java +++ b/src/main/java/com/minelittlepony/client/PonyDataLoader.java @@ -1,10 +1,9 @@ package com.minelittlepony.client; import net.minecraft.client.MinecraftClient; -import net.minecraft.resource.metadata.ResourceMetadataReader; +import net.minecraft.resource.metadata.ResourceMetadataSerializer; import net.minecraft.util.Identifier; -import com.google.gson.*; import com.minelittlepony.api.pony.PonyData; import com.minelittlepony.client.util.render.NativeUtil; @@ -17,21 +16,7 @@ import org.jetbrains.annotations.Nullable; public class PonyDataLoader { public static final Supplier> NULL = loaded(PonyData.NULL); - private static final ResourceMetadataReader SERIALIZER = new ResourceMetadataReader() { - private static final Gson GSON = new GsonBuilder() - .excludeFieldsWithoutExposeAnnotation() - .create(); - - @Override - public String getKey() { - return "pony"; - } - - @Override - public PonyData fromJson(JsonObject json) { - return GSON.fromJson(json, PonyData.class); - } - }; + private static final ResourceMetadataSerializer SERIALIZER = new ResourceMetadataSerializer("pony", PonyData.CODEC); /** * Parses the given resource into a new IPonyData. diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index 56816934..79bb22b8 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -116,12 +116,9 @@ public abstract class AbstractPonyModel extends Clien rotateLegs(entity); - ArmPose left = getArmPose(entity, Arm.LEFT); - ArmPose right = getArmPose(entity, Arm.RIGHT); - if (!entity.attributes.isSwimming && !entity.attributes.isGoingFast) { - alignArmForAction(entity, getArm(Arm.LEFT), left, right, 1); - alignArmForAction(entity, getArm(Arm.RIGHT), right, left, -1); + alignArmForAction(entity, getArm(Arm.LEFT), entity.leftArmPose, entity.rightArmPose, 1); + alignArmForAction(entity, getArm(Arm.RIGHT), entity.rightArmPose, entity.leftArmPose, -1); } swingItem(entity); @@ -133,7 +130,7 @@ public abstract class AbstractPonyModel extends Clien adjustBody(entity, 0, ORIGIN); if (!entity.attributes.isLyingDown) { - animateBreathing(entity, left, right); + animateBreathing(entity); } if (entity.attributes.isSwimmingRotated) { @@ -454,17 +451,17 @@ public abstract class AbstractPonyModel extends Clien * @param animationProgress Total whole and partial ticks since the entity's existence. * Used in animations together with {@code swing} and {@code move}. */ - protected void animateBreathing(T state, ArmPose left, ArmPose right) { + protected void animateBreathing(T state) { float cos = MathHelper.cos(state.age * 0.09F) * 0.05F + 0.05F; float sin = MathHelper.sin(state.age * 0.067F) * 0.05F; - if (state.attributes.shouldLiftArm(right, left, -1)) { + if (state.attributes.shouldLiftArm(state.rightArmPose, state.leftArmPose, -1)) { ModelPart arm = getArm(Arm.RIGHT); arm.roll += cos; arm.pitch += sin; } - if (state.attributes.shouldLiftArm(left, right, 1)) { + if (state.attributes.shouldLiftArm(state.leftArmPose, state.rightArmPose, 1)) { ModelPart arm = getArm(Arm.LEFT); arm.roll += cos; arm.pitch += sin; @@ -499,7 +496,7 @@ public abstract class AbstractPonyModel extends Clien public void positionheldItem(T state, Arm arm, MatrixStack matrices) { float left = arm == Arm.LEFT ? -1 : 1; - UseAction action = state.attributes.heldStack.getUseAction(); + UseAction action = state.getHeldItem(arm).action; if (action == UseAction.SPYGLASS && state.attributes.itemUseTime > 0) { return; @@ -507,7 +504,7 @@ public abstract class AbstractPonyModel extends Clien matrices.translate(-left * 0.1F, 0.45F, 0); - if (state.attributes.heldStack.getUseAction() == UseAction.BLOCK && state.attributes.itemUseTime == 0) { + if (action == UseAction.BLOCK && state.attributes.itemUseTime == 0) { matrices.translate(left * 0.02F, -0.25F, 0); } } diff --git a/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java b/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java index 9ebbaa76..5da00e72 100644 --- a/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/ClientPonyModel.java @@ -65,11 +65,6 @@ public abstract class ClientPonyModel extends PlayerE return side == Arm.LEFT ? leftLeg : rightLeg; } - @Override - public ArmPose getArmPose(PlayerEntityRenderState state, Arm side) { - return super.getArmPose(state, side); - } - static void resetPivot(ModelPart part) { part.setPivot(part.getDefaultTransform().pivotX(), part.getDefaultTransform().pivotY(), part.getDefaultTransform().pivotZ()); } diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index 9639eb02..f64e2732 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -36,10 +36,10 @@ public final class ModelType { public static final ModelKey WITCH = register("witch", WitchPonyModel::new); public static final ModelKey> ZOMBIE = register("zombie", ZomponyModel::new); public static final ModelKey PIGLIN = register("piglin", PiglinPonyModel::new); - public static final ModelKey> SKELETON = register("skeleton", SkeleponyModel::new); + public static final ModelKey> SKELETON = register("skeleton", tree -> new AlicornModel<>(tree, false)); public static final ModelKey BOGGED_MUSHROOMS = register("bogged_mushrooms", tree -> new SinglePartModel(tree, RenderLayer::getEntityTranslucent)); - public static final ModelKey> SKELETON_CLOTHES = register("skeleton_clothes", SkeleponyModel::new); - public static final ModelKey PILLAGER = register("pillager", PillagerPonyModel::new); + public static final ModelKey> SKELETON_CLOTHES = register("skeleton_clothes", tree -> new AlicornModel<>(tree, false)); + public static final ModelKey> PILLAGER = register("pillager", tree -> new ChangelingModel<>(tree, false)); public static final ModelKey> ILLAGER = register("illager", IllagerPonyModel::new); public static final ModelKey> GUARDIAN = register("guardian", SeaponyModel::new); public static final ModelKey ENDERMAN = register("enderman", EnderStallionModel::new); diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java b/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java index 0dd87485..db392773 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmorModelRegistry.java @@ -1,7 +1,7 @@ package com.minelittlepony.client.model.armour; import net.minecraft.item.Item; -import net.minecraft.item.equipment.EquipmentModel; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java index 8085a149..151fe109 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java @@ -3,6 +3,7 @@ package com.minelittlepony.client.model.armour; import net.minecraft.client.MinecraftClient; import net.minecraft.client.model.Model; import net.minecraft.client.render.*; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.state.BipedEntityRenderState; import net.minecraft.client.render.entity.state.LivingEntityRenderState; import net.minecraft.client.render.item.ItemRenderer; @@ -12,9 +13,11 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.type.DyedColorComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.*; -import net.minecraft.item.equipment.EquipmentModel; -import net.minecraft.item.equipment.EquipmentModel.LayerType; +import net.minecraft.item.equipment.EquipmentAsset; import net.minecraft.item.equipment.trim.ArmorTrim; +import net.minecraft.item.equipment.trim.ArmorTrimMaterial; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.ItemTags; import net.minecraft.util.*; @@ -22,6 +25,7 @@ import org.jetbrains.annotations.Nullable; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; +import java.util.function.UnaryOperator; public interface ArmourRendererPlugin { AtomicReference INSTANCE = new AtomicReference<>(new ArmourRendererPlugin() {}); @@ -45,8 +49,10 @@ public interface ArmourRendererPlugin { case LEGS -> state.equippedLegsStack; case FEET -> state.equippedFeetStack; case BODY -> state.equippedChestStack; - case MAINHAND -> state.getMainHandStack(); - case OFFHAND -> state.mainArm == Arm.LEFT ? state.leftHandStack : state.rightHandStack; + default -> ItemStack.EMPTY; + // TODO: Mojaaaaaaang!! + //case MAINHAND -> state.getMainHandStack(); + //case OFFHAND -> state.mainArm == Arm.LEFT ? state.leftHandStack : state.rightHandStack; }}; } @@ -58,11 +64,11 @@ public interface ArmourRendererPlugin { return stack.isIn(ItemTags.DYEABLE) ? DyedColorComponent.getColor(stack, -6265536) : Colors.WHITE; } - default float getArmourAlpha(EquipmentSlot slot, LayerType layer) { + default float getArmourAlpha(EquipmentSlot slot, EquipmentModel.LayerType layer) { return 1F; } - default float getTrimAlpha(EquipmentSlot slot, ArmorTrim trim, LayerType layer) { + default float getTrimAlpha(EquipmentSlot slot, ArmorTrim trim, EquipmentModel.LayerType layer) { return 1F; } @@ -71,18 +77,29 @@ public interface ArmourRendererPlugin { } @Nullable - default VertexConsumer getTrimConsumer(EquipmentSlot slot, VertexConsumerProvider provider, ArmorTrim trim, LayerType layerType, Identifier modelId) { - @Nullable VertexConsumer buffer = getOptionalBuffer(provider, getTrimLayer(slot, trim, layerType, modelId)); + default VertexConsumer getTrimConsumer(EquipmentSlot slot, VertexConsumerProvider provider, ArmorTrim trim, EquipmentModel.LayerType layerType, RegistryKey assetId) { + @Nullable VertexConsumer buffer = getOptionalBuffer(provider, getTrimLayer(slot, trim, layerType, assetId)); if (buffer == null) { return null; } SpriteAtlasTexture armorTrimsAtlas = MinecraftClient.getInstance().getBakedModelManager().getAtlas(TexturedRenderLayers.ARMOR_TRIMS_ATLAS_TEXTURE); - Sprite sprite = armorTrimsAtlas.getSprite(trim.getTexture(layerType, modelId)); + Sprite sprite = armorTrimsAtlas.getSprite(getTexture(trim, layerType, assetId)); return sprite.getTextureSpecificVertexConsumer(buffer); } + private static String getAssetName(RegistryEntry material, RegistryKey assetKey) { + String string = (String)material.value().overrideArmorAssets().get(assetKey); + return string != null ? string : material.value().assetName(); + } + + private static Identifier getTexture(ArmorTrim trim, EquipmentModel.LayerType layerType, RegistryKey assetId) { + Identifier identifier = trim.pattern().value().assetId(); + String string = getAssetName(trim.material(), assetId); + return identifier.withPath((UnaryOperator)(path -> "trims/entity/" + layerType.asString() + "/" + path + "_" + string)); + } + @Nullable - default RenderLayer getTrimLayer(EquipmentSlot slot, ArmorTrim trim, LayerType layerType, Identifier modelId) { + default RenderLayer getTrimLayer(EquipmentSlot slot, ArmorTrim trim, EquipmentModel.LayerType layerType, RegistryKey assetId) { return TexturedRenderLayers.getArmorTrims(trim.pattern().value().decal()); } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureLookup.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureLookup.java index 6b9db82e..81d0e211 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureLookup.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureLookup.java @@ -1,7 +1,7 @@ package com.minelittlepony.client.model.armour; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentModel; public interface ArmourTextureLookup { ArmourTexture getTexture(ItemStack stack, EquipmentModel.LayerType layerType, EquipmentModel.Layer layer); diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java index 3c683bad..50a8e4f9 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourTextureResolver.java @@ -1,10 +1,8 @@ package com.minelittlepony.client.model.armour; import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.CustomModelDataComponent; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.item.*; -import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceReloader; import net.minecraft.util.Identifier; @@ -38,14 +36,7 @@ public class ArmourTextureResolver implements ArmourTextureLookup, IdentifiableR private final LoadingCache layerCache = CacheBuilder.newBuilder() .expireAfterAccess(30, TimeUnit.SECONDS) - .build(CacheLoader.from(parameters -> { - return Stream.of(ArmourTexture.legacy(parameters.textureId())).flatMap(i -> { - if (parameters.customModelId() != 0) { - return Stream.of(ArmourTexture.legacy(i.texture().withPath(p -> p.replace(".png", parameters.customModelId() + ".png"))), i); - } - return Stream.of(i); - }).flatMap(this::performLookup).findFirst().orElse(ArmourTexture.UNKNOWN); - })); + .build(CacheLoader.from(parameters -> Stream.of(ArmourTexture.legacy(parameters.textureId())).flatMap(this::performLookup).findFirst().orElse(ArmourTexture.UNKNOWN))); private Stream performLookup(ArmourTexture id) { List options = Stream.of(id).flatMap(ArmourTexture::ponify).toList(); @@ -78,14 +69,10 @@ public class ArmourTextureResolver implements ArmourTextureLookup, IdentifiableR @Override public ArmourTexture getTexture(ItemStack stack, EquipmentModel.LayerType layerType, EquipmentModel.Layer layer) { layerCache.invalidateAll(); - return layerCache.getUnchecked(new ArmourParameters(layer, layerType, getCustom(stack))); + return layerCache.getUnchecked(new ArmourParameters(layer, layerType)); } - private int getCustom(ItemStack stack) { - return stack.getOrDefault(DataComponentTypes.CUSTOM_MODEL_DATA, CustomModelDataComponent.DEFAULT).value(); - } - - private record ArmourParameters(EquipmentModel.Layer layer, EquipmentModel.LayerType layerType, int customModelId) { + private record ArmourParameters(EquipmentModel.Layer layer, EquipmentModel.LayerType layerType) { public Identifier textureId() { return layer.getFullTextureId(layerType); } diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java index dda97bd9..55c6f1c2 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourVariant.java @@ -1,6 +1,6 @@ package com.minelittlepony.client.model.armour; -import net.minecraft.item.equipment.EquipmentModel; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import com.minelittlepony.client.model.AbstractPonyModel; import com.minelittlepony.client.model.ModelType; diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java index 45fcec0d..31dbb47e 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java @@ -2,16 +2,16 @@ package com.minelittlepony.client.model.armour; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; -import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; -import net.minecraft.client.render.entity.equipment.EquipmentRenderer; +import net.minecraft.client.render.entity.equipment.*; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.DyedColorComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentModel; +import net.minecraft.item.equipment.EquipmentAsset; import net.minecraft.item.equipment.trim.ArmorTrim; +import net.minecraft.registry.RegistryKey; import net.minecraft.registry.tag.ItemTags; import net.minecraft.util.Colors; import net.minecraft.util.Identifier; @@ -41,7 +41,7 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { public > void render( EquipmentSlot equipmentSlot, EquipmentModel.LayerType layerType, - Identifier modelId, + RegistryKey assetId, S entity, Models models, ItemStack stack, @@ -49,13 +49,13 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { VertexConsumerProvider vertexConsumers, int light ) { - render(equipmentSlot, layerType, modelId, entity, models, stack, matrices, vertexConsumers, light, null); + render(equipmentSlot, layerType, assetId, entity, models, stack, matrices, vertexConsumers, light, null); } public > void render( EquipmentSlot equipmentSlot, EquipmentModel.LayerType layerType, - Identifier modelId, + RegistryKey assetId, S entity, Models models, ItemStack stack, @@ -64,7 +64,7 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { int light, @Nullable Identifier texture ) { - List layers = modelLoader.get(modelId).getLayers(layerType); + List layers = modelLoader.get(assetId).getLayers(layerType); if (!layers.isEmpty()) { ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); int defaultColor = stack.isIn(ItemTags.DYEABLE) ? DyedColorComponent.getColor(stack, 0) : 0; @@ -103,7 +103,7 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { @Nullable ArmorTrim armorTrim = stack.get(DataComponentTypes.TRIM); @Nullable - VertexConsumer trimConsumer = armorTrim != null && plugin.getTrimAlpha(equipmentSlot, armorTrim, layerType) > 0 ? plugin.getTrimConsumer(equipmentSlot, vertices, armorTrim, layerType, modelId) : null; + VertexConsumer trimConsumer = armorTrim != null && plugin.getTrimAlpha(equipmentSlot, armorTrim, layerType) > 0 ? plugin.getTrimConsumer(equipmentSlot, vertices, armorTrim, layerType, assetId) : null; if (trimConsumer != null) { for (EntityModel model : drawnModels) { model.render(matrices, trimConsumer, light, OverlayTexture.DEFAULT_UV); diff --git a/src/main/java/com/minelittlepony/client/model/entity/BreezieModel.java b/src/main/java/com/minelittlepony/client/model/entity/BreezieModel.java index ae96989a..49ec3c2b 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/BreezieModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/BreezieModel.java @@ -51,11 +51,8 @@ public class BreezieModel extends BipedEntityModel { rotateLegRiding(rightLeg, 1); } - ArmPose left = getArmPose(state, Arm.LEFT); - ArmPose right = getArmPose(state, Arm.RIGHT); - - rotateArm(leftArm, left, 1); - rotateArm(rightArm, right, 1); + rotateArm(leftArm, state.leftArmPose, 1); + rotateArm(rightArm, state.rightArmPose, 1); if (state.handSwingProgress > 0) { swingArms(state, state.preferredArm); @@ -80,9 +77,9 @@ public class BreezieModel extends BipedEntityModel { rightWing.yaw = -rotX * 10; rightWing.pitch = rotZ; - if (right == ArmPose.BOW_AND_ARROW) { + if (state.rightArmPose == ArmPose.BOW_AND_ARROW) { raiseArm(rightArm, leftArm, -1); - } else if (left == ArmPose.BOW_AND_ARROW) { + } else if (state.leftArmPose == ArmPose.BOW_AND_ARROW) { raiseArm(leftArm, rightArm, 1); } } diff --git a/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java b/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java index 23afc413..6dff399b 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java @@ -4,15 +4,15 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.util.math.MatrixStack; import com.minelittlepony.api.model.BodyPart; +import com.minelittlepony.client.model.entity.race.AlicornModel; import com.minelittlepony.client.render.entity.EnderStallionRenderer; -public class EnderStallionModel extends SkeleponyModel { - +public class EnderStallionModel extends AlicornModel { private final ModelPart leftHorn; private final ModelPart rightHorn; public EnderStallionModel(ModelPart tree) { - super(tree); + super(tree, false); leftHorn = tree.getChild("left_horn"); rightHorn = tree.getChild("right_horn"); } diff --git a/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java index 54247793..ad3e1bbc 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/PiglinPonyModel.java @@ -1,9 +1,7 @@ package com.minelittlepony.client.model.entity; import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.entity.mob.PiglinActivity; -import net.minecraft.util.Arm; import net.minecraft.util.math.MathHelper; import com.minelittlepony.client.render.entity.PonyPiglinRenderer; @@ -19,25 +17,6 @@ public class PiglinPonyModel extends ZomponyModel { rightFlap = tree.getChild("right_flap"); } - @Override - public ArmPose getArmPose(PlayerEntityRenderState p, Arm arm) { - if (p instanceof PonyPiglinRenderer.State state) { - return switch (arm) { - case LEFT -> switch (state.activity) { - case CROSSBOW_HOLD -> ArmPose.CROSSBOW_HOLD; - case CROSSBOW_CHARGE -> ArmPose.CROSSBOW_CHARGE; - default -> ArmPose.EMPTY; - }; - case RIGHT -> switch (state.activity) { - case ADMIRING_ITEM -> ArmPose.ITEM; - default -> ArmPose.EMPTY; - }; - }; - } - - return super.getArmPose(p, arm); - } - @Override public void setModelAngles(PonyPiglinRenderer.State state) { super.setModelAngles(state); diff --git a/src/main/java/com/minelittlepony/client/model/entity/PillagerPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/PillagerPonyModel.java deleted file mode 100644 index 06c2b7d9..00000000 --- a/src/main/java/com/minelittlepony/client/model/entity/PillagerPonyModel.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.minelittlepony.client.model.entity; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.entity.mob.IllagerEntity; -import net.minecraft.util.Arm; - -import com.minelittlepony.client.model.entity.race.ChangelingModel; -import com.minelittlepony.client.render.entity.npc.IllagerPonyRenderer; - -public class PillagerPonyModel extends ChangelingModel { - public PillagerPonyModel(ModelPart tree) { - super(tree, false); - } - - @Override - public BipedEntityModel.ArmPose getArmPose(PlayerEntityRenderState state, Arm arm) { - ArmPose holdingPose = getHoldingPose(((IllagerPonyRenderer.State)state).state); - - if (holdingPose != ArmPose.EMPTY) { - boolean isMain = state.mainArm == Arm.RIGHT; - - return isMain ? holdingPose : ArmPose.EMPTY; - } - - return super.getArmPose(state, arm); - } - - static ArmPose getHoldingPose(IllagerEntity.State state) { - switch (state) { - case BOW_AND_ARROW: return ArmPose.BOW_AND_ARROW; - case CROSSBOW_CHARGE: return ArmPose.CROSSBOW_CHARGE; - case CROSSBOW_HOLD: return ArmPose.CROSSBOW_HOLD; - default: return ArmPose.EMPTY; - } - } -} diff --git a/src/main/java/com/minelittlepony/client/model/entity/SkeleponyModel.java b/src/main/java/com/minelittlepony/client/model/entity/SkeleponyModel.java deleted file mode 100644 index 6f7898b9..00000000 --- a/src/main/java/com/minelittlepony/client/model/entity/SkeleponyModel.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.minelittlepony.client.model.entity; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.item.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Arm; - -import com.minelittlepony.client.model.entity.race.AlicornModel; -import com.minelittlepony.client.render.entity.SkeleponyRenderer; - -public class SkeleponyModel extends AlicornModel { - public SkeleponyModel(ModelPart tree) { - super(tree, false); - } - - @SuppressWarnings("unchecked") - @Override - public BipedEntityModel.ArmPose getArmPose(PlayerEntityRenderState state, Arm arm) { - if (arm == state.mainArm) { - ItemStack mainHand = state.getMainHandStack(); - if (!mainHand.isEmpty()) { - return mainHand.getItem() == Items.BOW && ((T)state).isAttacking ? ArmPose.BOW_AND_ARROW : ArmPose.ITEM; - } - } - - return super.getArmPose(state, arm); - } -} diff --git a/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java index a7a7e6cc..4a3623b6 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java @@ -26,7 +26,7 @@ public class WitchPonyModel extends EarthPonyModel { snout.rotate(0, 0, 0); } - if (!entity.getMainHandStack().isEmpty()) { + if (!entity.getMainHandItemState().isEmpty()) { float rot = (float)(Math.tan(entity.age / 7) + Math.sin(entity.age / 3)); if (rot > 1) rot = 1; if (rot < -1) rot = -1; diff --git a/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java b/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java index e6d063b5..3e4bb730 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/ZomponyModel.java @@ -5,6 +5,7 @@ import com.minelittlepony.client.model.entity.race.AlicornModel; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.model.ModelPart; +import net.minecraft.util.Arm; public class ZomponyModel extends AlicornModel { public ZomponyModel(ModelPart tree) { @@ -20,6 +21,6 @@ public class ZomponyModel extends AlicornModel { } protected boolean shouldLiftBothArms(T state) { - return getArmPose(state, state.mainArm) == ArmPose.EMPTY; + return (state.mainArm == Arm.LEFT ? state.leftArmPose : state.rightArmPose) == ArmPose.EMPTY; } } diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java index 1994d4a6..672dd6c3 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java @@ -12,7 +12,6 @@ import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.consume.UseAction; -import net.minecraft.registry.Registries; import net.minecraft.util.*; /** @@ -45,8 +44,7 @@ public class UnicornModel extends EarthPonyModel { } public boolean isCasting(T state) { - return state instanceof PlayerEntityRenderState s - && (getArmPose(s, Arm.LEFT) != ArmPose.EMPTY || getArmPose(s, Arm.RIGHT) != ArmPose.EMPTY); + return state instanceof PlayerEntityRenderState && (state.leftArmPose != ArmPose.EMPTY || state.rightArmPose != ArmPose.EMPTY); } @Override @@ -75,7 +73,7 @@ public class UnicornModel extends EarthPonyModel { @SuppressWarnings("deprecation") @Override public ModelPart getArm(Arm side) { - if (currentState != null && currentState.hasMagicGlow() && getArmPose(currentState, side) != ArmPose.EMPTY && PonyConfig.getInstance().tpsmagic.get()) { + if (currentState != null && currentState.hasMagicGlow() && (side == Arm.LEFT ? currentState.leftArmPose : currentState.rightArmPose) != ArmPose.EMPTY && PonyConfig.getInstance().tpsmagic.get()) { return side == Arm.LEFT ? unicornArmLeft : unicornArmRight; } return super.getArm(side); @@ -91,7 +89,7 @@ public class UnicornModel extends EarthPonyModel { float left = arm == Arm.LEFT ? -1 : 1; - UseAction action = state.attributes.heldStack.getUseAction(); + UseAction action = state.getHeldItem(arm).action; if (action == UseAction.SPYGLASS && state.attributes.itemUseTime > 0) { return; } @@ -100,7 +98,7 @@ public class UnicornModel extends EarthPonyModel { boolean shouldAimItem = (action == UseAction.BOW) && state.attributes.itemUseTime > 0 - || PonyConfig.getInstance().forwardHoldingItems.get().contains(Registries.ITEM.getId(state.attributes.heldStack.getItem())); + || state.getHeldItem(arm).forwardFacing; if (shouldAimItem) { Arm main = state.attributes.mainArm; diff --git a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java index 30af99c3..2c7ba52c 100644 --- a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java +++ b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java @@ -21,11 +21,16 @@ import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.*; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; +import net.minecraft.util.Arm; import net.minecraft.util.Util; import net.minecraft.util.math.Box; import net.minecraft.util.math.Vec3d; @@ -87,11 +92,30 @@ public class EquineRenderManager< return DebugBoundingBoxRenderer.applyScale(scale, box); } - public void updateState(T entity, S state, ModelAttributes.Mode mode) { + public void updateState(T entity, S state, ModelAttributes.Mode mode, ItemModelManager modelManager) { Pony pony = context.getEntityPony(entity); models = modelsLookup.apply(pony.race()); context.setModel(models.body()); state.updateState(entity, models.body(), pony, mode); + if (PonyConfig.getInstance().tpsmagic.get() && state.hasMagicGlow()) { + modelManager.updateForLivingEntity( + state.glintlessRightHandItemState, getWithoutGlint(entity.getStackInArm(Arm.RIGHT)), ModelTransformationMode.THIRD_PERSON_RIGHT_HAND, false, entity + ); + modelManager.updateForLivingEntity( + state.glintlessLeftHandItemState, getWithoutGlint(entity.getStackInArm(Arm.LEFT)), ModelTransformationMode.THIRD_PERSON_LEFT_HAND, true, entity + ); + } else { + state.glintlessRightHandItemState.clear(); + state.glintlessLeftHandItemState.clear(); + } + } + + private static ItemStack getWithoutGlint(ItemStack stack) { + if (!stack.isEmpty()) { + stack = stack.copy(); + stack.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, false); + } + return stack; } public void setupTransforms(S state, MatrixStack stack, float animationProgress, float bodyYaw) { diff --git a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java index 76a7da8f..e0960cc9 100644 --- a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java @@ -12,25 +12,26 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.LivingEntity; import net.minecraft.item.*; import net.minecraft.item.consume.UseAction; import net.minecraft.registry.Registries; -import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RotationAxis; import net.minecraft.world.World; public class LevitatingItemRenderer { + @SuppressWarnings("deprecation") public static VertexConsumerProvider getProvider(Pony pony, VertexConsumerProvider provider) { final int color = pony.metadata().glowColor(); return layer -> { if (layer.getVertexFormat() != VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL) { return provider.getBuffer(layer); } - return provider.getBuffer(MagicGlow.getColoured(RenderLayerUtil.getTexture(layer).orElse(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE), color)); + return provider.getBuffer(MagicGlow.getColoured(RenderLayerUtil.getTexture(layer).orElse(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE), color)); }; } diff --git a/src/main/java/com/minelittlepony/client/render/MagicGlow.java b/src/main/java/com/minelittlepony/client/render/MagicGlow.java index e5ab9b62..eb3890ab 100644 --- a/src/main/java/com/minelittlepony/client/render/MagicGlow.java +++ b/src/main/java/com/minelittlepony/client/render/MagicGlow.java @@ -6,10 +6,10 @@ import net.minecraft.client.render.RenderPhase; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; import net.minecraft.util.*; +import net.minecraft.util.math.ColorHelper; import com.mojang.blaze3d.systems.RenderSystem; import com.google.common.base.Suppliers; -import com.minelittlepony.common.util.Color; import java.util.function.BiFunction; import java.util.function.Supplier; @@ -62,9 +62,9 @@ public abstract class MagicGlow extends RenderPhase { public Colored(Identifier texture, int color) { super(texture, TriState.FALSE, false); - this.red = Color.r(color); - this.green = Color.g(color); - this.blue = Color.b(color); + this.red = ColorHelper.getRedFloat(color); + this.green = ColorHelper.getGreenFloat(color); + this.blue = ColorHelper.getBlueFloat(color); this.alpha = 0.8F; } diff --git a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java index 823cbd7d..7936ecfe 100644 --- a/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/blockentity/skull/PonySkullRenderer.java @@ -18,6 +18,7 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.SkullBlockEntityModel; import net.minecraft.client.render.block.entity.SkullBlockEntityRenderer; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.state.LivingEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; @@ -25,14 +26,14 @@ import net.minecraft.component.type.ProfileComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentModel.LayerType; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.Direction; -import java.util.HashMap; import java.util.Map; +import java.util.function.Function; + import org.jetbrains.annotations.Nullable; /** @@ -41,8 +42,7 @@ import org.jetbrains.annotations.Nullable; public class PonySkullRenderer { public static final PonySkullRenderer INSTANCE = new PonySkullRenderer(); - private Map skulls = Map.of(); - private Map headModels = Map.of(); + private Cache cache = new Cache(); private ISkull selectedSkull; private Identifier selectedSkin; @@ -51,21 +51,30 @@ public class PonySkullRenderer { boolean isPony; public void reload() { - skulls = Util.make(new HashMap<>(), skullMap -> { - skullMap.put(SkullBlock.Type.SKELETON, new MobSkull<>(SkeleponyRenderer.SKELETON, MobRenderers.SKELETON, ModelType.SKELETON, SkeleponyRenderer.State::new)); - skullMap.put(SkullBlock.Type.WITHER_SKELETON, new MobSkull<>(SkeleponyRenderer.WITHER, MobRenderers.SKELETON, ModelType.SKELETON, SkeleponyRenderer.State::new)); - skullMap.put(SkullBlock.Type.ZOMBIE, new MobSkull<>(ZomponyRenderer.ZOMBIE, MobRenderers.ZOMBIE, ModelType.ZOMBIE, PonyRenderState::new)); - skullMap.put(SkullBlock.Type.PIGLIN, new MobSkull<>(PonyPiglinRenderer.PIGLIN, MobRenderers.PIGLIN, ModelType.PIGLIN, PonyPiglinRenderer.State::new)); - skullMap.put(SkullBlock.Type.PLAYER, new PlayerPonySkull()); - }); - headModels = SkullBlockEntityRenderer.getModels(MinecraftClient.getInstance().getEntityModelLoader()); + cache = new Cache(); + } + + record Cache(Function skulls, Function headModels) { + public Cache() { + this( + Util.memoize(type -> type instanceof SkullBlock.Type t ? switch (t) { + case SKELETON -> new MobSkull<>(SkeleponyRenderer.SKELETON, MobRenderers.SKELETON, ModelType.SKELETON, SkeleponyRenderer.State::new); + case WITHER_SKELETON -> new MobSkull<>(SkeleponyRenderer.WITHER, MobRenderers.SKELETON, ModelType.SKELETON, SkeleponyRenderer.State::new); + case ZOMBIE -> new MobSkull<>(ZomponyRenderer.ZOMBIE, MobRenderers.ZOMBIE, ModelType.ZOMBIE, PonyRenderState::new); + case PIGLIN -> new MobSkull<>(PonyPiglinRenderer.PIGLIN, MobRenderers.PIGLIN, ModelType.PIGLIN, PonyPiglinRenderer.State::new); + case PLAYER -> new PlayerPonySkull(); + default -> null; + } : null), + Util.memoize(type -> SkullBlockEntityRenderer.getModels(MinecraftClient.getInstance().getLoadedEntityModels(), type)) + ); + } } public void renderSkull(MatrixStack matrices, VertexConsumerProvider provider, ItemStack stack, LivingEntityRenderState entity, float tickDelta, int light, boolean isPony) { isBeingWorn = true; this.isPony = isPony; SkullType type = ((AbstractSkullBlock) ((BlockItem) stack.getItem()).getBlock()).getSkullType(); - SkullBlockEntityModel skullBlockEntityModel = headModels.get(type); + SkullBlockEntityModel skullBlockEntityModel = cache.headModels().apply(type); RenderLayer renderLayer = SkullBlockEntityRenderer.getRenderLayer(type, stack.get(DataComponentTypes.PROFILE)); SkullBlockEntityRenderer.renderSkull(null, 180, entity.headItemAnimationProgress, matrices, provider, light, skullBlockEntityModel, renderLayer); isBeingWorn = false; @@ -76,7 +85,7 @@ public class PonySkullRenderer { selectedSkull = null; selectedSkin = null; - ISkull skull = skulls.get(skullType); + ISkull skull = cache.skulls().apply(skullType); if (skull == null || !skull.canRender(PonyConfig.getInstance())) { return null; @@ -113,7 +122,7 @@ public class PonySkullRenderer { VertexConsumer vertices = renderContext.getBuffer(layer); selectedSkull.setAngles(yaw, animationProgress); - selectedSkull.render(stack, vertices, light, OverlayTexture.DEFAULT_UV, ColorHelper.fromFloats(ArmourRendererPlugin.INSTANCE.get().getArmourAlpha(EquipmentSlot.HEAD, LayerType.HUMANOID), 1, 1, 1)); + selectedSkull.render(stack, vertices, light, OverlayTexture.DEFAULT_UV, ColorHelper.fromFloats(ArmourRendererPlugin.INSTANCE.get().getArmourAlpha(EquipmentSlot.HEAD, EquipmentModel.LayerType.HUMANOID), 1, 1, 1)); stack.pop(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java index 77abb19c..fcd3573e 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java @@ -15,6 +15,7 @@ import com.minelittlepony.mson.api.ModelKey; import java.util.*; import java.util.function.*; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.MobEntityRenderer; @@ -44,6 +45,8 @@ public abstract class AbstractPonyRenderer< private final ResourceManager resources; + protected final ItemModelManager itemModelManager; + private final float scale; public AbstractPonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture, float scale) { @@ -52,13 +55,14 @@ public abstract class AbstractPonyRenderer< this.texture = texture; this.scale = scale; resources = context.getResourceManager(); + itemModelManager = context.getItemModelManager(); addFeatures(context); } @Override public void updateRenderState(T entity, S state, float tickDelta) { super.updateRenderState(entity, state, tickDelta); - manager.updateState(entity, state, ModelAttributes.Mode.THIRD_PERSON); + manager.updateState(entity, state, ModelAttributes.Mode.THIRD_PERSON, itemModelManager); } protected void addFeatures(EntityRendererFactory.Context context) { @@ -78,11 +82,11 @@ public abstract class AbstractPonyRenderer< } protected SkullFeature createSkullFeature(EntityRendererFactory.Context context) { - return new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer(), HeadFeatureRenderer.HeadTransformation.DEFAULT, true); + return new SkullFeature<>(this, context.getItemModelManager(), HeadFeatureRenderer.HeadTransformation.DEFAULT, true); } protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { - return new HeldItemFeature<>(this, context.getItemRenderer()); + return new HeldItemFeature<>(this); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/AllayRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/AllayRenderer.java index 3253b41a..4b54b8f7 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/AllayRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/AllayRenderer.java @@ -23,7 +23,7 @@ public class AllayRenderer extends MobEntityRenderer(this, context.getItemRenderer())); + addFeature(new HeldItemFeatureRenderer(this)); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java index 3b63258c..a34155b6 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/EnderStallionRenderer.java @@ -11,11 +11,13 @@ import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; import com.minelittlepony.client.render.entity.feature.GlowingEyesFeature.IGlowingRenderer; import net.minecraft.block.BlockState; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.feature.StuckArrowsFeatureRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.mob.EndermanEntity; +import net.minecraft.item.ModelTransformationMode; import net.minecraft.util.Arm; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; @@ -29,9 +31,11 @@ public class EnderStallionRenderer extends PonyRenderer((PonyRenderer)this, context)); addPonyFeature(new GlowingEyesFeature(this)); + } @Override @@ -58,10 +63,13 @@ public class EnderStallionRenderer extends PonyRenderer createHeldItemFeature(EntityRendererFactory.Context context) { - return new HeldItemFeature(this, context.getItemRenderer()); + return new HeldItemFeature(this); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java index 703bb846..6a76a552 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java @@ -15,6 +15,7 @@ import java.util.*; import com.minelittlepony.client.render.EquineRenderManager; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.EntityRendererFactory; @@ -37,10 +38,12 @@ public class PlayerPonyRenderer protected final EquineRenderManager> manager; private ModelAttributes.Mode mode = ModelAttributes.Mode.THIRD_PERSON; + protected final ItemModelManager itemModelManager; @SuppressWarnings({"unchecked", "rawtypes"}) public PlayerPonyRenderer(EntityRendererFactory.Context context, boolean slim) { super(context, slim); + itemModelManager = context.getItemModelManager(); manager = new EquineRenderManager<>(this, super::setupTransforms, race -> ModelType.getPlayerModel(race).create(slim)); // remove vanilla features (keep modded ones) @@ -54,10 +57,10 @@ public class PlayerPonyRenderer || feature instanceof ShoulderParrotFeatureRenderer; }); addPonyFeature(new ArmourFeature<>(this, context.getEquipmentModelLoader())); - addPonyFeature(new HeldItemFeature<>(this, context.getItemRenderer())); + addPonyFeature(new HeldItemFeature<>(this)); addPonyFeature(new DJPon3Feature<>(this)); - addFeature(new CapeFeature(this, context.getModelLoader(), context.getEquipmentModelLoader())); - addPonyFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer(), HeadFeatureRenderer.HeadTransformation.DEFAULT, true)); + addFeature(new CapeFeature(this, context.getEntityModels(), context.getEquipmentModelLoader())); + addPonyFeature(new SkullFeature<>(this, context.getItemModelManager(), HeadFeatureRenderer.HeadTransformation.DEFAULT, true)); addPonyFeature(new ElytraFeature(this, context.getEquipmentRenderer())); addPonyFeature(new PassengerFeature<>(this, context)); addPonyFeature(new GearFeature<>(this)); @@ -86,7 +89,7 @@ public class PlayerPonyRenderer @Override public void updateRenderState(AbstractClientPlayerEntity entity, PlayerEntityRenderState state, float tickDelta) { super.updateRenderState(entity, state, tickDelta); - manager.updateState(entity, (PlayerPonyRenderState)state, mode); + manager.updateState(entity, (PlayerPonyRenderState)state, mode, itemModelManager); } public final PlayerPonyRenderState getAndUpdateRenderState(AbstractClientPlayerEntity entity, float tickDelta, ModelAttributes.Mode mode) { @@ -120,7 +123,7 @@ public class PlayerPonyRenderer matrices.push(); if (state.isInPose(EntityPose.SLEEPING)) { if (state.sleepingDirection != null && ((PlayerPonyRenderState)state).sleepingInBed) { - double bedRad = Math.toRadians(state.sleepingDirection.asRotation()); + double bedRad = Math.toRadians(state.sleepingDirection.getPositiveHorizontalDegrees()); matrices.translate(Math.cos(bedRad), 0, -Math.sin(bedRad)); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java index 26d1f6a2..b016d74e 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyPiglinRenderer.java @@ -1,7 +1,9 @@ package com.minelittlepony.client.render.entity; import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.model.BipedEntityModel.ArmPose; import net.minecraft.entity.mob.*; +import net.minecraft.util.Arm; import net.minecraft.util.Identifier; import com.minelittlepony.client.MineLittlePony; @@ -36,6 +38,25 @@ public class PonyPiglinRenderer extends PonyRenderer switch (piglin.getActivity()) { + case CROSSBOW_HOLD -> ArmPose.CROSSBOW_HOLD; + case CROSSBOW_CHARGE -> ArmPose.CROSSBOW_CHARGE; + default -> ArmPose.EMPTY; + }; + case RIGHT -> switch (piglin.getActivity()) { + case ADMIRING_ITEM -> ArmPose.ITEM; + default -> ArmPose.EMPTY; + }; + }; + } + + return initial; + } + public void updateRenderState(HostileEntity entity, State state, float tickDelta) { super.updateRenderState(entity, state, tickDelta); state.zombified = entity instanceof ZombifiedPiglinEntity; diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java index 2eb754ba..889bba3b 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java @@ -7,7 +7,9 @@ import com.minelittlepony.mson.api.ModelKey; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.feature.StuckArrowsFeatureRenderer; +import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.entity.mob.MobEntity; +import net.minecraft.util.Arm; public abstract class PonyRenderer< T extends MobEntity, @@ -30,4 +32,14 @@ public abstract class PonyRenderer< super.addFeatures(context); addFeature(new StuckArrowsFeatureRenderer(this, context)); } + + public void updateRenderState(T entity, S state, float tickDelta) { + super.updateRenderState(entity, state, tickDelta); + state.leftArmPose = getArmPose(state.leftArmPose, entity, Arm.LEFT); + state.rightArmPose = getArmPose(state.rightArmPose, entity, Arm.RIGHT); + } + + public BipedEntityModel.ArmPose getArmPose(BipedEntityModel.ArmPose initial, T entity, Arm arm) { + return initial; + } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java index 30c8e534..1a4cefe1 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java @@ -1,5 +1,6 @@ package com.minelittlepony.client.render.entity; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.*; @@ -32,6 +33,7 @@ public class PonyStandRenderer extends LivingEntityRenderer Optional.of(PonyData.NULL)); private final PonifiedContext context = new PonifiedContext(); + private final ItemModelManager itemModelManager; public static boolean isPonyStand(Entity entity) { return entity.hasCustomName() && "Ponita".equals(entity.getCustomName().getString()); @@ -39,10 +41,11 @@ public class PonyStandRenderer extends LivingEntityRenderer(this.context, context.getEquipmentModelLoader()))); - addFeature(new PonifiedFeature(this, new HeldItemFeature<>(this.context, context.getItemRenderer()))); + addFeature(new PonifiedFeature(this, new HeldItemFeature<>(this.context))); addFeature(new PonifiedFeature(this, new ElytraFeature<>(this.context, context.getEquipmentRenderer()))); - addFeature(new PonifiedFeature(this, new SkullFeature<>(this.context, context.getModelLoader(), context.getItemRenderer(), HeadFeatureRenderer.HeadTransformation.DEFAULT, false))); + addFeature(new PonifiedFeature(this, new SkullFeature<>(this.context, context.getItemModelManager(), HeadFeatureRenderer.HeadTransformation.DEFAULT, false))); } @Override @@ -57,7 +60,7 @@ public class PonyStandRenderer extends LivingEntityRenderer extends PonyRenderer> { +public class SkeleponyRenderer extends PonyRenderer> { public static final Identifier SKELETON = MineLittlePony.id("textures/entity/skeleton/skeleton_pony.png"); public static final Identifier WITHER = MineLittlePony.id("textures/entity/skeleton/skeleton_wither_pony.png"); public static final Identifier STRAY = MineLittlePony.id("textures/entity/skeleton/stray_pony.png"); @@ -40,6 +43,18 @@ public class SkeleponyRenderer skeleton(EntityRendererFactory.Context context) { return new SkeleponyRenderer<>(context, SKELETON, 1); } @@ -68,12 +83,12 @@ public class SkeleponyRenderer extends FeatureRenderer> { + > extends FeatureRenderer> { public static final Identifier MUSHROOMS = MineLittlePony.id("textures/entity/skeleton/bogged_pony_mushrooms.png"); private final SinglePartModel model = ModelType.BOGGED_MUSHROOMS.createModel(); - public BoggedMushroomsFeature(LivingEntityRenderer> renderer) { + public BoggedMushroomsFeature(LivingEntityRenderer> renderer) { super(renderer); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java index aef9a312..c29c90a4 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java @@ -7,6 +7,7 @@ import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.*; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; @@ -14,7 +15,6 @@ import net.minecraft.component.type.EquippableComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.item.*; -import net.minecraft.item.equipment.EquipmentModel; import org.jetbrains.annotations.Nullable; @@ -61,7 +61,7 @@ public class ArmourFeature< EquippableComponent equippableComponent = stack.get(DataComponentTypes.EQUIPPABLE); if (hasModel(equippableComponent, armorSlot)) { - equipmentRenderer.render(armorSlot, layerType, equippableComponent.model().orElseThrow(), entity, models, stack, matrices, vertices, light); + equipmentRenderer.render(armorSlot, layerType, equippableComponent.assetId().orElseThrow(), entity, models, stack, matrices, vertices, light); } } @@ -69,6 +69,6 @@ public class ArmourFeature< } private static boolean hasModel(@Nullable EquippableComponent component, EquipmentSlot slot) { - return component != null && component.model().isPresent() && component.slot() == slot; + return component != null && component.assetId().isPresent() && component.slot() == slot; } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java index 65befb0e..c5363e5d 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java @@ -9,13 +9,13 @@ import com.minelittlepony.common.util.render.RenderLayerUtil; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; import net.minecraft.client.render.entity.feature.CapeFeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModelLoader; +import net.minecraft.client.render.entity.model.LoadedEntityModels; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Identifier; import net.minecraft.util.math.RotationAxis; @@ -23,7 +23,7 @@ public class CapeFeature extends CapeFeatureRenderer { private final PonyRenderContext> context; - public CapeFeature(PonyRenderContext> context, EntityModelLoader modelLoader, EquipmentModelLoader equipmentModelLoader) { + public CapeFeature(PonyRenderContext> context, LoadedEntityModels modelLoader, EquipmentModelLoader equipmentModelLoader) { super(context.upcast(), modelLoader, equipmentModelLoader); this.context = context; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java index 522abd3f..0deb0c53 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java @@ -7,6 +7,7 @@ import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.equipment.EquipmentRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; @@ -17,7 +18,8 @@ import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.EquippableComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentModel; +import net.minecraft.item.equipment.EquipmentAsset; +import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; import net.minecraft.util.math.RotationAxis; @@ -45,8 +47,8 @@ public class ElytraFeature< for (ItemStack stack : plugin.getArmorStacks(state, EquipmentSlot.CHEST, EquipmentModel.LayerType.WINGS, ArmourRendererPlugin.ArmourType.ELYTRA)) { EquippableComponent equippable = stack.get(DataComponentTypes.EQUIPPABLE); - if (equippable != null && !equippable.model().isEmpty()) { - Identifier equipmentModel = equippable.model().get(); + if (equippable != null && !equippable.assetId().isEmpty()) { + RegistryKey equipmentModel = equippable.assetId().get(); float alpha = plugin.getElytraAlpha(stack, model, state); if (alpha <= 0) { diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java index 841f68d5..1250751f 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java @@ -4,11 +4,11 @@ import it.unimi.dsi.fastutil.objects.Object2FloatLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2FloatMap; import net.minecraft.block.SkullBlock; import net.minecraft.client.render.*; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.item.*; -import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Colors; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.random.Random; diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java index 7e9dbd9a..7230111d 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java @@ -1,6 +1,5 @@ package com.minelittlepony.client.render.entity.feature; -import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.model.*; import com.minelittlepony.client.model.AbstractPonyModel; import com.minelittlepony.client.model.ClientPonyModel; @@ -11,18 +10,12 @@ import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.feature.PlayerHeldItemFeatureRenderer; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.item.ItemRenderState; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ModelTransformationMode; import net.minecraft.item.consume.UseAction; import net.minecraft.util.Arm; import net.minecraft.util.math.MathHelper; -import org.jetbrains.annotations.Nullable; - public class HeldItemFeature< S extends PonyRenderState, M extends ClientPonyModel @@ -30,8 +23,8 @@ public class HeldItemFeature< private final PonyRenderContext context; - public HeldItemFeature(PonyRenderContext context, ItemRenderer renderer) { - super(context.upcast(), renderer); + public HeldItemFeature(PonyRenderContext context) { + super(context.upcast()); this.context = context; } @@ -43,57 +36,48 @@ public class HeldItemFeature< } public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { - if (!state.leftHandStack.isEmpty() || !state.rightHandStack.isEmpty()) { + if (!state.leftHandItemState.isEmpty() || !state.rightHandItemState.isEmpty()) { M model = context.getEquineManager().getModels().body(); matrices.push(); model.transform(state, BodyPart.LEGS, matrices); - - ModelAttributes attributes = ((PonyModel.AttributedHolder)state).getAttributes(); - - attributes.heldStack = state.rightHandStack; - renderItem(state, state.rightHandItemModel, state.rightHandStack, ModelTransformationMode.THIRD_PERSON_RIGHT_HAND, Arm.RIGHT, matrices, vertices, light); - attributes.heldStack = state.leftHandStack; - renderItem(state, state.leftHandItemModel, state.leftHandStack, ModelTransformationMode.THIRD_PERSON_LEFT_HAND, Arm.LEFT, matrices, vertices, light); - attributes.heldStack = ItemStack.EMPTY; + renderItem(state, state.rightHandItemState, state.glintlessRightHandItemState, Arm.RIGHT, matrices, vertices, light); + renderItem(state, state.leftHandItemState, state.glintlessLeftHandItemState, Arm.LEFT, matrices, vertices, light); matrices.pop(); } } @SuppressWarnings(value = {"unchecked"}) - protected void renderItem(S state, @Nullable BakedModel model, ItemStack item, ModelTransformationMode mode, Arm arm, MatrixStack matrices, VertexConsumerProvider vertices, int light) { - if (context.getEquineManager().getModels().body() instanceof AbstractPonyModel m) { - m.positionheldItem(state, arm, matrices); - } - renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light); - - if (PonyConfig.getInstance().tpsmagic.get() && state.hasMagicGlow()) { - vertices = LevitatingItemRenderer.getProvider(state.pony, vertices); - - if (item.hasGlint()) { - item = item.copy(); - item.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, false); + protected void renderItem(S state, ItemRenderState item, ItemRenderState glintLessItem, Arm arm, MatrixStack matrices, VertexConsumerProvider vertices, int light) { + if (!item.isEmpty()) { + if (context.getEquineManager().getModels().body() instanceof AbstractPonyModel m) { + m.positionheldItem(state, arm, matrices); } + renderItem((PlayerEntityRenderState)state, item, arm, matrices, vertices, light); - boolean noTransform = state.attributes.heldStack.getUseAction() == UseAction.SPYGLASS && state.attributes.itemUseTime > 0; + if (!glintLessItem.isEmpty()) { + vertices = LevitatingItemRenderer.getProvider(state.pony, vertices); - float driftStrength = 0.002F; - float xDrift = MathHelper.sin(state.age / 10F) * driftStrength; - float zDrift = MathHelper.cos((state.age + 20) / 10F) * driftStrength; + boolean noTransform = state.getHeldItem(arm).action == UseAction.SPYGLASS && state.attributes.itemUseTime > 0; - float scale = 1.1F + (MathHelper.sin(state.age / 20F) + 1) * driftStrength; + float driftStrength = 0.002F; + float xDrift = MathHelper.sin(state.age / 10F) * driftStrength; + float zDrift = MathHelper.cos((state.age + 20) / 10F) * driftStrength; + + float scale = 1.1F + (MathHelper.sin(state.age / 20F) + 1) * driftStrength; - matrices.scale(scale, scale, scale); - if (!noTransform) { - matrices.translate(0.045F + xDrift, 0.01F - 0.12F, 0.03F + zDrift); - } - renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light); - if (!noTransform) { matrices.scale(scale, scale, scale); - matrices.translate(0.1F, -0.1F, 0.1F); - matrices.translate(-0.03F - xDrift, -0.02F, -0.02F - zDrift); + if (!noTransform) { + matrices.translate(0.045F + xDrift, 0.01F - 0.12F, 0.03F + zDrift); + } + renderItem((PlayerEntityRenderState)state, glintLessItem, arm, matrices, vertices, light); + if (!noTransform) { + matrices.scale(scale, scale, scale); + matrices.translate(0.1F, -0.1F, 0.1F); + matrices.translate(-0.03F - xDrift, -0.02F, -0.02F - zDrift); + } + renderItem((PlayerEntityRenderState)state, glintLessItem, arm, matrices, vertices, light); } - renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light); } } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java index 99e3f2b5..71554798 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java @@ -8,32 +8,28 @@ import com.minelittlepony.client.render.blockentity.skull.PonySkullRenderer; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.block.AbstractSkullBlock; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.render.*; +import net.minecraft.client.render.entity.equipment.EquipmentModel; +import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer; import net.minecraft.client.render.entity.feature.HeadFeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModelLoader; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.EquippableComponent; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.*; -import net.minecraft.item.equipment.EquipmentModel; public class SkullFeature< S extends PonyRenderState, M extends ClientPonyModel > extends AbstractPonyFeature { - private final ItemRenderer itemRenderer; + protected final ItemModelManager itemModelResolver; private final HeadFeatureRenderer.HeadTransformation headTransformation; private final boolean scaleForChild; - public SkullFeature(PonyRenderContext context, EntityModelLoader entityModelLoader, ItemRenderer itemRenderer, - HeadFeatureRenderer.HeadTransformation headTransformation, boolean scaleForChild) { + public SkullFeature(PonyRenderContext context, ItemModelManager itemModelResolver, HeadFeatureRenderer.HeadTransformation headTransformation, boolean scaleForChild) { super(context); - this.itemRenderer = itemRenderer; + this.itemModelResolver = itemModelResolver; this.headTransformation = headTransformation; this.scaleForChild = scaleForChild; } @@ -44,15 +40,23 @@ public class SkullFeature< for (ItemStack stack : plugin.getArmorStacks(state, EquipmentSlot.HEAD, EquipmentModel.LayerType.HUMANOID, ArmourRendererPlugin.ArmourType.SKULL)) { - BakedModel headModel = state.equippedHeadItemModel; - - if (stack.isEmpty() || headModel == null) { + if (stack.isEmpty()) { continue; } - M model = getModelWrapper().body(); - Item item = stack.getItem(); - EquippableComponent equipable = stack.get(DataComponentTypes.EQUIPPABLE); + boolean isSkull = stack.getItem() instanceof BlockItem b && b.getBlock() instanceof AbstractSkullBlock; + + if (!isSkull) { + if (!ArmorFeatureRenderer.hasModel(stack, EquipmentSlot.HEAD)) { + itemModelResolver.update(state.headItemRenderState, stack, ModelTransformationMode.HEAD, false, null, null, 0); + } else { + state.headItemRenderState.clear(); + } + + if (state.headItemRenderState.isEmpty()) { + continue; + } + } matrices.push(); @@ -62,22 +66,23 @@ public class SkullFeature< matrices.translate(0, 1, 0); } + M model = getModelWrapper().body(); model.transform(state, BodyPart.HEAD, matrices); model.getHead().rotate(matrices); float f = 1.1F; matrices.scale(f, f, f); - if (item instanceof BlockItem b && b.getBlock() instanceof AbstractSkullBlock) { + if (isSkull) { float n = 1.1875F; matrices.scale(n, -n, -n); matrices.translate(0, -0.1F, 0.1F); matrices.translate(-0.5, 0, -0.5); PonySkullRenderer.INSTANCE.renderSkull(matrices, provider, stack, state, state.age, light, true); - } else if (equipable != null && equipable.slot() != EquipmentSlot.HEAD) { + } else if (!ArmorFeatureRenderer.hasModel(stack, EquipmentSlot.HEAD)) { matrices.translate(0, 0.1F, -0.1F); HeadFeatureRenderer.translate(matrices, headTransformation); - itemRenderer.renderItem(stack, ModelTransformationMode.HEAD, false, matrices, provider, light, OverlayTexture.DEFAULT_UV, headModel); + state.headItemRenderState.render(matrices, provider, light, OverlayTexture.DEFAULT_UV); } matrices.pop(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/IllagerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/IllagerPonyRenderer.java index e5eba545..804f6503 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/IllagerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/IllagerPonyRenderer.java @@ -6,6 +6,7 @@ import com.minelittlepony.api.pony.Pony; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.entity.race.AlicornModel; +import com.minelittlepony.client.model.entity.race.ChangelingModel; import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; import com.minelittlepony.client.render.entity.state.PonyRenderState; import com.minelittlepony.mson.api.ModelKey; @@ -15,10 +16,11 @@ import com.minelittlepony.client.render.entity.feature.HeldItemFeature; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.render.entity.model.BipedEntityModel.ArmPose; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.*; +import net.minecraft.util.Arm; import net.minecraft.util.Identifier; public class IllagerPonyRenderer< @@ -41,13 +43,35 @@ public class IllagerPonyRenderer< return (S)new State(); } - @Override - protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { - return new IllagerHeldItemFeature<>(this, context.getItemRenderer()); + static ArmPose getHoldingPose(IllagerEntity.State state) { + switch (state) { + case BOW_AND_ARROW: return ArmPose.BOW_AND_ARROW; + case CROSSBOW_CHARGE: return ArmPose.CROSSBOW_CHARGE; + case CROSSBOW_HOLD: return ArmPose.CROSSBOW_HOLD; + default: return ArmPose.EMPTY; + } } - public static IllagerPonyRenderer pillager(EntityRendererFactory.Context context) { - return new IllagerPonyRenderer<>(context, ModelType.PILLAGER, PILLAGER); + @Override + protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { + return new IllagerHeldItemFeature<>(this); + } + + public static IllagerPonyRenderer> pillager(EntityRendererFactory.Context context) { + return new IllagerPonyRenderer>(context, ModelType.PILLAGER, PILLAGER) { + @Override + public ArmPose getArmPose(ArmPose initial, PillagerEntity state, Arm arm) { + ArmPose holdingPose = getHoldingPose(state.getState()); + + if (holdingPose != ArmPose.EMPTY) { + boolean isMain = state.getMainArm() == Arm.RIGHT; + + return isMain ? holdingPose : ArmPose.EMPTY; + } + + return initial; + } + }; } public static IllagerPonyRenderer vindicator(EntityRendererFactory.Context context) { @@ -73,8 +97,8 @@ public class IllagerPonyRenderer< M extends AlicornModel > extends HeldItemFeature { - public IllagerHeldItemFeature(PonyRenderContext livingPony, ItemRenderer renderer) { - super(livingPony, renderer); + public IllagerHeldItemFeature(PonyRenderContext livingPony) { + super(livingPony); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java index 6cf69a56..4d9fc5df 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java @@ -3,6 +3,7 @@ package com.minelittlepony.client.render.entity.npc; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.model.BipedEntityModel.ArmPose; import net.minecraft.entity.mob.ZombieVillagerEntity; +import net.minecraft.util.Arm; import com.minelittlepony.api.model.*; import com.minelittlepony.client.VariatedTextureSupplier; @@ -39,7 +40,7 @@ public class ZomponyVillagerRenderer extends AbstractNpcRenderer model) { model.onSetModelAngles((m, state) -> { - if (m.getArmPose(state, state.mainArm) == ArmPose.EMPTY) { + if ((state.mainArm == Arm.LEFT ? state.leftArmPose : state.rightArmPose) == ArmPose.EMPTY) { MobPosingHelper.rotateUndeadArms(state, m, state.limbFrequency, state.age); } }); diff --git a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java index deca0579..ab87be69 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java +++ b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java @@ -1,14 +1,21 @@ package com.minelittlepony.client.render.entity.state; import net.minecraft.block.BedBlock; +import net.minecraft.client.item.ItemModelManager; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.render.item.ItemRenderState; import net.minecraft.entity.EntityPose; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.AbstractPiglinEntity; import net.minecraft.entity.mob.ZombifiedPiglinEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.consume.UseAction; +import net.minecraft.registry.Registries; +import net.minecraft.util.Arm; import net.minecraft.util.math.MathHelper; +import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.events.PonyModelPrepareCallback; import com.minelittlepony.api.model.ModelAttributes; import com.minelittlepony.api.model.PonyModel; @@ -33,6 +40,12 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode public Pony pony = Pony.getManager().getPony(DefaultPonySkinHelper.STEVE); public Race race = Race.HUMAN; + public final HeldItemRenderState leftHeldItem = new HeldItemRenderState(); + public final HeldItemRenderState rightHeldItem = new HeldItemRenderState(); + + public final ItemRenderState glintlessRightHandItemState = new ItemRenderState(); + public final ItemRenderState glintlessLeftHandItemState = new ItemRenderState(); + public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { this.pony = pony; attributes.updateLivingState(entity, pony, mode); @@ -58,6 +71,9 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode ) && entity.hasCustomName() && entity.getCustomName().getString().equalsIgnoreCase("technoblade") ); + leftHeldItem.update(entity.getStackInArm(Arm.LEFT)); + rightHeldItem.update(entity.getStackInArm(Arm.RIGHT)); + // Adjust cape angles // capePitch field_53537 *= 0.3F; @@ -130,4 +146,18 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode public ModelAttributes getAttributes() { return attributes; } + + public HeldItemRenderState getHeldItem(Arm arm) { + return arm == Arm.LEFT ? leftHeldItem : rightHeldItem; + } + + public static class HeldItemRenderState { + public UseAction action = UseAction.NONE; + public boolean forwardFacing; + + private void update(ItemStack stack) { + action = stack.getUseAction(); + forwardFacing = PonyConfig.getInstance().forwardHoldingItems.get().contains(Registries.ITEM.getId(stack.getItem())); + } + } } diff --git a/src/main/java/com/minelittlepony/client/util/render/TextureFlattener.java b/src/main/java/com/minelittlepony/client/util/render/TextureFlattener.java index 59ec0cd6..7c229226 100644 --- a/src/main/java/com/minelittlepony/client/util/render/TextureFlattener.java +++ b/src/main/java/com/minelittlepony/client/util/render/TextureFlattener.java @@ -17,20 +17,16 @@ public class TextureFlattener { Preconditions.checkArgument(textures.size() > 0, "Must have at least one image to flatten"); MinecraftClient.getInstance().getTextureManager().registerTexture(output, new ResourceTexture(output) { @Override - protected TextureData loadTextureData(ResourceManager resourceManager) { - try { - NativeImage image = NativeImage.read(resourceManager.getResourceOrThrow(textures.get(0)).getInputStream()); + public TextureContents loadContents(ResourceManager resourceManager) throws IOException { + NativeImage image = NativeImage.read(resourceManager.getResourceOrThrow(textures.get(0)).getInputStream()); - for (int i = 1; i < textures.size(); i++) { - try (NativeImage data = NativeImage.read(resourceManager.getResourceOrThrow(textures.get(i)).getInputStream())) { - copyOver(data, image); - } + for (int i = 1; i < textures.size(); i++) { + try (NativeImage data = NativeImage.read(resourceManager.getResourceOrThrow(textures.get(i)).getInputStream())) { + copyOver(data, image); } - - return new TextureData(null, image); - } catch (IOException e) { - return new TextureData(e); } + + return new TextureContents(image, null); } }); } diff --git a/src/main/java/com/minelittlepony/util/ResourceUtil.java b/src/main/java/com/minelittlepony/util/ResourceUtil.java index 23dd549e..0d0ed3cd 100644 --- a/src/main/java/com/minelittlepony/util/ResourceUtil.java +++ b/src/main/java/com/minelittlepony/util/ResourceUtil.java @@ -20,9 +20,7 @@ public final class ResourceUtil { } public static boolean textureExists(Identifier texture) { - return - MinecraftClient.getInstance().getTextureManager().getOrDefault(texture, null) != null - || MinecraftClient.getInstance().getResourceManager().getResource(texture).isPresent(); + return MinecraftClient.getInstance().getResourceManager().getResource(texture).isPresent(); } public static Optional verifyTexture(Identifier texture) {