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] 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();