package jk_5.nailed.launch;
import io.netty.util.internal.logging.InternalLoggerFactory;
import jk_5.nailed.server.logging.LoggerOutputStream;
import jk_5.nailed.server.tweaker.patcher.BinPatchManager;
import net.minecraft.launchwrapper.ITweaker;
import net.minecraft.launchwrapper.Launch;
import net.minecraft.launchwrapper.LaunchClassLoader;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.spongepowered.asm.launch.MixinBootstrap;
import org.spongepowered.asm.mixin.MixinEnvironment;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Paths;
import java.util.List;
public class ServerTweaker implements ITweaker {
private static final Logger logger = LogManager.getLogger();
private static boolean isObfuscated() {
try {
return Launch.classLoader.getClassBytes("net.minecraft.world.World") == null;
} catch (IOException ignored) {
return true;
}
}
@Override
public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
NailedLauncher.initialize(gameDir);
System.setOut(new PrintStream(new LoggerOutputStream(LogManager.getLogger("SYSOUT"), Level.INFO), true));
System.setErr(new PrintStream(new LoggerOutputStream(LogManager.getLogger("SYSERR"), Level.WARN), true));
InternalLoggerFactory.getInstance("INITLOGGER");
}
@Override
public void injectIntoClassLoader(LaunchClassLoader loader) {
logger.info("Initializing nailed");
loader.addClassLoaderExclusion("scala.");
loader.addClassLoaderExclusion("LZMA.");
loader.addClassLoaderExclusion("com.google.");
loader.addClassLoaderExclusion("com.nothome.delta.");
loader.addClassLoaderExclusion("org.apache.");
loader.addClassLoaderExclusion("com.mojang.");
loader.addClassLoaderExclusion("org.fusesource.");
loader.addClassLoaderExclusion("io.netty.");
loader.addClassLoaderExclusion("gnu.trove.");
loader.addClassLoaderExclusion("joptsimple.");
loader.addClassLoaderExclusion("jk_5.nailed.server.mixin.");
loader.addClassLoaderExclusion("jk_5.nailed.launch.");
loader.addClassLoaderExclusion("jk_5.nailed.server.tweaker.");
loader.addClassLoaderExclusion("org.spongepowered.tools.");
BinPatchManager.instance().setup();
loader.registerTransformer("jk_5.nailed.server.tweaker.transformer.PatchingTransformer");
loader.registerTransformer("jk_5.nailed.server.tweaker.transformer.EventSubscriptionTransformer");
logger.info("Applying runtime deobfuscation...");
if(isObfuscated()){
Launch.blackboard.put("nailed.deobf-srg", Paths.get("bin", "deobf.srg.gz"));
loader.registerTransformer("jk_5.nailed.launch.transformers.DeobfuscationTransformer");
logger.info("Runtime deobfuscation is applied.");
} else {
logger.info("Runtime deobfuscation was not applied. Nailed is being loaded in a deobfuscated environment.");
}
logger.info("Applying access transformer...");
Launch.blackboard.put("nailed.at", "nailed_at.cfg");
loader.registerTransformer("jk_5.nailed.launch.transformers.AccessTransformer");
logger.info("Initializing Mixin environment...");
MixinBootstrap.init();
MixinEnvironment env = MixinEnvironment.getCurrentEnvironment();
env.addConfiguration("mixins.nailed.core.json");
env.setSide(MixinEnvironment.Side.SERVER);
loader.registerTransformer(MixinBootstrap.TRANSFORMER_CLASS);
logger.info("Initialization finished. Starting Minecraft server...");
}
@Override
public String getLaunchTarget() {
return "net.minecraft.server.MinecraftServer";
}
@Override
public String[] getLaunchArguments() {
return new String[]{"nogui"};
}
}