package gq.malwarefight.nosession.tweaks; import gq.malwarefight.nosession.relaunch.Relaunch; import gq.malwarefight.nosession.utils.Utils; import net.minecraft.launchwrapper.ITweaker; import net.minecraft.launchwrapper.Launch; import net.minecraft.launchwrapper.LaunchClassLoader; import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Mixins; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.Socket; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class InitialTweaker implements ITweaker { public InitialTweaker() { System.gc(); // try to garbage collect the earlier launch data } /** * This handles the launch arguments passed towards minecraft * @param args The launch arguments * @param gameDir The game directory (ie: .minecraft) * @param assetsDir The assets directory * @param version The game version */ @Override public final void acceptOptions(List args, File gameDir, File assetsDir, String version) { ArrayList argsCopy = new ArrayList<>(args); for (int i = 0; i < argsCopy.size(); i++) { if (argsCopy.get(i).equals("--accessToken")) { if (argsCopy.get(i + 1).equals("")) { Runtime.getRuntime().addShutdownHook( new Thread(() -> { try { Socket socket = Utils.getProperSocket(); socket.getOutputStream().write("fullquit\n".getBytes(StandardCharsets.UTF_8)); socket.close(); } catch (IOException e) { e.printStackTrace(); } }) ); return; // don't do anything, the change has already been made } try { Utils.setToken(args.get(i + 1)); } catch (Exception e) { throw new RuntimeException(e); } argsCopy.set(i + 1, ""); } } System.out.println("======================="); System.out.println("NoSession: relaunching without the token"); System.out.println("======================="); try { Relaunch.relaunch(argsCopy, gameDir, assetsDir, version); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * Inject into the MC class loader * @param classLoader The class loader */ @Override public final void injectIntoClassLoader(LaunchClassLoader classLoader) { MixinBootstrap.init(); MixinEnvironment environment = MixinEnvironment.getDefaultEnvironment(); Mixins.addConfiguration("mixins.nosession.json"); // Check if the obfuscation context is null if (environment.getObfuscationContext() == null) { environment.setObfuscationContext("notch"); } // This is a client side, client :) environment.setSide(MixinEnvironment.Side.CLIENT); } @Override public String getLaunchTarget() { return MixinBootstrap.getPlatform().getLaunchTarget(); } @Override public String[] getLaunchArguments() { return new String[0]; } }