From 1002847acbc0c29c5de0db582f649f7227c5fe08 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 10 Jun 2023 22:33:38 +0200 Subject: [PATCH] [Feature] Slot for wooden walls --- .../VanillaVariantStoneMaterial.java | 4 +- .../item/model/CrystaliteArmorProvider.java | 97 --------- .../item/model/CrystaliteArmorRenderer.java | 65 ++++++ .../item/model/CrystaliteBootsModel.java | 6 +- .../item/model/CrystaliteChestplateModel.java | 11 +- .../betterx/betterend/registry/EndBlocks.java | 2 +- .../betterend/registry/EndModelProviders.java | 10 +- .../rendering/v1/ArmorRenderingRegistry.java | 197 ------------------ .../rendering/ArmorProviderExtensions.java | 36 ---- .../rendering/ArmorRenderingRegistryImpl.java | 95 --------- .../rendering/MixinArmorFeatureRenderer.java | 161 -------------- .../mixin/client/rendering/MixinItem.java | 58 ------ 12 files changed, 79 insertions(+), 663 deletions(-) delete mode 100644 src/main/java/org/betterx/betterend/item/model/CrystaliteArmorProvider.java create mode 100644 src/main/java/org/betterx/betterend/item/model/CrystaliteArmorRenderer.java delete mode 100644 src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java delete mode 100644 src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java delete mode 100644 src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java delete mode 100644 src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java delete mode 100644 src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java diff --git a/src/main/java/org/betterx/betterend/complexmaterials/VanillaVariantStoneMaterial.java b/src/main/java/org/betterx/betterend/complexmaterials/VanillaVariantStoneMaterial.java index 8d8c3f24..2b15d84d 100644 --- a/src/main/java/org/betterx/betterend/complexmaterials/VanillaVariantStoneMaterial.java +++ b/src/main/java/org/betterx/betterend/complexmaterials/VanillaVariantStoneMaterial.java @@ -8,13 +8,13 @@ import org.betterx.betterend.registry.EndBlocks; import org.betterx.betterend.registry.EndItems; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.MaterialColor; public class VanillaVariantStoneMaterial extends StoneComplexMaterial { public VanillaVariantStoneMaterial( String baseName, Block sourceBlock, - MapColor color + MaterialColor color ) { super(BetterEnd.MOD_ID, baseName, "", sourceBlock, color); } diff --git a/src/main/java/org/betterx/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/org/betterx/betterend/item/model/CrystaliteArmorProvider.java deleted file mode 100644 index dc24ec7a..00000000 --- a/src/main/java/org/betterx/betterend/item/model/CrystaliteArmorProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.betterx.betterend.item.model; - -import org.betterx.betterend.item.CrystaliteArmor; -import org.betterx.betterend.registry.EndItems; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -import com.google.common.collect.Lists; -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -@Environment(EnvType.CLIENT) -public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProvider, ArmorRenderingRegistry.TextureProvider { - //TODO: find new registry - private final static ResourceLocation FIRST_LAYER = new ResourceLocation( - "textures/models/armor/crystalite_layer_1.png"); - private final static ResourceLocation SECOND_LAYER = new ResourceLocation( - "textures/models/armor/crystalite_layer_2.png"); - private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null); - private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null); - private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null); - private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null); - private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null); - - //@Override - public @NotNull ResourceLocation getArmorTexture( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - boolean secondLayer, - @Nullable String suffix, - ResourceLocation defaultTexture - ) { - if (!isStackValid(stack)) return defaultTexture; - if (secondLayer) return SECOND_LAYER; - return FIRST_LAYER; - } - - //@Override - public @NotNull HumanoidModel getArmorModel( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - HumanoidModel defaultModel - ) { - if (!isStackValid(stack)) return defaultModel; - switch (slot) { - case HEAD: { - return HELMET_MODEL; - } - case CHEST: { - if (entity instanceof AbstractClientPlayer && ((AbstractClientPlayer) entity).getModelName() - .equals("slim")) { - CHEST_MODEL_SLIM.copyPropertiesTo(defaultModel); - return CHEST_MODEL_SLIM; - } - CHEST_MODEL.copyPropertiesTo(defaultModel); - return CHEST_MODEL; - } - case LEGS: { - return LEGGINGS_MODEL; - } - case FEET: { - BOOTS_MODEL.copyPropertiesTo(defaultModel); - return BOOTS_MODEL; - } - default: { - return defaultModel; - } - } - } - - public Iterable getRenderedItems() { - return Lists.newArrayList( - EndItems.CRYSTALITE_HELMET, - EndItems.CRYSTALITE_CHESTPLATE, - EndItems.CRYSTALITE_ELYTRA, - EndItems.CRYSTALITE_LEGGINGS, - EndItems.CRYSTALITE_BOOTS - ); - } - - private boolean isStackValid(ItemStack stack) { - return stack.getItem() instanceof CrystaliteArmor; - } -} diff --git a/src/main/java/org/betterx/betterend/item/model/CrystaliteArmorRenderer.java b/src/main/java/org/betterx/betterend/item/model/CrystaliteArmorRenderer.java new file mode 100644 index 00000000..c714e12b --- /dev/null +++ b/src/main/java/org/betterx/betterend/item/model/CrystaliteArmorRenderer.java @@ -0,0 +1,65 @@ +package org.betterx.betterend.item.model; + +import org.betterx.bclib.client.render.HumanoidArmorRenderer; +import org.betterx.betterend.registry.EndItems; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderer; + +import org.jetbrains.annotations.NotNull; + +@Environment(EnvType.CLIENT) +public class CrystaliteArmorRenderer extends HumanoidArmorRenderer { + private final static ResourceLocation FIRST_LAYER = new ResourceLocation( + "textures/models/armor/crystalite_layer_1.png"); + private final static ResourceLocation SECOND_LAYER = new ResourceLocation( + "textures/models/armor/crystalite_layer_2.png"); + private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null); + private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null); + private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null); + private static CrystaliteArmorRenderer INSTANCE = null; + + public static void register() { + if (INSTANCE == null) { + INSTANCE = new CrystaliteArmorRenderer(); + ArmorRenderer.register( + INSTANCE, + EndItems.CRYSTALITE_HELMET, + EndItems.CRYSTALITE_CHESTPLATE, + EndItems.CRYSTALITE_ELYTRA, + EndItems.CRYSTALITE_LEGGINGS, + EndItems.CRYSTALITE_BOOTS + ); + } + } + + @NotNull + @Override + protected ResourceLocation getTextureForSlot(EquipmentSlot slot, boolean innerLayer) { + return innerLayer ? SECOND_LAYER : FIRST_LAYER; + } + + @Override + protected HumanoidModel getModelForSlot(LivingEntity entity, EquipmentSlot slot) { + if (slot == EquipmentSlot.HEAD) return HELMET_MODEL; + if (slot == EquipmentSlot.LEGS) return LEGGINGS_MODEL; + if (slot == EquipmentSlot.FEET) return BOOTS_MODEL; + if (slot == EquipmentSlot.CHEST) { + if (entity instanceof AbstractClientPlayer acp && acp.getModelName().equals("slim")) { + return CHEST_MODEL_SLIM; + } else { + return CHEST_MODEL; + } + } + return null; + } +} diff --git a/src/main/java/org/betterx/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/org/betterx/betterend/item/model/CrystaliteBootsModel.java index 3b95678f..23052ae9 100644 --- a/src/main/java/org/betterx/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/org/betterx/betterend/item/model/CrystaliteBootsModel.java @@ -1,5 +1,6 @@ package org.betterx.betterend.item.model; +import org.betterx.bclib.client.render.HumanoidArmorRenderer; import org.betterx.betterend.registry.EndEntitiesRenders; import net.minecraft.client.model.HumanoidModel; @@ -14,7 +15,7 @@ import com.google.common.collect.Lists; import java.util.Collections; -public class CrystaliteBootsModel extends HumanoidModel { +public class CrystaliteBootsModel extends HumanoidModel implements HumanoidArmorRenderer.CopyExtraState { public ModelPart leftBoot; public ModelPart rightBoot; @@ -66,8 +67,7 @@ public class CrystaliteBootsModel extends HumanoidModel { } @Override - public void copyPropertiesTo(HumanoidModel bipedEntityModel) { - super.copyPropertiesTo(bipedEntityModel); + public void copyPropertiesFrom(HumanoidModel bipedEntityModel) { this.leftBoot.copyFrom(leftLeg); this.rightBoot.copyFrom(rightLeg); } diff --git a/src/main/java/org/betterx/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/org/betterx/betterend/item/model/CrystaliteChestplateModel.java index a32f2dcf..f910e218 100644 --- a/src/main/java/org/betterx/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/org/betterx/betterend/item/model/CrystaliteChestplateModel.java @@ -1,5 +1,6 @@ package org.betterx.betterend.item.model; +import org.betterx.bclib.client.render.HumanoidArmorRenderer; import org.betterx.betterend.registry.EndEntitiesRenders; import com.mojang.blaze3d.vertex.PoseStack; @@ -17,7 +18,7 @@ import com.google.common.collect.Lists; import java.util.Collections; -public class CrystaliteChestplateModel extends HumanoidModel { +public class CrystaliteChestplateModel extends HumanoidModel implements HumanoidArmorRenderer.CopyExtraState { public ModelPart leftShoulder; public ModelPart rightShoulder; @@ -119,13 +120,13 @@ public class CrystaliteChestplateModel extends HumanoidModel { super(modelPart, RenderType::entityTranslucent); this.thinArms = thinArms; localBody = modelPart.getChild(PartNames.BODY); - leftShoulder = modelPart.getChild("leftShoulder"); - rightShoulder = modelPart.getChild("rightShoulder"); + this.leftShoulder = modelPart.getChild("leftShoulder"); + this.rightShoulder = modelPart.getChild("rightShoulder"); } + @Override - public void copyPropertiesTo(HumanoidModel bipedEntityModel) { - super.copyPropertiesTo(bipedEntityModel); + public void copyPropertiesFrom(HumanoidModel parentModel) { this.leftShoulder.copyFrom(leftArm); this.rightShoulder.copyFrom(rightArm); } diff --git a/src/main/java/org/betterx/betterend/registry/EndBlocks.java b/src/main/java/org/betterx/betterend/registry/EndBlocks.java index e32d9d9c..43d1681c 100644 --- a/src/main/java/org/betterx/betterend/registry/EndBlocks.java +++ b/src/main/java/org/betterx/betterend/registry/EndBlocks.java @@ -703,7 +703,7 @@ public class EndBlocks { public static final VanillaVariantStoneMaterial END_STONE_BRICK_VARIATIONS = new VanillaVariantStoneMaterial( "end_stone_brick", Blocks.END_STONE_BRICKS, - MapColor.SAND + MaterialColor.SAND ).init(); public static List getModBlocks() { diff --git a/src/main/java/org/betterx/betterend/registry/EndModelProviders.java b/src/main/java/org/betterx/betterend/registry/EndModelProviders.java index ca25a72b..03df660b 100644 --- a/src/main/java/org/betterx/betterend/registry/EndModelProviders.java +++ b/src/main/java/org/betterx/betterend/registry/EndModelProviders.java @@ -1,19 +1,13 @@ package org.betterx.betterend.registry; -import org.betterx.betterend.item.model.CrystaliteArmorProvider; +import org.betterx.betterend.item.model.CrystaliteArmorRenderer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; - @Environment(EnvType.CLIENT) public class EndModelProviders { - - public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); - public final static void register() { - ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); - ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + CrystaliteArmorRenderer.register(); } } diff --git a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java deleted file mode 100644 index fee2cc5c..00000000 --- a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - /* - This file is a refactor from fabric-api, based on the work of shedaniel. - */ - - -package shadow.fabric.api.client.rendering.v1; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -import shadow.fabric.impl.client.rendering.ArmorRenderingRegistryImpl; - -import java.util.Arrays; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * A class for registering custom armor models and textures for {@link Item}, to be provided by a {@link ModelProvider} or {@link TextureProvider}. - * - *

This can be used to replace existing vanilla armor models and textures conditionally, however each {@link Item} - * instance can only allow one {@link ModelProvider} or {@link TextureProvider} respectively, causing potential conflicts - * with other mods if you replace the model or texture for vanilla items. Consider using a separate item instead.

- * - *

A custom model would probably also require a custom texture to go along it, the model will use the vanilla texture if it is undefined.

- * - *

Since armor textures identifier in vanilla is hardcoded to be in the {@code minecraft} namespace, this registry can also be - * used to use a custom namespace if desired.

- */ -@Environment(EnvType.CLIENT) -public final class ArmorRenderingRegistry { - private ArmorRenderingRegistry() { - } - - /** - * Registers a provider for custom armor models for an item. - * - * @param provider the provider for the model - * @param items the items to be registered for - */ - public static void registerModel(@Nullable ModelProvider provider, Item... items) { - registerModel(provider, Arrays.asList(items)); - } - - /** - * Registers a provider for custom armor models for an item. - * - * @param provider the provider for the model - * @param items the items to be registered for - */ - public static void registerModel(@Nullable ModelProvider provider, Iterable items) { - ArmorRenderingRegistryImpl.registerModel(provider, items); - } - - /** - * Registers a provider for custom texture models for an item. - * - * @param provider the provider for the texture - * @param items the items to be registered for - */ - public static void registerTexture(@Nullable TextureProvider provider, Item... items) { - registerTexture(provider, Arrays.asList(items)); - } - - /** - * Registers a provider for custom texture models for an item. - * - * @param provider the provider for the texture - * @param items the items to be registered for - */ - public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { - ArmorRenderingRegistryImpl.registerTexture(provider, items); - } - - /** - * Register simple armor items to use the vanilla armor file name under the mods namespace. - * - * @param identifier The namespace + path to use for the armor texture location. - * @param items the items to be registered - */ - public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { - registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { - return new ResourceLocation( - identifier.getNamespace(), - "textures/models/armor/" + identifier.getPath() + "_layer_" + (secondLayer - ? 2 - : 1) + (suffix == null ? "" : "_" + suffix) + ".png" - ); - }, items); - } - - /** - * Gets the model of the armor piece. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param defaultModel The default model that vanilla provides - * @return The model of the armor piece. - */ - @NotNull - public static HumanoidModel getArmorModel( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - HumanoidModel defaultModel - ) { - return ArmorRenderingRegistryImpl.getArmorModel(entity, stack, slot, defaultModel); - } - - /** - * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param secondLayer True if using the second texture layer - * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} - * @param defaultTexture The default vanilla texture identifier - * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. - */ - @NotNull - public static ResourceLocation getArmorTexture( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - boolean secondLayer, - @Nullable String suffix, - ResourceLocation defaultTexture - ) { - return ArmorRenderingRegistryImpl.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); - } - - @FunctionalInterface - @Environment(EnvType.CLIENT) - public interface ModelProvider { - /** - * Gets the model of the armor piece. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param defaultModel The default vanilla armor model - * @return The model of the armor piece. Should never be null. - */ - @NotNull HumanoidModel getArmorModel( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - HumanoidModel defaultModel - ); - } - - @FunctionalInterface - @Environment(EnvType.CLIENT) - public interface TextureProvider { - /** - * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param defaultTexture The default vanilla texture identifier - * @return the custom armor texture identifier. Should never be null. - */ - @NotNull ResourceLocation getArmorTexture( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - boolean secondLayer, - @Nullable String suffix, - ResourceLocation defaultTexture - ); - } -} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java deleted file mode 100644 index 667adca8..00000000 --- a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - /* - This file is a refactor from fabric-api, based on the work of shedaniel. - */ - - -package shadow.fabric.impl.client.rendering; - -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; - -import org.jetbrains.annotations.Nullable; - -public interface ArmorProviderExtensions { - @Nullable ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider(); - - @Nullable ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider(); - - void fabric_setArmorModelProvider(@Nullable ArmorRenderingRegistry.ModelProvider provider); - - void fabric_setArmorTextureProvider(@Nullable ArmorRenderingRegistry.TextureProvider provider); -} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java deleted file mode 100644 index f69bff9f..00000000 --- a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - /* - This file is a refactor from fabric-api, based on the work of shedaniel. - */ - - -package shadow.fabric.impl.client.rendering; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; - -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; - -import java.util.Objects; -import org.jetbrains.annotations.Nullable; - -public final class ArmorRenderingRegistryImpl { - private ArmorRenderingRegistryImpl() { - } - - public static void registerModel(ArmorRenderingRegistry.ModelProvider provider, Iterable items) { - Objects.requireNonNull(items); - - for (Item item : items) { - Objects.requireNonNull(item); - - ((ArmorProviderExtensions) item).fabric_setArmorModelProvider(provider); - } - } - - public static void registerTexture(ArmorRenderingRegistry.TextureProvider provider, Iterable items) { - Objects.requireNonNull(items); - - for (Item item : items) { - Objects.requireNonNull(item); - - ((ArmorProviderExtensions) item).fabric_setArmorTextureProvider(provider); - } - } - - public static HumanoidModel getArmorModel( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - HumanoidModel defaultModel - ) { - if (!stack.isEmpty()) { - ArmorRenderingRegistry.ModelProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorModelProvider(); - - if (provider != null) { - return provider.getArmorModel(entity, stack, slot, defaultModel); - } - } - - return defaultModel; - } - - public static ResourceLocation getArmorTexture( - LivingEntity entity, - ItemStack stack, - EquipmentSlot slot, - boolean secondLayer, - @Nullable String suffix, - ResourceLocation defaultTexture - ) { - if (!stack.isEmpty()) { - ArmorRenderingRegistry.TextureProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorTextureProvider(); - - if (provider != null) { - return provider.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); - } - } - - return defaultTexture; - } -} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java deleted file mode 100644 index 6b4c8f40..00000000 --- a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - /* - This file is a refactor from fabric-api, based on the work of shedaniel. - */ - - -package shadow.fabric.mixin.client.rendering; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.RenderLayerParent; -import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; -import net.minecraft.client.renderer.entity.layers.RenderLayer; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; - -import java.util.Map; -import java.util.Objects; - -@Mixin(HumanoidArmorLayer.class) -@Environment(EnvType.CLIENT) -public abstract class MixinArmorFeatureRenderer extends RenderLayer { - @Shadow - @Final - private static Map ARMOR_LOCATION_CACHE; - - public MixinArmorFeatureRenderer(RenderLayerParent context) { - super(context); - - } - - @Unique - private LivingEntity be_storedEntity; - @Unique - private EquipmentSlot be_storedSlot; - - @Inject(method = "render", at = @At("HEAD")) - private void be_storeEntity( - PoseStack matrixStack, - MultiBufferSource vertexConsumerProvider, - int i, - LivingEntity livingEntity, - float f, - float g, - float h, - float j, - float k, - float l, - CallbackInfo ci - ) { - // We store the living entity wearing the armor before we render - this.be_storedEntity = livingEntity; - } - - @Inject(method = "renderArmorPiece", at = @At("HEAD")) - private void be_storeSlot( - PoseStack matrices, - MultiBufferSource vertexConsumers, - LivingEntity livingEntity, - EquipmentSlot slot, - int i, - HumanoidModel bipedEntityModel, - CallbackInfo ci - ) { - // We store the current armor slot that is rendering before we render each armor piece - this.be_storedSlot = slot; - } - - @Inject(method = "render", at = @At("RETURN")) - private void be_removeStored( - PoseStack matrixStack, - MultiBufferSource vertexConsumerProvider, - int i, - LivingEntity livingEntity, - float f, - float g, - float h, - float j, - float k, - float l, - CallbackInfo ci - ) { - // We remove the stored data after we render - this.be_storedEntity = null; - this.be_storedSlot = null; - } - - @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) - private void be_selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable> cir) { - if (be_storedEntity != null) { - ItemStack stack = be_storedEntity.getItemBySlot(slot); - - HumanoidModel defaultModel = cir.getReturnValue(); - HumanoidModel model = ArmorRenderingRegistry.getArmorModel( - be_storedEntity, - stack, - slot, - defaultModel - ); - - if (model != defaultModel) { - cir.setReturnValue(model); - } - } - } - - @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) - private void be_getArmorTexture( - ArmorItem armorItem, - boolean secondLayer, /* @Nullable */ - String suffix, - CallbackInfoReturnable cir, - String vanillaIdentifier - ) { - String texture = ArmorRenderingRegistry.getArmorTexture( - be_storedEntity, - be_storedEntity.getItemBySlot(be_storedSlot), - be_storedSlot, - secondLayer, - suffix, - new ResourceLocation(vanillaIdentifier) - ).toString(); - - if (!Objects.equals(texture, vanillaIdentifier)) { - cir.setReturnValue(ARMOR_LOCATION_CACHE.computeIfAbsent(texture, ResourceLocation::new)); - } - } -} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java deleted file mode 100644 index 37dbaa36..00000000 --- a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - /* - This file is a refactor from fabric-api, based on the work of shedaniel. - */ - -package shadow.fabric.mixin.client.rendering; - - -import net.minecraft.world.item.Item; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; -import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; - - -@Mixin(Item.class) -public class MixinItem implements ArmorProviderExtensions { - @Unique - private ArmorRenderingRegistry.ModelProvider armorModelProvider; - @Unique - private ArmorRenderingRegistry.TextureProvider armorTextureProvider; - - @Override - public ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider() { - return armorModelProvider; - } - - @Override - public ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider() { - return armorTextureProvider; - } - - @Override - public void fabric_setArmorModelProvider(ArmorRenderingRegistry.ModelProvider provider) { - armorModelProvider = provider; - } - - @Override - public void fabric_setArmorTextureProvider(ArmorRenderingRegistry.TextureProvider provider) { - armorTextureProvider = provider; - } -} \ No newline at end of file