From 1317cbd37daf6390e3a1982888aaca89d2747b90 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 20 Jan 2024 21:09:18 +0800 Subject: [PATCH] Skip JiJ deps when present (#1011 #1184) --- .../boot/mod/ArclightJarInJarAdaptor.java | 77 +++++++++++++++++++ .../boot/mod/ArclightLocator_Forge.java | 1 + 2 files changed, 78 insertions(+) create mode 100644 arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightJarInJarAdaptor.java diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightJarInJarAdaptor.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightJarInJarAdaptor.java new file mode 100644 index 00000000..421f5a5e --- /dev/null +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightJarInJarAdaptor.java @@ -0,0 +1,77 @@ +package io.izzel.arclight.boot.mod; + +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator; +import net.minecraftforge.fml.loading.moddiscovery.ModDiscoverer; +import net.minecraftforge.forgespi.locating.IDependencyLocator; +import net.minecraftforge.forgespi.locating.IModFile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +public class ArclightJarInJarAdaptor implements IDependencyLocator { + + private static final Logger LOGGER = LoggerFactory.getLogger("ArclightJiJ"); + + private final IDependencyLocator delegate; + + public ArclightJarInJarAdaptor(IDependencyLocator delegate) { + this.delegate = delegate; + } + + @Override + public List scanMods(Iterable loadedMods) { + return delegate.scanMods(loadedMods).stream().filter(it -> { + var optional = getClass().getModule().getLayer().findModule(it.getModFileInfo().moduleName()); + optional.ifPresent(module -> LOGGER.info("Skip jij dependency {}@{} because Arclight has {}", + it.getModFileInfo().moduleName(), it.getModFileInfo().versionString(), module.getDescriptor().toNameAndVersion())); + return optional.isEmpty(); + }).toList(); + } + + @Override + public String name() { + return "arclight_jij"; + } + + @Override + public void scanFile(IModFile modFile, Consumer pathConsumer) { + delegate.scanFile(modFile, pathConsumer); + } + + @Override + public void initArguments(Map arguments) { + delegate.initArguments(arguments); + } + + @Override + public boolean isValid(IModFile modFile) { + return delegate.isValid(modFile); + } + + @SuppressWarnings("unchecked") + static void inject() { + try { + var field = FMLLoader.class.getDeclaredField("modDiscoverer"); + field.setAccessible(true); + var discoverer = (ModDiscoverer) field.get(null); + var locatorField = ModDiscoverer.class.getDeclaredField("dependencyLocatorList"); + locatorField.setAccessible(true); + var locatorList = (List) locatorField.get(discoverer); + var newList = locatorList.stream().map(it -> { + if (it instanceof JarInJarDependencyLocator) { + return new ArclightJarInJarAdaptor(it); + } else { + return it; + } + }).toList(); + locatorField.set(discoverer, newList); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java index 627cd92d..655ac26f 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java @@ -35,6 +35,7 @@ public class ArclightLocator_Forge implements IModLocator { @Override public List scanMods() { + ArclightJarInJarAdaptor.inject(); return List.of(new ModFileOrException(arclight, null)); }