From ecebaef465801f5e466891b02346497bc626fc97 Mon Sep 17 00:00:00 2001 From: SteveKunG Date: Sun, 9 Jun 2024 09:33:39 +0700 Subject: [PATCH 1/2] Fixed crash when decorated pot try to render invalid pattern --- .../model/misc/DecoratedPotModelSelector.java | 11 ++++++++++- ...ecoratedPotBlockEntityRendererOverride.java | 18 ++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java b/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java index 03d9e63..bdb6943 100644 --- a/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java +++ b/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java @@ -8,6 +8,7 @@ import net.minecraft.block.DecoratedPotPatterns; import net.minecraft.block.entity.DecoratedPotBlockEntity; import net.minecraft.item.Item; +import net.minecraft.item.Items; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; @@ -82,6 +83,14 @@ public void writeModelIndices(BlockRenderView view, BlockState state, BlockPos p } private int getPatternIndex(Item sherd, int max) { - return MathHelper.clamp(this.potteryPatterns.indexOf(DecoratedPotPatterns.fromSherd(sherd)), 0, max - 1); + return MathHelper.clamp(this.potteryPatterns.indexOf(getPatternFromSherd(sherd)), 0, max - 1); + } + + private static RegistryKey getPatternFromSherd(Item item) { + RegistryKey registryKey = DecoratedPotPatterns.fromSherd(item); + if (registryKey == null) { + return DecoratedPotPatterns.fromSherd(Items.BRICK); + } + return registryKey; } } diff --git a/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java b/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java index f75c893..ea4b3d4 100644 --- a/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java +++ b/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java @@ -13,6 +13,8 @@ import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.Item; +import net.minecraft.item.Items; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.util.math.MathHelper; @@ -87,18 +89,26 @@ public void render(BlockEntityRenderer renderer, BlockEntity blockE EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, this.baseModel, light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(DecoratedPotPatterns.fromSherd(sherds.back()))[0], light, overlay); + this.potPatternModels.get(getPatternFromSherd(sherds.back()))[0], light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(DecoratedPotPatterns.fromSherd(sherds.left()))[1], light, overlay); + this.potPatternModels.get(getPatternFromSherd(sherds.left()))[1], light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(DecoratedPotPatterns.fromSherd(sherds.right()))[2], light, overlay); + this.potPatternModels.get(getPatternFromSherd(sherds.right()))[2], light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(DecoratedPotPatterns.fromSherd(sherds.front()))[3], light, overlay); + this.potPatternModels.get(getPatternFromSherd(sherds.front()))[3], light, overlay); matrices.pop(); } } + private static RegistryKey getPatternFromSherd(Item item) { + RegistryKey registryKey = DecoratedPotPatterns.fromSherd(item); + if (registryKey == null) { + return DecoratedPotPatterns.fromSherd(Items.BRICK); + } + return registryKey; + } + @Override public void onModelsReload() { this.baseModel = null; From 8b95cdf45a724f6e9736f4959645038f1613b078 Mon Sep 17 00:00:00 2001 From: FoundationGames <43485105+FoundationGames@users.noreply.github.com> Date: Thu, 13 Jun 2024 12:23:26 -0700 Subject: [PATCH 2/2] Block entity renderers once again are notified of resource reloads --- gradle.properties | 2 +- .../model/misc/DecoratedPotModelSelector.java | 7 +++---- .../render/BlockEntityRendererOverride.java | 2 +- ...coratedPotBlockEntityRendererOverride.java | 20 +++++-------------- .../event/EBEEvents.java | 10 +++------- .../mixin/BakedModelManagerMixin.java | 20 ------------------- .../mixin/MinecraftClientMixin.java | 19 ++++++++++++++++++ .../enhancedblockentities.accesswidener | 2 ++ .../enhancedblockentities.mixins.json | 1 + 9 files changed, 35 insertions(+), 48 deletions(-) create mode 100644 src/main/java/foundationgames/enhancedblockentities/mixin/MinecraftClientMixin.java diff --git a/gradle.properties b/gradle.properties index b0712eb..b8b9172 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ loader_version=0.15.11 fabric_version=0.97.0+1.20.4 -mod_version = 0.10+1.20.4 +mod_version = 0.10.1+1.20.4 maven_group = foundationgames archives_base_name = enhancedblockentities diff --git a/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java b/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java index bdb6943..e13b290 100644 --- a/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java +++ b/src/main/java/foundationgames/enhancedblockentities/client/model/misc/DecoratedPotModelSelector.java @@ -8,7 +8,6 @@ import net.minecraft.block.DecoratedPotPatterns; import net.minecraft.block.entity.DecoratedPotBlockEntity; import net.minecraft.item.Item; -import net.minecraft.item.Items; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; @@ -83,13 +82,13 @@ public void writeModelIndices(BlockRenderView view, BlockState state, BlockPos p } private int getPatternIndex(Item sherd, int max) { - return MathHelper.clamp(this.potteryPatterns.indexOf(getPatternFromSherd(sherd)), 0, max - 1); + return MathHelper.clamp(this.potteryPatterns.indexOf(patternOf(sherd)), 0, max - 1); } - private static RegistryKey getPatternFromSherd(Item item) { + public static RegistryKey patternOf(Item item) { RegistryKey registryKey = DecoratedPotPatterns.fromSherd(item); if (registryKey == null) { - return DecoratedPotPatterns.fromSherd(Items.BRICK); + return DecoratedPotPatterns.DECORATED_POT_SIDE_KEY; } return registryKey; } diff --git a/src/main/java/foundationgames/enhancedblockentities/client/render/BlockEntityRendererOverride.java b/src/main/java/foundationgames/enhancedblockentities/client/render/BlockEntityRendererOverride.java index 2c5d237..cbb5bfa 100644 --- a/src/main/java/foundationgames/enhancedblockentities/client/render/BlockEntityRendererOverride.java +++ b/src/main/java/foundationgames/enhancedblockentities/client/render/BlockEntityRendererOverride.java @@ -13,7 +13,7 @@ public void render(BlockEntityRenderer renderer, BlockEntity blockE }; public BlockEntityRendererOverride() { - EBEEvents.RELOAD_MODELS.register((loader, manager, profiler) -> this.onModelsReload()); + EBEEvents.RESOURCE_RELOAD.register(this::onModelsReload); } public abstract void render(BlockEntityRenderer renderer, BlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay); diff --git a/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java b/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java index ea4b3d4..33b3c45 100644 --- a/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java +++ b/src/main/java/foundationgames/enhancedblockentities/client/render/entity/DecoratedPotBlockEntityRendererOverride.java @@ -2,10 +2,10 @@ import com.google.common.collect.ImmutableMap; import foundationgames.enhancedblockentities.client.model.ModelIdentifiers; +import foundationgames.enhancedblockentities.client.model.misc.DecoratedPotModelSelector; import foundationgames.enhancedblockentities.client.render.BlockEntityRendererOverride; import foundationgames.enhancedblockentities.util.EBEUtil; import foundationgames.enhancedblockentities.util.duck.BakedModelManagerAccess; -import net.minecraft.block.DecoratedPotPatterns; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.DecoratedPotBlockEntity; import net.minecraft.client.MinecraftClient; @@ -13,8 +13,6 @@ import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.Item; -import net.minecraft.item.Items; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.util.math.MathHelper; @@ -89,26 +87,18 @@ public void render(BlockEntityRenderer renderer, BlockEntity blockE EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, this.baseModel, light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(getPatternFromSherd(sherds.back()))[0], light, overlay); + this.potPatternModels.get(DecoratedPotModelSelector.patternOf(sherds.back()))[0], light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(getPatternFromSherd(sherds.left()))[1], light, overlay); + this.potPatternModels.get(DecoratedPotModelSelector.patternOf(sherds.left()))[1], light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(getPatternFromSherd(sherds.right()))[2], light, overlay); + this.potPatternModels.get(DecoratedPotModelSelector.patternOf(sherds.right()))[2], light, overlay); EBEUtil.renderBakedModel(vertexConsumers, blockEntity.getCachedState(), matrices, - this.potPatternModels.get(getPatternFromSherd(sherds.front()))[3], light, overlay); + this.potPatternModels.get(DecoratedPotModelSelector.patternOf(sherds.front()))[3], light, overlay); matrices.pop(); } } - private static RegistryKey getPatternFromSherd(Item item) { - RegistryKey registryKey = DecoratedPotPatterns.fromSherd(item); - if (registryKey == null) { - return DecoratedPotPatterns.fromSherd(Items.BRICK); - } - return registryKey; - } - @Override public void onModelsReload() { this.baseModel = null; diff --git a/src/main/java/foundationgames/enhancedblockentities/event/EBEEvents.java b/src/main/java/foundationgames/enhancedblockentities/event/EBEEvents.java index f863085..0c8918f 100644 --- a/src/main/java/foundationgames/enhancedblockentities/event/EBEEvents.java +++ b/src/main/java/foundationgames/enhancedblockentities/event/EBEEvents.java @@ -7,13 +7,9 @@ import net.minecraft.util.profiler.Profiler; public enum EBEEvents {; - public static final Event RELOAD_MODELS = EventFactory.createArrayBacked(Reload.class, (callbacks) -> (loader, manager, profiler) -> { - for (Reload event : callbacks) { - event.onReload(loader, manager, profiler); + public static final Event RESOURCE_RELOAD = EventFactory.createArrayBacked(Runnable.class, (callbacks) -> () -> { + for (var event : callbacks) { + event.run(); } }); - - public interface Reload { - void onReload(ModelLoader loader, ResourceManager manager, Profiler profiler); - } } diff --git a/src/main/java/foundationgames/enhancedblockentities/mixin/BakedModelManagerMixin.java b/src/main/java/foundationgames/enhancedblockentities/mixin/BakedModelManagerMixin.java index f8063ab..cf878e9 100644 --- a/src/main/java/foundationgames/enhancedblockentities/mixin/BakedModelManagerMixin.java +++ b/src/main/java/foundationgames/enhancedblockentities/mixin/BakedModelManagerMixin.java @@ -1,22 +1,13 @@ package foundationgames.enhancedblockentities.mixin; -import foundationgames.enhancedblockentities.event.EBEEvents; import foundationgames.enhancedblockentities.util.duck.BakedModelManagerAccess; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedModelManager; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resource.ResourceReloader; import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; 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.CallbackInfoReturnable; import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; @Mixin(BakedModelManager.class) public class BakedModelManagerMixin implements BakedModelManagerAccess { @@ -26,15 +17,4 @@ public class BakedModelManagerMixin implements BakedModelManagerAccess { public BakedModel enhanced_bes$getModel(Identifier id) { return this.models.get(id); } - - // Should invoke the EBE event after the model manager's block model cache is filled during a resource reload - @Inject(method = "reload", at = @At("TAIL")) - public void enhanced_bes$invokeReloadEvent(ResourceReloader.Synchronizer synchronizer, ResourceManager manager, - Profiler prepareProfiler, Profiler applyProfiler, Executor prepareExecutor, - Executor applyExecutor, CallbackInfoReturnable> cir) { - cir.getReturnValue().thenAccept(obj -> { - var result = (BakedModelManager.BakingResult)(Object)obj; - EBEEvents.RELOAD_MODELS.invoker().onReload(result.modelLoader(), manager, applyProfiler); - }); - } } diff --git a/src/main/java/foundationgames/enhancedblockentities/mixin/MinecraftClientMixin.java b/src/main/java/foundationgames/enhancedblockentities/mixin/MinecraftClientMixin.java new file mode 100644 index 0000000..99ab3c4 --- /dev/null +++ b/src/main/java/foundationgames/enhancedblockentities/mixin/MinecraftClientMixin.java @@ -0,0 +1,19 @@ +package foundationgames.enhancedblockentities.mixin; + +import foundationgames.enhancedblockentities.event.EBEEvents; +import net.minecraft.client.MinecraftClient; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.CompletableFuture; + +@Mixin(MinecraftClient.class) +public class MinecraftClientMixin { + @Inject(method = "reloadResources()Ljava/util/concurrent/CompletableFuture;", + at = @At("RETURN")) + private void enhanced_bes$fireReloadEvent(CallbackInfoReturnable> cir) { + cir.getReturnValue().thenAccept(v -> EBEEvents.RESOURCE_RELOAD.invoker().run()); + } +} diff --git a/src/main/resources/enhancedblockentities.accesswidener b/src/main/resources/enhancedblockentities.accesswidener index 8471e1d..015811d 100644 --- a/src/main/resources/enhancedblockentities.accesswidener +++ b/src/main/resources/enhancedblockentities.accesswidener @@ -2,3 +2,5 @@ accessWidener v2 named accessible class net/minecraft/client/option/SimpleOption$Callbacks accessible class net/minecraft/client/render/model/BakedModelManager$BakingResult + +accessible field net/minecraft/block/DecoratedPotPatterns DECORATED_POT_SIDE_KEY Lnet/minecraft/registry/RegistryKey; diff --git a/src/main/resources/enhancedblockentities.mixins.json b/src/main/resources/enhancedblockentities.mixins.json index 7dc7391..c458272 100644 --- a/src/main/resources/enhancedblockentities.mixins.json +++ b/src/main/resources/enhancedblockentities.mixins.json @@ -14,6 +14,7 @@ "DecoratedPotBlockEntityMixin", "EnderChestBlockEntityMixin", "LifecycledResourceManagerImplMixin", + "MinecraftClientMixin", "ShulkerBoxBlockEntityMixin", "SignBlockEntityRenderAccessor", "SignEditScreenMixin",