From c1277a2bf55f65e88d6ee56c82957cd7abfdb18b Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 5 Aug 2023 11:42:44 -0400 Subject: [PATCH 1/2] Make a copy of the top-level model list when collecting materials This should prevent CMEs if material collection triggers a model load --- .../mixin/perf/dynamic_resources/ModelBakeryMixin.java | 9 +++++++++ .../mixin/perf/dynamic_resources/ModelBakeryMixin.java | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java index d9977015..30281a73 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -230,6 +230,15 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { pack instanceof FilePackResources; } + /** + * Make a copy of the top-level model list and stream that to avoid CMEs if the getMaterials call triggers a model + * load. + */ + @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/Collection;stream()Ljava/util/stream/Stream;", ordinal = 0)) + private Stream getModelStream(Collection modelCollection) { + return new ArrayList<>(modelCollection).stream(); + } + @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;collect(Ljava/util/stream/Collector;)Ljava/lang/Object;", ordinal = 0)) private Object collectExtraTextures(Stream instance, Collector arCollector) { Set materialsSet = new ObjectOpenHashSet<>(instance.collect(Collectors.toSet())); diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java index f3bdb7d6..88fc3a5e 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -53,6 +53,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.Function; +import java.util.stream.Stream; /* high priority so that our injectors are added before other mods' */ @Mixin(value = ModelBakery.class, priority = 600) @@ -162,6 +163,15 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { } } + /** + * Make a copy of the top-level model list and stream that to avoid CMEs if the getMaterials call triggers a model + * load. + */ + @Redirect(method = "processLoading", at = @At(value = "INVOKE", target = "Ljava/util/Collection;stream()Ljava/util/stream/Stream;", ordinal = 0)) + private Stream getModelStream(Collection modelCollection) { + return new ArrayList<>(modelCollection).stream(); + } + @Redirect(method = "processLoading", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/ForgeHooksClient;gatherFluidTextures(Ljava/util/Set;)V", remap = false)) private void gatherModelTextures(Set materialSet) { ForgeHooksClient.gatherFluidTextures(materialSet); From 371e5119f10cf6742745fa4601fed506a164e0b9 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 5 Aug 2023 12:07:21 -0400 Subject: [PATCH 2/2] Never return a non-null model if it was top level in vanilla --- .../DynamicBakedModelProvider.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index 9ecb0f2f..40de0d2d 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -9,8 +9,11 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.Direction; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import org.apache.commons.lang3.tuple.Triple; import org.embeddedt.modernfix.ModernFix; @@ -103,6 +106,25 @@ public class DynamicBakedModelProvider implements Map blockOpt = Registry.BLOCK.getOptional(registryKey); + if(blockOpt.isPresent()) { + return ModelBakeryHelpers.getBlockStatesForMRL(blockOpt.get().getStateDefinition(), mrl).size() > 0; + } + } catch(RuntimeException ignored) { + // can occur if the MRL is not valid for that blockstate, ignore + } + } + return false; + } @Override public BakedModel get(Object o) { @@ -117,11 +139,11 @@ public class DynamicBakedModelProvider implements Map