From 9dd620515ca17254a60b780edf086e2c7b570793 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Sun, 26 Jan 2025 14:13:23 +0100 Subject: [PATCH] feat: improve disc recognition - Will now display textures according to the stack's specified model/custom modeldata This allows most custom disc datapacks to work :) --- .../renderer/JukeboxBlockEntityRenderer.java | 50 ++++++------------ .../block/renderer/RoundDiscRenderer.java | 38 +++++++++---- .../textures/item/music_disc_missing.png | Bin 0 -> 373 bytes 3 files changed, 45 insertions(+), 43 deletions(-) create mode 100644 common/src/main/resources/assets/visualoverhaul/textures/item/music_disc_missing.png diff --git a/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java b/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java index 837334a..3adb370 100755 --- a/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java +++ b/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java @@ -1,91 +1,73 @@ package eu.midnightdust.visualoverhaul.block.renderer; +import eu.midnightdust.visualoverhaul.FakeBlocks; import eu.midnightdust.visualoverhaul.VisualOverhaulClient; import eu.midnightdust.visualoverhaul.config.VOConfig; import eu.midnightdust.visualoverhaul.util.SoundTest; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.block.BlockState; import net.minecraft.block.SideShapeType; import net.minecraft.block.entity.JukeboxBlockEntity; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.render.*; +import net.minecraft.client.render.block.BlockRenderManager; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; import net.minecraft.state.property.Properties; import net.minecraft.util.Identifier; import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.random.Random; -import org.apache.logging.log4j.LogManager; +import net.minecraft.world.BlockRenderView; import org.joml.AxisAngle4f; import org.joml.Math; import org.joml.Quaternionf; import java.util.Objects; +import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id; import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.jukeboxItems; @Environment(EnvType.CLIENT) public class JukeboxBlockEntityRenderer implements BlockEntityRenderer { - private ItemStack record; - private Identifier discItem; - public JukeboxBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { - } + public JukeboxBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {} @Override public void render(JukeboxBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { if (VOConfig.jukebox) { int lightAbove = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos().up()); + Identifier discModel = null; // If the sound is stopped or no sound is playing, no model is set // + // Tries to get the disc using the serverside method if (jukeboxItems.containsKey(blockEntity.getPos()) && !jukeboxItems.get(blockEntity.getPos()).isEmpty()) { - record = jukeboxItems.get(blockEntity.getPos()).copy(); + discModel = RoundDiscRenderer.getModelId(jukeboxItems.get(blockEntity.getPos())); } // Else gets the record sound played at the position of the jukebox // else if (SoundTest.getSound(blockEntity.getPos()) != null) { // Converts the Sound ID to the item ID of the appropriate disc (minecraft:music_disc.cat -> minecraft:music_disc_cat) // - discItem = Identifier.of(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_")); - - // Tries to get the disc item from the registry // - if (Registries.ITEM.getOptionalValue(discItem).isPresent()) { - record = new ItemStack(Registries.ITEM.get(discItem)); - } - else { - if (VOConfig.debug) LogManager.getLogger("VisualOverhaul").warn("Error getting music disc item for " + SoundTest.getSound(blockEntity.getPos())); - discItem = null; - record = ItemStack.EMPTY; - } - } - // If the sound is stopped or no sound is playing, the stack is set to an empty stack // - else { - discItem = null; - record = ItemStack.EMPTY; + discModel = Identifier.of(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_")); } - if (!record.isEmpty()) { + if (discModel != null) { matrices.push(); matrices.translate(0.5f, 1.03f, 0.5f); matrices.scale(0.75f, 0.75f, 0.75f); matrices.multiply(new Quaternionf(new AxisAngle4f(Math.toRadians(Util.getMeasuringTimeMs() / 9.0f), 0, 1, 0))); - RoundDiscRenderer.render(record.getItem(), lightAbove, overlay, matrices, vertexConsumers); + RoundDiscRenderer.render(discModel, lightAbove, overlay, matrices, vertexConsumers); matrices.pop(); } if (VOConfig.jukebox_fake_block && !blockEntity.getWorld().getBlockState(blockEntity.getPos().up()).isSideSolid(blockEntity.getWorld(),blockEntity.getPos().up(), Direction.DOWN, SideShapeType.FULL)) { matrices.push(); matrices.translate(0f, 1f, 0f); - if (record == ItemStack.EMPTY) { - MinecraftClient.getInstance().getBlockRenderManager().renderBlock(VisualOverhaulClient.JukeBoxTop.getDefaultState().with(Properties.HAS_RECORD, false), blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create()); - } else { - MinecraftClient.getInstance().getBlockRenderManager().renderBlock(VisualOverhaulClient.JukeBoxTop.getDefaultState().with(Properties.HAS_RECORD, true), blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create()); - } + Identifier blockId = discModel != null ? id("jukebox_top_playing") : id("jukebox_top_stopped"); + FakeBlocks.renderFakeBlock(blockId, blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout())); matrices.pop(); } } diff --git a/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/RoundDiscRenderer.java b/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/RoundDiscRenderer.java index 3da4038..a597c66 100644 --- a/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/RoundDiscRenderer.java +++ b/common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/RoundDiscRenderer.java @@ -1,7 +1,6 @@ package eu.midnightdust.visualoverhaul.block.renderer; import eu.midnightdust.visualoverhaul.mixin.ItemRenderStateAccessor; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.model.ModelNameSupplier; import net.minecraft.client.model.SpriteGetter; import net.minecraft.client.render.RenderLayer; @@ -12,7 +11,8 @@ import net.minecraft.client.render.model.json.JsonUnbakedModel; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.Item; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.ItemStack; import net.minecraft.item.ModelTransformationMode; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; @@ -21,6 +21,8 @@ import java.io.StringReader; import java.util.HashMap; import java.util.Map; +import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id; + /* * Fabric's Model API would be much more elegant, but doesn't work on NeoForge, so I came up with this very hacky (but kinda cool) solution. */ @@ -43,7 +45,7 @@ public class RoundDiscRenderer { */ private static String getJsonModel(Identifier id) { return "{\"textures\":{\"0\":\""+ - id.getNamespace()+":"+"item/"+id.getPath()+ + id.getNamespace()+":"+(id.getPath().contains("/") ? "" : "item/")+id.getPath()+ "\",\"particle\":\"#0\"},\"elements\":[{\"from\":[7.5,0,7.5],\"to\":[8.5,1,8.5],\"faces\":{\"up\":{\"uv\":[7,7,8,8],\"texture\":\"#0\"}}},{\"from\":[9.5,0,9.5],\"to\":[10.5,1,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[10,8,10]},\"faces\":{\"up\":{\"uv\":[5,6,6,7],\"texture\":\"#0\"}}},{\"from\":[5.5,0,9.5],\"to\":[6.5,1,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[6,8,10]},\"faces\":{\"up\":{\"uv\":[9,6,10,7],\"texture\":\"#0\"}}},{\"from\":[5.5,0,5.5],\"to\":[6.5,1,6.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[6,8,6]},\"faces\":{\"up\":{\"uv\":[9,8,10,9],\"texture\":\"#0\"}}},{\"from\":[9.5,0,5.5],\"to\":[10.5,1,6.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[10,8,6]},\"faces\":{\"up\":{\"uv\":[5,8,6,9],\"texture\":\"#0\"}}},{\"from\":[6.5,0,5.5],\"to\":[9.5,1,6.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,6]},\"faces\":{\"up\":{\"uv\":[6,8,9,9],\"texture\":\"#0\"}}},{\"from\":[2.5,0,4.5],\"to\":[13.5,1,5.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,5]},\"faces\":{\"up\":{\"uv\":[2,9,13,10],\"texture\":\"#0\"}}},{\"from\":[4.5,0.001,2.5],\"to\":[5.5,1.001,13.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[5,8,8]},\"faces\":{\"up\":{\"uv\":[2,9,13,10],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[10.5,0.001,2.5],\"to\":[11.5,1.001,13.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[11,8,8]},\"faces\":{\"up\":{\"uv\":[2,9,13,10],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[2.5,0,10.5],\"to\":[13.5,1,11.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,11]},\"faces\":{\"up\":{\"uv\":[2,5,13,6],\"texture\":\"#0\"}}},{\"from\":[6.5,0,9.5],\"to\":[9.5,1,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,10]},\"faces\":{\"up\":{\"uv\":[6,6,9,7],\"texture\":\"#0\"}}},{\"from\":[5.5,0,6.5],\"to\":[6.5,1,9.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[6,8,8]},\"faces\":{\"up\":{\"uv\":[6,8,9,9],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[9.5,0,6.5],\"to\":[10.5,1,9.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[10,8,8]},\"faces\":{\"up\":{\"uv\":[6,6,9,7],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[8.5,0,6.5],\"to\":[9.5,1,9.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[9,8,8]},\"faces\":{\"up\":{\"uv\":[6,7,7,8],\"texture\":\"#0\"}}},{\"from\":[6.5,0,6.5],\"to\":[7.5,1,9.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[7,8,8]},\"faces\":{\"up\":{\"uv\":[8,7,9,8],\"texture\":\"#0\"}}},{\"from\":[7.5,0,8.5],\"to\":[8.5,1,9.5],\"faces\":{\"up\":{\"uv\":[6,7,7,8],\"texture\":\"#0\"}}},{\"from\":[7.5,0,6.5],\"to\":[8.5,1,7.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,6]},\"faces\":{\"up\":{\"uv\":[8,7,9,8],\"texture\":\"#0\"}}},{\"from\":[7.5,-0.001,11.5],\"to\":[12.5,0.999,12.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[10,8,12]},\"faces\":{\"up\":{\"uv\":[3,5,8,6],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[3.5,-0.001,11.5],\"to\":[7.5,0.999,12.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[5,8,12]},\"faces\":{\"up\":{\"uv\":[8,5,12,6],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[5.5,0,12.5],\"to\":[10.5,1,13.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,13]},\"faces\":{\"up\":{\"uv\":[2,5,3,10],\"rotation\":90,\"texture\":\"#0\"}}},{\"from\":[6.5,0,13.5],\"to\":[11.5,1,14.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[9,8,14]},\"faces\":{\"east\":{\"uv\":[10,11,11,12],\"texture\":\"#0\"},\"south\":{\"uv\":[5,12,10,13],\"texture\":\"#0\"},\"up\":{\"uv\":[5,3,10,4],\"texture\":\"#0\"}}},{\"from\":[4.5,0,13.5],\"to\":[6.5,1,14.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[4,8,14]},\"faces\":{\"south\":{\"uv\":[3,11,5,12],\"texture\":\"#0\"},\"west\":{\"uv\":[2,11,3,12],\"texture\":\"#0\"},\"up\":{\"uv\":[8,3,10,4],\"texture\":\"#0\"}}},{\"from\":[3.5,0,12.5],\"to\":[4.5,1,13.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[2,8,13]},\"faces\":{\"south\":{\"uv\":[13,10,14,11],\"texture\":\"#0\"},\"west\":{\"uv\":[13,10,14,11],\"texture\":\"#0\"},\"up\":{\"uv\":[10,4,11,5],\"texture\":\"#0\"}}},{\"from\":[2.5,0,11.5],\"to\":[3.5,1,12.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[1,8,12]},\"faces\":{\"south\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"west\":{\"uv\":[10,11,11,12],\"texture\":\"#0\"},\"up\":{\"uv\":[11,4,12,5],\"texture\":\"#0\"}}},{\"from\":[12.5,0,11.5],\"to\":[13.5,1,12.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[11,8,12]},\"faces\":{\"east\":{\"uv\":[13,10,14,11],\"texture\":\"#0\"},\"south\":{\"uv\":[13,10,14,11],\"texture\":\"#0\"},\"up\":{\"uv\":[2,4,3,5],\"texture\":\"#0\"}}},{\"from\":[11.5,0,12.5],\"to\":[12.5,1,13.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[10,8,13]},\"faces\":{\"east\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"south\":{\"uv\":[11,11,12,12],\"texture\":\"#0\"},\"up\":{\"uv\":[4,4,5,5],\"texture\":\"#0\"}}},{\"from\":[11.5,-0.001,5.5],\"to\":[12.5,0.999,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[12,8,8]},\"faces\":{\"up\":{\"uv\":[5,4,10,5],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[11.5,-0.001,3.5],\"to\":[12.5,0.999,4.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[12,8,6]},\"faces\":{\"up\":{\"uv\":[2,9,3,10],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[12.5,0,5.5],\"to\":[13.5,1,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[13,8,8]},\"faces\":{\"up\":{\"uv\":[2,5,3,10],\"texture\":\"#0\"}}},{\"from\":[13.5,0,4.5],\"to\":[14.5,1,9.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[14,8,7]},\"faces\":{\"north\":{\"uv\":[10,11,11,12],\"texture\":\"#0\"},\"east\":{\"uv\":[5,12,10,13],\"texture\":\"#0\"},\"up\":{\"uv\":[5,3,10,4],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[13.5,0,9.5],\"to\":[14.5,1,11.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[14,8,12]},\"faces\":{\"east\":{\"uv\":[3,11,5,12],\"texture\":\"#0\"},\"south\":{\"uv\":[2,11,3,12],\"texture\":\"#0\"},\"up\":{\"uv\":[8,3,10,4],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[11.5,0,2.5],\"to\":[12.5,1,3.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[12,8,5]},\"faces\":{\"north\":{\"uv\":[11,11,12,12],\"texture\":\"#0\"},\"east\":{\"uv\":[10,11,11,12],\"texture\":\"#0\"},\"up\":{\"uv\":[1,5,2,6],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[12.5,0,3.5],\"to\":[13.5,1,4.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[13,8,6]},\"faces\":{\"north\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"east\":{\"uv\":[11,11,12,12],\"texture\":\"#0\"},\"up\":{\"uv\":[2,4,3,5],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[5.5,-0.001,3.5],\"to\":[10.5,0.999,4.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,4.1]},\"faces\":{\"up\":{\"uv\":[5,10,10,11],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[3.5,-0.001,3.5],\"to\":[4.5,0.999,4.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[6,8,4]},\"faces\":{\"up\":{\"uv\":[12,9,13,10],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[5.5,0,2.5],\"to\":[10.5,1,3.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[8,8,3]},\"faces\":{\"up\":{\"uv\":[2,5,3,10],\"rotation\":270,\"texture\":\"#0\"}}},{\"from\":[6.5,0,1.5],\"to\":[11.5,1,2.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[9,8,2]},\"faces\":{\"north\":{\"uv\":[5,12,10,13],\"texture\":\"#0\"},\"east\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"up\":{\"uv\":[5,3,10,4],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[4.5,0,1.5],\"to\":[6.5,1,2.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[7,8,2]},\"faces\":{\"north\":{\"uv\":[10,11,12,12],\"texture\":\"#0\"},\"west\":{\"uv\":[9,12,10,13],\"texture\":\"#0\"},\"up\":{\"uv\":[8,3,10,4],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[2.5,0,3.5],\"to\":[3.5,1,4.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[5,8,4]},\"faces\":{\"north\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"west\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"up\":{\"uv\":[1,5,2,6],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[3.5,0,2.5],\"to\":[4.5,1,3.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[6,8,3]},\"faces\":{\"north\":{\"uv\":[12,11,13,12],\"texture\":\"#0\"},\"west\":{\"uv\":[11,11,12,12],\"texture\":\"#0\"},\"up\":{\"uv\":[1,5,2,6],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[3.5,-0.001,5.5],\"to\":[4.5,0.999,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[4,8,8.1]},\"faces\":{\"up\":{\"uv\":[11,5,12,10],\"texture\":\"#0\"}}},{\"from\":[2.5,0,5.5],\"to\":[3.5,1,10.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[3,8,8]},\"faces\":{\"up\":{\"uv\":[12,5,13,10],\"rotation\":180,\"texture\":\"#0\"}}},{\"from\":[1.5,0,6.5],\"to\":[2.5,1,11.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[2,8,9]},\"faces\":{\"south\":{\"uv\":[13,10,14,11],\"texture\":\"#0\"},\"west\":{\"uv\":[5,12,10,13],\"texture\":\"#0\"},\"up\":{\"uv\":[5,3,10,4],\"rotation\":90,\"texture\":\"#0\"}}},{\"from\":[1.5,0,4.5],\"to\":[2.5,1,6.5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[2,8,4]},\"faces\":{\"north\":{\"uv\":[13,10,14,11],\"texture\":\"#0\"},\"west\":{\"uv\":[10,11,12,12],\"texture\":\"#0\"},\"up\":{\"uv\":[8,3,10,4],\"rotation\":90,\"texture\":\"#0\"}}}],\"gui_light\":\"front\",\"display\":{\"thirdperson_righthand\":{\"rotation\":[38,0,0],\"translation\":[0,1.75,0.75],\"scale\":[0.5,0.5,0.5]},\"thirdperson_lefthand\":{\"rotation\":[38,0,0],\"translation\":[0,1.75,0.75],\"scale\":[0.5,0.5,0.5]},\"firstperson_righthand\":{\"rotation\":[87,-19,41],\"translation\":[0,4.25,0]},\"firstperson_lefthand\":{\"rotation\":[87,-19,41],\"translation\":[0,4.25,0]},\"ground\":{\"translation\":[0,7.5,0]},\"gui\":{\"rotation\":[90,0,0]},\"head\":{\"translation\":[0,14.5,0]},\"fixed\":{\"rotation\":[-90,0,0],\"translation\":[0,0,-8]}},\"groups\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,{\"name\":\"group\",\"origin\":[10,8,12],\"color\":0,\"children\":[17,18,19,20,21,22,23,24,25]},{\"name\":\"group\",\"origin\":[10,8,12],\"color\":0,\"children\":[26,27,28,29,30,31,32]},{\"name\":\"group\",\"origin\":[10,8,12],\"color\":0,\"children\":[33,34,35,36,37,38,39]},{\"name\":\"group\",\"origin\":[10,8,12],\"color\":0,\"children\":[40,41,42,43]}]}"; } @@ -54,12 +56,23 @@ public class RoundDiscRenderer { if (DISCS.containsKey(id)) return DISCS.get(id); else return requestModel(id); } + public static Identifier getModelId(ItemStack stack) { + //System.out.println(stack.getComponents()); + Identifier modelId = Registries.ITEM.getId(stack.getItem()); + if (stack.hasChangedComponent(DataComponentTypes.ITEM_MODEL)) + modelId = stack.getComponents().get(DataComponentTypes.ITEM_MODEL); + else if (stack.hasChangedComponent(DataComponentTypes.CUSTOM_MODEL_DATA) && !stack.getComponents().get(DataComponentTypes.CUSTOM_MODEL_DATA).strings().isEmpty()) { + modelId = Identifier.tryParse(stack.getComponents().get(DataComponentTypes.CUSTOM_MODEL_DATA).getString(0)); + } + return modelId; + } - public static void render(Item item, int light, int overlay, MatrixStack matrices, VertexConsumerProvider vertexConsumers) { + public static void render(Identifier modelId, int light, int overlay, MatrixStack matrices, VertexConsumerProvider vertexConsumers) { ItemRenderState itemRenderState = new ItemRenderState(); ItemRenderState.LayerRenderState renderState = itemRenderState.newLayer(); ((ItemRenderStateAccessor)itemRenderState).setModelTransformationMode(ModelTransformationMode.GROUND); - renderState.setModel(getModel(Registries.ITEM.getId(item)), RenderLayer.getCutout()); + + renderState.setModel(getModel(modelId), RenderLayer.getCutout()); itemRenderState.render(matrices, vertexConsumers, light, overlay); } @@ -73,18 +86,25 @@ public class RoundDiscRenderer { @Override public SpriteGetter getSpriteGetter() { return new SpriteGetter() { + static final Identifier MISSINGNO = Identifier.ofVanilla("missingno"); + static final SpriteIdentifier MISSING_DISC = new SpriteIdentifier(Identifier.ofVanilla("textures/atlas/blocks.png"), id("item/music_disc_missing")); + @Override - public Sprite get(SpriteIdentifier spriteId) { return spriteId.getSprite(); } + public Sprite get(SpriteIdentifier spriteId) { + Sprite sprite = spriteId.getSprite(); + if (sprite.getContents().getId().equals(MISSINGNO)) + return getMissing(spriteId.getTextureId().toString()); + return sprite; + } @Override public Sprite getMissing(String textureId) { - return MinecraftClient.getInstance().getPaintingManager().getBackSprite(); - // should be the missing sprite, but this also works lol + return get(MISSING_DISC); } }; } - @Override // no clue what this does + @Override // no clue what this does lol public ModelNameSupplier getModelNameSupplier() { return () -> "round_disc"; } } } diff --git a/common/src/main/resources/assets/visualoverhaul/textures/item/music_disc_missing.png b/common/src/main/resources/assets/visualoverhaul/textures/item/music_disc_missing.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7b2291d0c1a5ca3e5b2c5501477c57fd344d98 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?e4)yuJ3DOu7_-0 zad(hGTq9n;m^klv5XZq`kLYsUD-3a@BNMl74^NW^X&Y>?8_E?K9^foS$#J< zvTNOBh4!b*ES)%J%=C_~Q2%)QV2i+sW2N!@o-TF?J71oE#LCr^9Q(PLbtTYW44$rj JF6*2UngH|&hvfhO literal 0 HcmV?d00001