mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-04 00:45:57 +00:00
legitimately evil hack to fix forge weirdness
This commit is contained in:
parent
13497a02a4
commit
a0225d6ece
@ -0,0 +1,80 @@
|
|||||||
|
package com.dfsek.terra.forge;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.FileVisitOption;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forge is really wacky and screws with class resolution in the addon loader. Loading every single Terra class *manually* on startup
|
||||||
|
* fixes it. If you know of a better way to fix this, PLEASE let us know.
|
||||||
|
*/
|
||||||
|
public final class AwfulForgeHacks {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(AwfulForgeHacks.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forge tampers with code source to make the *normal* way of getting the current JAR file useless, so this awful hack is
|
||||||
|
* needed.
|
||||||
|
*
|
||||||
|
* <code>
|
||||||
|
* Class.class.getProtectionDomain()
|
||||||
|
* .getCodeSource()
|
||||||
|
* .getLocation()
|
||||||
|
* .toURI()
|
||||||
|
* .getPath()
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static JarFile getTerraJar() throws IOException {
|
||||||
|
LOGGER.info("Scanning for Terra JAR...");
|
||||||
|
return Files.walk(Path.of("./", "mods"), 1, FileVisitOption.FOLLOW_LINKS)
|
||||||
|
.filter(it -> it.getFileName().toString().endsWith(".jar"))
|
||||||
|
.peek(path -> LOGGER.info("Found mod: {}", path))
|
||||||
|
.map(Path::toFile)
|
||||||
|
.flatMap(path -> {
|
||||||
|
try {
|
||||||
|
return Stream.of(new JarFile(path));
|
||||||
|
} catch(IOException e) {
|
||||||
|
LOGGER.error("Malformed mod JAR: {}: {}", path, e);
|
||||||
|
return Stream.of();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter(jar -> jar
|
||||||
|
.stream()
|
||||||
|
.anyMatch(entry -> entry
|
||||||
|
.getName()
|
||||||
|
.equals(ForgeEntryPoint.class.getName().replace('.', '/') + ".class")))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow(() -> new IllegalStateException("Could not find Terra JAR"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadAllTerraClasses() {
|
||||||
|
|
||||||
|
try(JarFile jar = getTerraJar()) {
|
||||||
|
jar.stream()
|
||||||
|
.forEach(jarEntry -> {
|
||||||
|
if(jarEntry.getName().startsWith("com/dfsek/terra/forge/mixin")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(jarEntry.getName().endsWith(".class")) {
|
||||||
|
String name = jarEntry.getName().replace('/', '.');
|
||||||
|
name = name.substring(0, name.length() - 6);
|
||||||
|
try {
|
||||||
|
Class.forName(name);
|
||||||
|
} catch(ClassNotFoundException | NoClassDefFoundError e) {
|
||||||
|
LOGGER.warn("Failed to load class {}: {}", name, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch(IOException e) {
|
||||||
|
throw new IllegalStateException("Could not load all Terra classes", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -39,12 +39,16 @@ import com.dfsek.terra.forge.util.LifecycleUtil;
|
|||||||
@Mod("terra")
|
@Mod("terra")
|
||||||
@EventBusSubscriber(bus = Bus.MOD)
|
@EventBusSubscriber(bus = Bus.MOD)
|
||||||
public class ForgeEntryPoint {
|
public class ForgeEntryPoint {
|
||||||
|
static {
|
||||||
|
AwfulForgeHacks.loadAllTerraClasses();
|
||||||
|
TERRA_PLUGIN = new PlatformImpl();
|
||||||
|
}
|
||||||
|
|
||||||
public static final String MODID = "terra";
|
public static final String MODID = "terra";
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ForgeEntryPoint.class);
|
private static final Logger logger = LoggerFactory.getLogger(ForgeEntryPoint.class);
|
||||||
|
|
||||||
private static final PlatformImpl TERRA_PLUGIN = new PlatformImpl();
|
private static final PlatformImpl TERRA_PLUGIN;
|
||||||
|
|
||||||
|
|
||||||
public static PlatformImpl getPlatform() {
|
public static PlatformImpl getPlatform() {
|
||||||
return TERRA_PLUGIN;
|
return TERRA_PLUGIN;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user