Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,14 @@ subprojects {
def javaVersions = [
"compatibility": 16,
"modlauncher9": 16,
"forge37": 16,
"forge40": 17,
"forge41": 17,
"forge49": 17,
"neoforge1": 17,
"neoforge4": 21,
"modlauncher10": 17,
"modlauncher11": 21,
]
java.toolchain.languageVersion.set(JavaLanguageVersion.of(javaVersions.getOrDefault(project.name, 8)))

Expand Down
5 changes: 5 additions & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,14 @@ include(":stage2:modlauncher")
include(":stage2:modlauncher8")
include(":stage2:modlauncher9")
include(":stage2:modlauncher9:compatibility")
include(":stage2:modlauncher9:forge37")
include(":stage2:modlauncher9:forge40")
include(":stage2:modlauncher9:forge41")
include(":stage2:modlauncher9:forge49")
include(":stage2:modlauncher9:neoforge1")
include(":stage2:modlauncher9:neoforge4")
include(":stage2:modlauncher9:modlauncher10")
include(":stage2:modlauncher9:modlauncher11")
include(":integrationTest:common")
include(":integrationTest:fabric")
include(":integrationTest:launchwrapper")
Expand Down
2 changes: 1 addition & 1 deletion stage0/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = "1.2.3"
version = "1.2.4"

configure(subprojects.findAll { it.name != "common" && it.name != "modlauncher" }) {
apply plugin: 'maven-publish'
Expand Down
3 changes: 2 additions & 1 deletion stage1/modlauncher9/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ dependencies {
compileOnly("net.sf.jopt-simple:jopt-simple:5.0.4")
compileOnly("org.jetbrains:annotations:21.0.1")

compileOnly("net.minecraftforge:fmlloader:1.17.1-37.0.82")
// provided by fmlloader (both forge and neoforge ones)
compileOnly("org.apache.logging.log4j:log4j-api:2.14.1")
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import cpw.mods.modlauncher.api.NamedPath;
import gg.essential.loader.stage1.util.FallbackTransformationService;
import gg.essential.loader.stage1.util.IDelegatingTransformationService;
import net.minecraftforge.fml.loading.ModDirTransformerDiscoverer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down Expand Up @@ -44,7 +43,18 @@ private void setupSourceFile(final Path sourceFile) throws Exception {

// Forge will by default ignore a mod file if it contains an implementation of ITransformationService
// So we need to remove ourselves from that exclusion list
Field foundField = ModDirTransformerDiscoverer.class.getDeclaredField("found");
Class<?> cls;
try {
cls = Class.forName("net.minecraftforge.fml.loading.ModDirTransformerDiscoverer");
} catch (ClassNotFoundException e1) {
try {
cls = Class.forName("net.neoforged.fml.loading.ModDirTransformerDiscoverer");
} catch (ClassNotFoundException e2) {
e2.addSuppressed(e1);
throw e2;
}
}
Field foundField = cls.getDeclaredField("found");
foundField.setAccessible(true);
((List<NamedPath>) foundField.get(null)).removeIf(namedPath ->
Arrays.stream(namedPath.paths()).anyMatch(path -> path.normalize().equals(normalizedSourceFile)));
Expand Down
2 changes: 1 addition & 1 deletion stage2/build.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = "1.6.3"
version = "1.6.4"

configure(subprojects) {
version = parent.version
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package gg.essential.loader.stage2.util;

import java.util.function.Supplier;

public class Lazy<T> {
private Supplier<T> supplier;
private T value;

public Lazy(Supplier<T> supplier) {
this.supplier = supplier;
}

public Lazy(T value) {
this.value = value;
}

public T get() {
if (supplier != null) {
synchronized (this) {
value = supplier.get();
supplier = null;
}
}
return value;
}
}
8 changes: 7 additions & 1 deletion stage2/modlauncher9/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@ repositories {

dependencies {
bundle(implementation(project("compatibility")))
bundle(project("forge37"))
bundle(project("forge40"))
bundle(project("forge41"))
bundle(project("forge49"))
bundle(project("neoforge1"))
bundle(project("neoforge4"))
bundle(project("modlauncher10"))
bundle(project("modlauncher11"))

compileOnly("cpw.mods:modlauncher:9.0.7")
// modlauncher uses these in its api but does not declare them as such
compileOnly("cpw.mods:securejarhandler:0.9.50")
compileOnly("net.sf.jopt-simple:jopt-simple:5.0.4")
compileOnly("org.jetbrains:annotations:21.0.1")

// provided by fmlloader (both forge and neoforge ones)
compileOnly("org.apache.logging.log4j:log4j-api:2.8.1")
compileOnly("net.minecraftforge:fmlloader:1.17.1-37.0.82")
compileOnly("org.apache.maven:maven-artifact:3.8.1")
}
3 changes: 2 additions & 1 deletion stage2/modlauncher9/compatibility/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ repositories {
}

dependencies {
compileOnly(project(":stage2:common"))

compileOnly("cpw.mods:securejarhandler:0.9.50")
compileOnly("cpw.mods:modlauncher:9.0.7")
compileOnly("net.minecraftforge:fmlloader:1.17.1-37.0.82")
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
package gg.essential.loader.stage2.modlauncher;

import cpw.mods.jarhandling.JarMetadata;
import cpw.mods.jarhandling.SecureJar;
import gg.essential.loader.stage2.util.Lazy;

import java.nio.file.Path;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.jar.Manifest;

/**
* Provides abstractions for things which changed after ModLauncher 9.
*/
public interface CompatibilityLayer {
default SecureJar newSecureJarWithCustomMetadata(BiFunction<Lazy<SecureJar>, JarMetadata, JarMetadata> metadataWrapper, Path path) {
return SecureJar.from(jar -> metadataWrapper.apply(new Lazy<>(jar), JarMetadata.from(jar, path)), path);
}

Manifest getManifest(SecureJar jar);

EssentialModLocator makeModLocator();
default Set<String> getPackages(SecureJar secureJar) {
return secureJar.getPackages();
}

default JarMetadata getJarMetadata(SecureJar secureJar, Path path) {
return JarMetadata.from(secureJar, path);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
package gg.essential.loader.stage2.modlauncher;

import net.minecraftforge.fml.loading.moddiscovery.ModFile;
import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.forgespi.locating.IModLocator;
import cpw.mods.jarhandling.SecureJar;

import java.nio.file.Path;
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.List;

public interface EssentialModLocator extends IModLocator {
Iterable<ModFile> scanMods(Stream<Path> paths);
public interface EssentialModLocator {
boolean injectMods(List<SecureJar> modJars) throws ReflectiveOperationException;
}
10 changes: 10 additions & 0 deletions stage2/modlauncher9/forge37/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
repositories {
maven { url "https://maven.minecraftforge.net/" }
}

dependencies {
compileOnly(parent.project("compatibility"))

compileOnly("net.minecraftforge:fmlloader:1.17.1-37.0.82")
compileOnly("cpw.mods:securejarhandler:0.9.50")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package gg.essential.loader.stage2.modlauncher;

import cpw.mods.jarhandling.SecureJar;
import net.minecraftforge.fml.loading.FMLLoader;
import net.minecraftforge.fml.loading.moddiscovery.ModFile;
import net.minecraftforge.fml.loading.moddiscovery.ModValidator;
import net.minecraftforge.forgespi.locating.IModLocator;

import java.lang.reflect.Field;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Stream;

public interface EssentialModLocator_Forge extends EssentialModLocator, IModLocator {
Iterable<ModFile> scanMods(Stream<Path> paths);

@Override
default boolean injectMods(List<SecureJar> modJars) throws ReflectiveOperationException {
Field modValidatorField = FMLLoader.class.getDeclaredField("modValidator");
modValidatorField.setAccessible(true);
ModValidator modValidator = (ModValidator) modValidatorField.get(null);

if (modValidator == null) {
return false;
}

Field candidateModsField = ModValidator.class.getDeclaredField("candidateMods");
candidateModsField.setAccessible(true);
@SuppressWarnings("unchecked")
List<ModFile> modFiles = (List<ModFile>) candidateModsField.get(modValidator);

for (ModFile modFile : this.scanMods(modJars.stream().map(SecureJar::getPrimaryPath))) {
modFile.identifyMods();
modFiles.add(modFile);
}

return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
import java.util.Map;
import java.util.stream.Stream;

class Forge_37_0_0_ModLocator extends AbstractJarFileLocator implements EssentialModLocator {
public class Forge_37_0_0_ModLocator extends AbstractJarFileLocator implements EssentialModLocator_Forge {
private Stream<Path> paths;

@Override
public Iterable<ModFile> scanMods(Stream<Path> paths) {
this.paths = paths;
return scanMods().stream().map(it -> (ModFile) it)::iterator;
Expand Down
1 change: 1 addition & 0 deletions stage2/modlauncher9/forge40/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ repositories {

dependencies {
compileOnly(parent.project("compatibility"))
compileOnly(parent.project("forge37"))

compileOnly("cpw.mods:modlauncher:9.0.7")
// modlauncher uses these in its api but does not declare them as such
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
import java.util.Map;
import java.util.stream.Stream;

class Forge_40_1_60_ModLocator extends AbstractJarFileModLocator implements EssentialModLocator {
public class Forge_40_1_60_ModLocator extends AbstractJarFileModLocator implements EssentialModLocator_Forge {
private Stream<Path> paths;

@Override
public Iterable<ModFile> scanMods(Stream<Path> paths) {
this.paths = paths;
return scanMods().stream().map(it -> (ModFile) it)::iterator;
Expand Down
10 changes: 10 additions & 0 deletions stage2/modlauncher9/forge41/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
repositories {
maven { url "https://maven.minecraftforge.net/" }
}

dependencies {
compileOnly(parent.project("compatibility"))
compileOnly(parent.project("forge37"))

compileOnly("net.minecraftforge:fmlloader:1.19-41.0.64")
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
import java.util.Map;
import java.util.stream.Stream;

class Forge_41_0_34_ModLocator extends AbstractJarFileModLocator implements EssentialModLocator {
public class Forge_41_0_34_ModLocator extends AbstractJarFileModLocator implements EssentialModLocator_Forge {
private Stream<Path> paths;

@Override
public Iterable<ModFile> scanMods(Stream<Path> paths) {
this.paths = paths;
return scanMods().stream().map(it -> (ModFile) it.file())::iterator;
Expand Down
1 change: 1 addition & 0 deletions stage2/modlauncher9/forge49/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ repositories {

dependencies {
compileOnly(parent.project("compatibility"))
compileOnly(parent.project("forge37"))

compileOnly("net.minecraftforge:fmlloader:1.20.4-49.0.38")
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
import java.util.List;
import java.util.stream.Stream;

public class Forge_49_0_38_ModLocator extends AbstractModProvider implements EssentialModLocator {
public class Forge_49_0_38_ModLocator extends AbstractModProvider implements EssentialModLocator_Forge {
private Stream<Path> paths;

@Override
public Iterable<ModFile> scanMods(Stream<Path> paths) {
this.paths = paths;
return scanMods().stream().map(it -> (ModFile) it.file())::iterator;
Expand Down
3 changes: 0 additions & 3 deletions stage2/modlauncher9/modlauncher10/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,4 @@ dependencies {
compileOnly("cpw.mods:securejarhandler:2.0.3")
compileOnly("net.sf.jopt-simple:jopt-simple:5.0.4")
compileOnly("org.jetbrains:annotations:23.0.0")

compileOnly("org.apache.logging.log4j:log4j-api:2.8.1")
compileOnly("net.minecraftforge:fmlloader:1.19-41.0.64")
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,9 @@

import java.util.jar.Manifest;

import static gg.essential.loader.stage2.Utils.hasClass;

public class ML10CompatibilityLayer implements CompatibilityLayer {
@Override
public Manifest getManifest(SecureJar jar) {
return jar.moduleDataProvider().getManifest();
}

@Override
public EssentialModLocator makeModLocator() {
String version;
if (!hasClass("net.minecraftforge.fml.loading.moddiscovery.AbstractJarFileModLocator")) {
version = "49_0_38";
} else {
version = "41_0_34";
}
try {
String clsName = "gg.essential.loader.stage2.modlauncher.Forge_" + version + "_ModLocator";
return (EssentialModLocator) Class.forName(clsName)
.getDeclaredConstructor()
.newInstance();
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
}
14 changes: 14 additions & 0 deletions stage2/modlauncher9/modlauncher11/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
repositories {
maven { url "https://maven.neoforged.net/releases" }
}

dependencies {
compileOnly(project(":stage2:common"))
compileOnly(parent.project("compatibility"))

compileOnly("cpw.mods:modlauncher:11.0.2")
// modlauncher uses these in its api but does not declare them as such
compileOnly("cpw.mods:securejarhandler:3.0.4")
compileOnly("net.sf.jopt-simple:jopt-simple:5.0.4")
compileOnly("org.jetbrains:annotations:23.0.0")
}
Loading
Loading