diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 4e973f57..a3c39583 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -61,6 +61,7 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.BiFunction; @@ -247,7 +248,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { */ private void gatherModelMaterials(Set materialSet) { Stopwatch stopwatch = Stopwatch.createStarted(); - List>> blockStateData = new ArrayList<>(); final Object2IntOpenHashMap blockstateErrors = new Object2IntOpenHashMap<>(); /* * First, gather all vanilla packs, and use listResources on them. This will allow us to (hopefully) avoid @@ -280,23 +280,31 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { allAvailableStates.clear(); allAvailableStates.trim(); - + ConcurrentLinkedQueue> blockStateLoadedFiles = new ConcurrentLinkedQueue<>(); + List> blockStateData = new ArrayList<>(); for(ResourceLocation blockstate : blockStateFiles) { - blockStateData.add(CompletableFuture.supplyAsync(() -> { + blockStateData.add(CompletableFuture.runAsync(() -> { ResourceLocation fileLocation = new ResourceLocation(blockstate.getNamespace(), "blockstates/" + blockstate.getPath() + ".json"); - try(Resource resource = this.resourceManager.getResource(fileLocation)) { - JsonParser parser = new JsonParser(); - return Pair.of(blockstate, parser.parse(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8))); - } catch(IOException | JsonParseException e) { + try { + List resources = this.resourceManager.getResources(fileLocation); + for(Resource resource : resources) { + JsonParser parser = new JsonParser(); + try { + blockStateLoadedFiles.add(Pair.of(blockstate, parser.parse(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)))); + } catch(JsonParseException e) { + logOrSuppressError(blockstateErrors, "blockstate", blockstate, e); + } finally { + resource.close(); + } + } + } catch(IOException e) { logOrSuppressError(blockstateErrors, "blockstate", blockstate, e); } - return Pair.of(blockstate, null); }, ModernFix.resourceReloadExecutor())); } blockStateFiles = null; CompletableFuture.allOf(blockStateData.toArray(new CompletableFuture[0])).join(); - for(CompletableFuture> result : blockStateData) { - Pair pair = result.join(); + for(Pair pair : blockStateLoadedFiles) { if(pair.getSecond() != null) { try { JsonObject obj = pair.getSecond().getAsJsonObject(); @@ -349,6 +357,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { }); blockstateErrors.clear(); blockStateData = null; + blockStateLoadedFiles.clear(); /* figure out which models we should actually load */ gatherAdditionalViaManualScan(allPackResources, allAvailableModels, modelFiles, "models/");