Support namespaced armor textures. Fixes ()

This commit is contained in:
modmuss50 2022-09-25 16:16:50 +01:00 committed by GitHub
parent ddcd25cd9e
commit 73145abb31
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 82 additions and 0 deletions
fabric-rendering-v1/src
client/java/net/fabricmc/fabric/mixin/client/rendering
testmod
java/net/fabricmc/fabric/test/rendering
resources/assets/fabric-rendering-v1-testmod/textures/models/armor

View file

@ -16,10 +16,16 @@
package net.fabricmc.fabric.mixin.client.rendering;
import java.util.Locale;
import java.util.Map;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
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 net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer;
@ -29,13 +35,19 @@ import net.minecraft.client.render.entity.model.BipedEntityModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderer;
import net.fabricmc.fabric.impl.client.rendering.ArmorRendererRegistryImpl;
@Mixin(ArmorFeatureRenderer.class)
public abstract class ArmorFeatureRendererMixin extends FeatureRenderer<LivingEntity, BipedEntityModel<LivingEntity>> {
@Shadow
@Final
private static Map<String, Identifier> ARMOR_TEXTURE_CACHE;
private ArmorFeatureRendererMixin(FeatureRendererContext<LivingEntity, BipedEntityModel<LivingEntity>> context) {
super(context);
}
@ -50,4 +62,18 @@ public abstract class ArmorFeatureRendererMixin extends FeatureRenderer<LivingEn
ci.cancel();
}
}
@Inject(method = "getArmorTexture", at = @At(value = "HEAD"), cancellable = true)
private void getArmorTexture(ArmorItem item, boolean secondLayer, String overlay, CallbackInfoReturnable<Identifier> cir) {
final String name = item.getMaterial().getName();
final int separator = name.indexOf(Identifier.NAMESPACE_SEPARATOR);
if (separator != -1) {
final String namespace = name.substring(0, separator);
final String path = name.substring(separator + 1);
final String texture = String.format(Locale.ROOT, "%s:textures/models/armor/%s_layer_%d%s.png", namespace, path, secondLayer ? 2 : 1, overlay == null ? "" : "_" + overlay);
cir.setReturnValue(ARMOR_TEXTURE_CACHE.computeIfAbsent(texture, Identifier::new));
}
}
}

View file

@ -19,9 +19,16 @@ package net.fabricmc.fabric.test.rendering;
import java.util.Optional;
import net.minecraft.client.item.TooltipData;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.ArmorMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.recipe.Ingredient;
import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
@ -29,10 +36,12 @@ import net.fabricmc.api.ModInitializer;
public class TooltipComponentTestInit implements ModInitializer {
public static Item CUSTOM_TOOLTIP_ITEM = new CustomTooltipItem();
public static Item CUSTOM_ARMOR_ITEM = new ArmorItem(TestArmorMaterial.INSTANCE, EquipmentSlot.CHEST, new Item.Settings().group(ItemGroup.MISC));
@Override
public void onInitialize() {
Registry.register(Registry.ITEM, new Identifier("fabric-rendering-v1-testmod", "custom_tooltip"), CUSTOM_TOOLTIP_ITEM);
Registry.register(Registry.ITEM, new Identifier("fabric-rendering-v1-testmod", "test_chest"), CUSTOM_ARMOR_ITEM);
}
private static class CustomTooltipItem extends Item {
@ -47,4 +56,51 @@ public class TooltipComponentTestInit implements ModInitializer {
}
public record Data(String string) implements TooltipData { }
public static final class TestArmorMaterial implements ArmorMaterial {
public static final TestArmorMaterial INSTANCE = new TestArmorMaterial();
private TestArmorMaterial() {
}
@Override
public int getDurability(EquipmentSlot slot) {
return 0;
}
@Override
public int getProtectionAmount(EquipmentSlot slot) {
return 0;
}
@Override
public int getEnchantability() {
return 0;
}
@Override
public SoundEvent getEquipSound() {
return SoundEvents.ITEM_ARMOR_EQUIP_LEATHER;
}
@Override
public Ingredient getRepairIngredient() {
return Ingredient.ofItems(Items.LEATHER);
}
@Override
public String getName() {
return "fabric-rendering-v1-testmod:test";
}
@Override
public float getToughness() {
return 0;
}
@Override
public float getKnockbackResistance() {
return 0;
}
}
}