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 f3186d68..4d31e0ef 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 @@ -233,6 +233,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 cf79d6c6..79b529f0 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 @@ -58,6 +58,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) @@ -169,6 +170,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 = "", 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 = "Lnet/minecraftforge/client/ForgeHooksClient;gatherFluidTextures(Ljava/util/Set;)V", remap = false), remap = false) private void gatherModelTextures(Set materialSet) { ForgeHooksClient.gatherFluidTextures(materialSet);