From 1b6880ed9fbe3f1a10ae7c5452746698999ebc14 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 6 Jul 2023 20:43:35 -0400 Subject: [PATCH] Make modelRegistry.keySet() more accurate on Forge when dynamic resources is on --- .../dynresources/ModelBakeEventHelper.java | 51 +++++++++++++++++++ .../ForgeHooksClientMixin.java | 22 ++++++++ .../ctm/TextureMetadataHandlerMixin.java | 7 ++- 3 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ForgeHooksClientMixin.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java new file mode 100644 index 00000000..51ad6bf9 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -0,0 +1,51 @@ +package org.embeddedt.modernfix.forge.dynresources; + +import com.google.common.collect.ForwardingMap; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; +import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class ModelBakeEventHelper { + public static Map wrapRegistry(Map modelRegistry) { + Set topLevelModelLocations = new HashSet<>(modelRegistry.keySet()); + for(Block block : ForgeRegistries.BLOCKS) { + for(BlockState state : block.getStateDefinition().getPossibleStates()) { + topLevelModelLocations.add(ModelLocationCache.get(state)); + } + } + for(Item item : ForgeRegistries.ITEMS) { + topLevelModelLocations.add(ModelLocationCache.get(item)); + } + return new ForwardingMap() { + @Override + protected Map delegate() { + return modelRegistry; + } + + @Override + public Set keySet() { + return topLevelModelLocations; + } + + @Override + public boolean containsKey(@Nullable Object key) { + return topLevelModelLocations.contains(key) || super.containsKey(key); + } + + @Override + public BakedModel put(ResourceLocation key, BakedModel value) { + topLevelModelLocations.add(key); + return super.put(key, value); + } + }; + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ForgeHooksClientMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ForgeHooksClientMixin.java new file mode 100644 index 00000000..1e130b7f --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ForgeHooksClientMixin.java @@ -0,0 +1,22 @@ +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources; + +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.ForgeHooksClient; +import org.embeddedt.modernfix.forge.dynresources.ModelBakeEventHelper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.util.Map; + +@Mixin(ForgeHooksClient.class) +public class ForgeHooksClientMixin { + /** + * Generate a more realistic keySet that contains every item and block model location, to help with mod compat. + */ + @ModifyVariable(method = "onModelBake", at = @At("HEAD"), ordinal = 0, argsOnly = true) + private static Map generateModelKeySet(Map modelRegistry) { + return ModelBakeEventHelper.wrapRegistry(modelRegistry); + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java index c7ecb7ab..8d79ddba 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java @@ -12,7 +12,6 @@ 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import team.chisel.ctm.CTM; import team.chisel.ctm.client.model.AbstractCTMBakedModel; @@ -36,9 +35,9 @@ public abstract class TextureMetadataHandlerMixin implements ModernFixClientInte ModernFixClient.CLIENT_INTEGRATIONS.add(this); } - @Redirect(method = "onModelBake", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/BakedModel;isCustomRenderer()Z")) - private boolean checkModelValid(BakedModel model) { - return model == null || model.isCustomRenderer(); + @Inject(method = "onModelBake", at = @At("HEAD"), cancellable = true, remap = false) + private void noIteration(CallbackInfo ci) { + ci.cancel(); } @Override