From 9994b086fb5ba855bc97c0ed7b18386b938045b7 Mon Sep 17 00:00:00 2001 From: Eldrinn-Elantey <46845681+Eldrinn-Elantey@users.noreply.github.com> Date: Sun, 1 Mar 2026 20:10:21 +0400 Subject: [PATCH 1/3] Fix resource pack reset on client startup Avoid resetting selected resource packs during BetterLoadingScreen startup. - replace fragile reflection that grabbed an arbitrary List field in Minecraft with targeted lookup of defaultResourcePacks (and SRG fallback) - add safe fallback that detects the default pack list by mcDefaultResourcePack - stop calling mc.refreshResources() during early loading path - inject/remove BLS pack only through defaultResourcePacks with null/dup checks Result: selected packs (including symlink-based packs) are no longer dropped on startup. --- .../alexiil/mods/load/MinecraftDisplayer.java | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/alexiil/mods/load/MinecraftDisplayer.java b/src/main/java/alexiil/mods/load/MinecraftDisplayer.java index 2b49b6f..42e5596 100644 --- a/src/main/java/alexiil/mods/load/MinecraftDisplayer.java +++ b/src/main/java/alexiil/mods/load/MinecraftDisplayer.java @@ -35,6 +35,7 @@ import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.resources.DefaultResourcePack; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.LanguageManager; import net.minecraft.util.ResourceLocation; @@ -209,18 +210,40 @@ public MinecraftDisplayer(boolean preview) { } @SuppressWarnings("unchecked") - private List getOnlyList() { + private List getDefaultResourcePackList() { + try { + for (String fieldName : new String[] { "defaultResourcePacks", "field_110449_ao" }) { + try { + Field f = mc.getClass().getDeclaredField(fieldName); + if (!List.class.isAssignableFrom(f.getType()) || Modifier.isStatic(f.getModifiers())) { + continue; + } + f.setAccessible(true); + return (List) f.get(mc); + } catch (NoSuchFieldException ignored) {} + } + } catch (Throwable t) { + BetterLoadingScreen.log.warn("Failed to access minecraft default resource packs by field name", t); + } + + // Fallback for unknown mappings/JVMs: look for the list that contains the vanilla default pack instance. + final DefaultResourcePack defaultPack = mc.mcDefaultResourcePack; Field[] flds = mc.getClass().getDeclaredFields(); for (Field f : flds) { if (f.getType().equals(List.class) && !Modifier.isStatic(f.getModifiers())) { f.setAccessible(true); try { - return (List) f.get(mc); + List list = (List) f.get(mc); + if (list != null && defaultPack != null && list.contains(defaultPack)) { + return (List) list; + } } catch (Throwable e) { e.printStackTrace(); } } } + BetterLoadingScreen.log + .warn("Could not find default resource pack list, continuing without BLS pack injection"); return null; } @@ -703,8 +726,10 @@ public void open(Configuration cfg) { if (!ProgressDisplayer.coreModLocation.isDirectory()) myPack = new FMLFileResourcePack(ProgressDisplayer.modContainer); else myPack = new FMLFolderResourcePack(ProgressDisplayer.modContainer); - getOnlyList().add(myPack); - mc.refreshResources(); + List defaultPacks = getDefaultResourcePackList(); + if (defaultPacks != null && !defaultPacks.contains(myPack)) { + defaultPacks.add(myPack); + } } handleTips(); @@ -1222,7 +1247,6 @@ private FontRenderer fontRenderer(String fontTexture) { font.onResourceManagerReload(mc.getResourceManager()); font.setUnicodeFlag(mc.func_152349_b()); if (!preview) { - mc.refreshResources(); font.onResourceManagerReload(mc.getResourceManager()); } fontRenderers.put(fontTexture, font); @@ -1454,7 +1478,6 @@ private void preDisplayScreen() { textureManager = mc.renderEngine; } else { textureManager = mc.renderEngine = new TextureManager(mc.getResourceManager()); - mc.refreshResources(); textureManager.onResourceManagerReload(mc.getResourceManager()); mc.fontRenderer = new FontRenderer( mc.gameSettings, @@ -1529,7 +1552,10 @@ public void close() { if (backgroundExec != null) { backgroundExec.shutdown(); } - getOnlyList().remove(myPack); + List defaultPacks = getDefaultResourcePackList(); + if (defaultPacks != null) { + defaultPacks.remove(myPack); + } if (imgurCacheManager != null) { imgurCacheManager.cleanUp(); From 0854326abb8dedb2e91862280cdedc37916bff54 Mon Sep 17 00:00:00 2001 From: Eldrinn-Elantey <46845681+Eldrinn-Elantey@users.noreply.github.com> Date: Fri, 13 Mar 2026 13:06:41 +0400 Subject: [PATCH 2/3] Replace reflection with AT for defaultResourcePacks access - Add access transformer (bls_at.cfg) to expose Minecraft.defaultResourcePacks (field_110449_ao) - Replace fragile reflection-based getDefaultResourcePackList() with a direct field access - Remove unused import of java.lang.reflect.Modifier --- gradle.properties | 2 +- .../alexiil/mods/load/MinecraftDisplayer.java | 37 +------------------ src/main/resources/META-INF/bls_at.cfg | 2 + 3 files changed, 4 insertions(+), 37 deletions(-) create mode 100644 src/main/resources/META-INF/bls_at.cfg diff --git a/gradle.properties b/gradle.properties index e259aed..ea9cc40 100644 --- a/gradle.properties +++ b/gradle.properties @@ -71,7 +71,7 @@ apiPackage = # Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/ # There can be multiple files in a space-separated list. # Example value: mymodid_at.cfg nei_at.cfg -accessTransformersFile = +accessTransformersFile = bls_at.cfg # Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! usesMixins = false diff --git a/src/main/java/alexiil/mods/load/MinecraftDisplayer.java b/src/main/java/alexiil/mods/load/MinecraftDisplayer.java index 42e5596..a85c269 100644 --- a/src/main/java/alexiil/mods/load/MinecraftDisplayer.java +++ b/src/main/java/alexiil/mods/load/MinecraftDisplayer.java @@ -14,7 +14,6 @@ import java.io.OutputStream; import java.io.PrintStream; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -35,7 +34,6 @@ import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.resources.DefaultResourcePack; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.LanguageManager; import net.minecraft.util.ResourceLocation; @@ -211,40 +209,7 @@ public MinecraftDisplayer(boolean preview) { @SuppressWarnings("unchecked") private List getDefaultResourcePackList() { - try { - for (String fieldName : new String[] { "defaultResourcePacks", "field_110449_ao" }) { - try { - Field f = mc.getClass().getDeclaredField(fieldName); - if (!List.class.isAssignableFrom(f.getType()) || Modifier.isStatic(f.getModifiers())) { - continue; - } - f.setAccessible(true); - return (List) f.get(mc); - } catch (NoSuchFieldException ignored) {} - } - } catch (Throwable t) { - BetterLoadingScreen.log.warn("Failed to access minecraft default resource packs by field name", t); - } - - // Fallback for unknown mappings/JVMs: look for the list that contains the vanilla default pack instance. - final DefaultResourcePack defaultPack = mc.mcDefaultResourcePack; - Field[] flds = mc.getClass().getDeclaredFields(); - for (Field f : flds) { - if (f.getType().equals(List.class) && !Modifier.isStatic(f.getModifiers())) { - f.setAccessible(true); - try { - List list = (List) f.get(mc); - if (list != null && defaultPack != null && list.contains(defaultPack)) { - return (List) list; - } - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - BetterLoadingScreen.log - .warn("Could not find default resource pack list, continuing without BLS pack injection"); - return null; + return mc.defaultResourcePacks; } public void openPreview(ImageRender[] renders) { diff --git a/src/main/resources/META-INF/bls_at.cfg b/src/main/resources/META-INF/bls_at.cfg new file mode 100644 index 0000000..9b9bd2a --- /dev/null +++ b/src/main/resources/META-INF/bls_at.cfg @@ -0,0 +1,2 @@ +# Make Minecraft.defaultResourcePacks accessible +public net.minecraft.client.Minecraft field_110449_ao # defaultResourcePacks \ No newline at end of file From 0c52c42d377f64b1a5d8d5b6b62c38e551780747 Mon Sep 17 00:00:00 2001 From: Eldrinn-Elantey <46845681+Eldrinn-Elantey@users.noreply.github.com> Date: Fri, 13 Mar 2026 19:45:15 +0400 Subject: [PATCH 3/3] Update MinecraftDisplayer.java remove null-check --- src/main/java/alexiil/mods/load/MinecraftDisplayer.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/alexiil/mods/load/MinecraftDisplayer.java b/src/main/java/alexiil/mods/load/MinecraftDisplayer.java index a85c269..b3ae8c0 100644 --- a/src/main/java/alexiil/mods/load/MinecraftDisplayer.java +++ b/src/main/java/alexiil/mods/load/MinecraftDisplayer.java @@ -692,7 +692,7 @@ public void open(Configuration cfg) { myPack = new FMLFileResourcePack(ProgressDisplayer.modContainer); else myPack = new FMLFolderResourcePack(ProgressDisplayer.modContainer); List defaultPacks = getDefaultResourcePackList(); - if (defaultPacks != null && !defaultPacks.contains(myPack)) { + if (!defaultPacks.contains(myPack)) { defaultPacks.add(myPack); } } @@ -1517,10 +1517,7 @@ public void close() { if (backgroundExec != null) { backgroundExec.shutdown(); } - List defaultPacks = getDefaultResourcePackList(); - if (defaultPacks != null) { - defaultPacks.remove(myPack); - } + getDefaultResourcePackList().remove(myPack); if (imgurCacheManager != null) { imgurCacheManager.cleanUp();