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