From e22f5caec7ebee1796374ad737cda45e71bdfac7 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:18:18 -0400 Subject: [PATCH 1/4] Fix registry progress bar going off end of screen in NeoForge --- .../GameDataMixin.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/feature/registry_event_progress/GameDataMixin.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/feature/registry_event_progress/GameDataMixin.java index 4170b69d..4302fdf2 100644 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/feature/registry_event_progress/GameDataMixin.java +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/feature/registry_event_progress/GameDataMixin.java @@ -1,6 +1,7 @@ package org.embeddedt.modernfix.neoforge.mixin.feature.registry_event_progress; import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.EventPriority; import net.neoforged.fml.ModList; import net.neoforged.fml.ModLoader; import net.neoforged.fml.ModLoadingContext; @@ -36,17 +37,25 @@ public class GameDataMixin { @Redirect(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModLoader;postEventWrapContainerInModOrder(Lnet/neoforged/bus/api/Event;)V")) private static void swapThreadAndPost(ModLoader loader, T event) { RegisterEvent registryEvent = (RegisterEvent)event; - var pb = StartupMessageManager.addProgressBar(registryEvent.getRegistryKey().location().toString(), ModList.get().size()); - try { - loader.postEventWithWrapInModOrder(event, (mc, e) -> { - ModLoadingContext.get().setActiveContainer(mc); - pb.label(pb.name() + " - " + mc.getModInfo().getDisplayName()); - pb.increment(); - }, (mc, e) -> { - ModLoadingContext.get().setActiveContainer(null); - }); - } finally { - pb.complete(); + // We control phases ourselves so we can make a separate progress bar for each phase. + String registryName = registryEvent.getRegistryKey().location().toString(); + for(EventPriority phase : EventPriority.values()) { + var pb = StartupMessageManager.addProgressBar(registryName, ModList.get().size()); + try { + ModList.get().forEachModInOrder(mc -> { + ModLoadingContext.get().setActiveContainer(mc); + pb.label(pb.name() + " - " + mc.getModInfo().getDisplayName()); + pb.increment(); + var bus = mc.getEventBus(); + if(bus != null) { + bus.post(phase, event); + } + ModLoadingContext.get().setActiveContainer(null); + }); + } finally { + pb.complete(); + } } + } } From 06726296fe46bdd86e8c6e498ef82ad37d523d8f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:52:41 -0400 Subject: [PATCH 2/4] Speed up ModelBakeEventHelper constructor --- .../forge/dynresources/ModelBakeEventHelper.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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 index 1aa4609f..19bf81d0 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -5,10 +5,11 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.common.graph.GraphBuilder; import com.google.common.graph.MutableGraph; +import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelResourceLocation; 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.fml.ModContainer; @@ -16,7 +17,6 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.forgespi.language.IModInfo; import net.minecraftforge.registries.ForgeRegistries; import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; import org.embeddedt.modernfix.util.ForwardingInclDefaultsMap; import org.jetbrains.annotations.Nullable; @@ -40,14 +40,13 @@ public class ModelBakeEventHelper { public ModelBakeEventHelper(Map modelRegistry) { this.modelRegistry = modelRegistry; this.topLevelModelLocations = new HashSet<>(modelRegistry.keySet()); + // Skip going through ModelLocationCache because most of the accesses will be misses for(Block block : ForgeRegistries.BLOCKS) { for(BlockState state : block.getStateDefinition().getPossibleStates()) { - topLevelModelLocations.add(ModelLocationCache.get(state)); + topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(state)); } } - for(Item item : ForgeRegistries.ITEMS) { - topLevelModelLocations.add(ModelLocationCache.get(item)); - } + ForgeRegistries.ITEMS.getKeys().forEach(key -> topLevelModelLocations.add(new ModelResourceLocation(key, "inventory"))); this.dependencyGraph = GraphBuilder.undirected().build(); ModList.get().forEachModContainer((id, mc) -> { this.dependencyGraph.addNode(id); From 31cc0a0da0db9e9539047d1b593c6d8deb15a12b Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:55:07 -0400 Subject: [PATCH 3/4] Retrieve block name once per state --- .../modernfix/forge/dynresources/ModelBakeEventHelper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index 19bf81d0..9e804465 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -42,8 +42,9 @@ public class ModelBakeEventHelper { this.topLevelModelLocations = new HashSet<>(modelRegistry.keySet()); // Skip going through ModelLocationCache because most of the accesses will be misses for(Block block : ForgeRegistries.BLOCKS) { + ResourceLocation name = block.delegate.name(); for(BlockState state : block.getStateDefinition().getPossibleStates()) { - topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(state)); + topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(name, state)); } } ForgeRegistries.ITEMS.getKeys().forEach(key -> topLevelModelLocations.add(new ModelResourceLocation(key, "inventory"))); From e39cc1ca15e4f9b19bbe2e9d5931a1dbef928505 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:00:08 -0400 Subject: [PATCH 4/4] Update for Forge registry changes --- .../dynresources/ModelBakeEventHelper.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) 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 index 9e804465..1ad2f7ae 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -10,7 +10,6 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModList; @@ -20,7 +19,14 @@ import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.util.ForwardingInclDefaultsMap; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.function.BiFunction; /** @@ -41,12 +47,12 @@ public class ModelBakeEventHelper { this.modelRegistry = modelRegistry; this.topLevelModelLocations = new HashSet<>(modelRegistry.keySet()); // Skip going through ModelLocationCache because most of the accesses will be misses - for(Block block : ForgeRegistries.BLOCKS) { - ResourceLocation name = block.delegate.name(); - for(BlockState state : block.getStateDefinition().getPossibleStates()) { - topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(name, state)); + ForgeRegistries.BLOCKS.getEntries().forEach(entry -> { + var location = entry.getKey().location(); + for(BlockState state : entry.getValue().getStateDefinition().getPossibleStates()) { + topLevelModelLocations.add(BlockModelShaper.stateToModelLocation(location, state)); } - } + }); ForgeRegistries.ITEMS.getKeys().forEach(key -> topLevelModelLocations.add(new ModelResourceLocation(key, "inventory"))); this.dependencyGraph = GraphBuilder.undirected().build(); ModList.get().forEachModContainer((id, mc) -> {