diff --git a/src/main/java/io/gitlab/jfronny/modsmod/FabricLoaderInterface.java b/src/main/java/io/gitlab/jfronny/modsmod/FabricLoaderInterface.java index 0cd0462..9ada912 100644 --- a/src/main/java/io/gitlab/jfronny/modsmod/FabricLoaderInterface.java +++ b/src/main/java/io/gitlab/jfronny/modsmod/FabricLoaderInterface.java @@ -9,6 +9,7 @@ import org.apache.logging.log4j.Logger; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -38,7 +39,15 @@ public class FabricLoaderInterface { public static void synchronize(FabricLoader fabricLoader) { try { - modsField.set(fabricLoader, Collections.synchronizedList((List)modsField.get(fabricLoader))); + modsField.set(fabricLoader, new IteratorCallbackList((List)modsField.get(fabricLoader), + (s) -> { + try { + modsField.set(fabricLoader, s); + } catch (IllegalAccessException e) { + logger.error("Failed to reset mods field", e); + e.printStackTrace(); + } + })); } catch (IllegalAccessException e) { logger.error("Failed to make mods list synchronized.", e); throw new IllegalStateException(e); @@ -62,22 +71,4 @@ public class FabricLoaderInterface { throw new IllegalStateException(e); } } - - /*public static int getModCount(FabricLoader fabricLoader) { - try { - return abstractListModCount.getInt(getMods(fabricLoader)); - } catch (IllegalAccessException e) { - logger.error("Failed to get modCount from fabric-loader.", e); - throw new IllegalStateException(e); - } - } - - public static void setModCount(FabricLoader fabricLoader, int modCount) { - try { - abstractListModCount.setInt(getMods(fabricLoader), modCount); - } catch (IllegalAccessException e) { - logger.error("Failed to set modCount in fabric-loader.", e); - throw new IllegalStateException(e); - } - }*/ } diff --git a/src/main/java/io/gitlab/jfronny/modsmod/IteratorCallbackList.java b/src/main/java/io/gitlab/jfronny/modsmod/IteratorCallbackList.java new file mode 100644 index 0000000..24752ed --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/modsmod/IteratorCallbackList.java @@ -0,0 +1,143 @@ +package io.gitlab.jfronny.modsmod; + +import net.fabricmc.loader.ModContainer; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.Consumer; + +public class IteratorCallbackList implements List { + private List containers; + private Consumer> reset; + boolean modified = false; + public IteratorCallbackList(List base, Consumer> reset) { + containers = Collections.synchronizedList(base); + this.reset = reset; + } + + @Override + public int size() { + return containers.size(); + } + + @Override + public boolean isEmpty() { + return containers.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return containers.contains(o); + } + + @NotNull + @Override + public Iterator iterator() { + if (!modified) { + PreLaunch.init(); + modified = true; + } + reset.accept(containers); + return containers.iterator(); + } + + @NotNull + @Override + public Object[] toArray() { + return containers.toArray(); + } + + @NotNull + @Override + public T[] toArray(@NotNull T[] ts) { + return containers.toArray(ts); + } + + @Override + public boolean add(ModContainer modContainer) { + return containers.add(modContainer); + } + + @Override + public boolean remove(Object o) { + return containers.remove(o); + } + + @Override + public boolean containsAll(@NotNull Collection collection) { + return containers.containsAll(collection); + } + + @Override + public boolean addAll(@NotNull Collection collection) { + return containers.addAll(collection); + } + + @Override + public boolean addAll(int i, @NotNull Collection collection) { + return containers.addAll(i, collection); + } + + @Override + public boolean removeAll(@NotNull Collection collection) { + return containers.removeAll(collection); + } + + @Override + public boolean retainAll(@NotNull Collection collection) { + return containers.removeAll(collection); + } + + @Override + public void clear() { + containers.clear(); + } + + @Override + public ModContainer get(int i) { + return containers.get(i); + } + + @Override + public ModContainer set(int i, ModContainer modContainer) { + return containers.set(i, modContainer); + } + + @Override + public void add(int i, ModContainer modContainer) { + containers.add(i, modContainer); + } + + @Override + public ModContainer remove(int i) { + return containers.remove(i); + } + + @Override + public int indexOf(Object o) { + return containers.indexOf(o); + } + + @Override + public int lastIndexOf(Object o) { + return containers.lastIndexOf(o); + } + + @NotNull + @Override + public ListIterator listIterator() { + return containers.listIterator(); + } + + @NotNull + @Override + public ListIterator listIterator(int i) { + return containers.listIterator(i); + } + + @NotNull + @Override + public List subList(int i, int i1) { + return containers.subList(i, i1); + } +} diff --git a/src/main/java/io/gitlab/jfronny/modsmod/ModsModAdapter.java b/src/main/java/io/gitlab/jfronny/modsmod/ModsModAdapter.java index 3f866f0..c68e5fd 100644 --- a/src/main/java/io/gitlab/jfronny/modsmod/ModsModAdapter.java +++ b/src/main/java/io/gitlab/jfronny/modsmod/ModsModAdapter.java @@ -1,14 +1,12 @@ package io.gitlab.jfronny.modsmod; import net.fabricmc.loader.api.LanguageAdapter; -import net.fabricmc.loader.api.LanguageAdapterException; -import net.fabricmc.loader.api.ModContainer; public class ModsModAdapter implements LanguageAdapter { @Override public native T create(net.fabricmc.loader.api.ModContainer mod, String value, Class type); static { - new PreLaunch().onPrePrePreLaunch(); + PreLaunch.prepare(); } } diff --git a/src/main/java/io/gitlab/jfronny/modsmod/PreLaunch.java b/src/main/java/io/gitlab/jfronny/modsmod/PreLaunch.java index 11ad6e6..b7f24e6 100644 --- a/src/main/java/io/gitlab/jfronny/modsmod/PreLaunch.java +++ b/src/main/java/io/gitlab/jfronny/modsmod/PreLaunch.java @@ -26,8 +26,10 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class PreLaunch { - public void onPrePrePreLaunch() { - FabricLoader loader = FabricLoader.INSTANCE; + static HashSet m; + static FabricLoader loader; + public static void prepare() { + loader = FabricLoader.INSTANCE; //Load config AutoConfig.register(Cfg.class, JanksonConfigSerializer::new); Cfg cfg = AutoConfig.getConfigHolder(Cfg.class).getConfig(); @@ -60,7 +62,7 @@ public class PreLaunch { System.err.println("Failed to validate modsmod config cache, caching will not be available"); e.printStackTrace(); } - HashSet m = new HashSet<>(); + m = new HashSet<>(); //Generate mods for (int i = 0; i < cfg.modsCount; i++) { File f = new File(path, "f" + (i + 1) + ".jar"); @@ -108,15 +110,16 @@ public class PreLaunch { } System.gc(); } - //FabricLoaderInterface.synchronize(loader); - //int oldCount = FabricLoaderInterface.getModCount(loader); + FabricLoaderInterface.synchronize(loader); + } + + public static void init() { for (File f : m) { loadMod(loader, f.toPath()); } - //FabricLoaderInterface.setModCount(loader, oldCount); } - private void loadMod(FabricLoader loader, Path modPath) { + private static void loadMod(FabricLoader loader, Path modPath) { ModCandidate candidate = parseMod(modPath); if (loader.isDevelopmentEnvironment()) { @@ -127,7 +130,7 @@ public class PreLaunch { FabricLauncherBase.getLauncher().propose(candidate.getOriginUrl()); } - private ModCandidate parseMod(Path modPath) { + private static ModCandidate parseMod(Path modPath) { try { FileSystemUtil.FileSystemDelegate jarFs = FileSystemUtil.getJarFileSystem(modPath, false);