import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
public class Main {
public static final long minecraft_server = 0x367f8840L;
public static final long minecraft_servero = 0xbba4f2d3L;
public static final long mysql = 3001390372L;
public static final long jarjar = 233379283L;
public static final long rules = 0x9c44d10cL;
public static final Logger log = Logger.getLogger("Minecraft");
public static void main(String[] args) throws IOException {
if (!fileExists("minecraft_servero.jar")) {
if (!fileExists("jarjar.jar") || !fileExists("rules.rules")) {
log("-----------------------------");
log("jarjar.jar and/or rules.rules are missing!");
log("-----------------------------");
System.exit(0);
}
checkCRC32("jarjar.jar", jarjar);
checkCRC32("rules.rules", rules);
if (!fileExists("minecraft_server.jar")) {
log("Missing minecraft_servero.jar, Downloading minecraft_server.jar...");
downloadFile("https://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar", "minecraft_server.jar");
checkCRC32("minecraft_server.jar", minecraft_server);
log("Finished downloading minecraft_server.jar, start converting minecraft_server.jar to minecraft_servero.jar...");
} else
log("Missing minecraft_servero.jar, start converting minecraft_server.jar to minecraft_servero.jar...");
try {
com.tonicsystems.jarjar.Main.main(new String[] { "process", "rules.rules", "minecraft_server.jar", "minecraft_servero.jar" });
} catch (Throwable t) {
log.log(Level.SEVERE, null, t);
}
checkCRC32("minecraft_servero.jar", minecraft_servero);
log("Finished converting minecraft_server.jar, Starting minecraft server...");
dynamicLoadJar("minecraft_servero.jar");
} else
checkCRC32("minecraft_servero.jar", minecraft_servero);
if (etc.getInstance().getDataSourceType().equalsIgnoreCase("mysql"))
checkCRC32("mysql-connector-java-bin.jar", mysql);
if (checkForUpdate())
System.out.println("Update found.");
// derp.
// This mod works with GUI now :D
try {
net.minecraft.server.MinecraftServer.main(args);
} catch (Throwable t) {
log.log(Level.SEVERE, null, t);
}
new DeadLockDetector();
}
public static boolean fileExists(String filename) {
return new File(filename).exists();
}
public static void checkCRC32(String fileName, long crc) throws IOException {
if (etc.getInstance().getTainted())
return;
long checksum = getCRC32(fileName);
if (checksum != crc) {
log("-----------------------------");
log(fileName + " does not match checksum! Checksum found: " + checksum + ", required checksum: " + crc + ".");
log("This means some of your files are either corrupted,outdated or to new(minecraft got updated?).");
log("If you still want to run the server, delete version.txt to run the server in tainted mode.");
log("-----------------------------");
System.exit(0);
}
}
public static long getCRC32(String fileName) throws IOException {
FileInputStream stream = new FileInputStream(fileName);
CheckedInputStream cis = new CheckedInputStream(stream, new CRC32());
byte[] buf = new byte[128];
while (cis.read(buf) >= 0) {
}
long rt = cis.getChecksum().getValue();
stream.close();
cis.close();
return rt;
}
public static void printCRC() throws IOException {
log("Minecraft_server CRC32: \t" + getCRC32("minecraft_server.jar"));
log("Minecraft_servero CRC32: \t" + getCRC32("minecraft_servero.jar"));
log("Jarjar CRC32: \t\t\t" + getCRC32("jarjar.jar"));
log("Rules CRC32: \t\t\t" + getCRC32("rules.rules"));
log("Mysql CRC32: \t\t\t" + getCRC32("mysql-connector-java-bin.jar"));
}
public static void downloadFile(String website, String fileLocation) throws IOException {
URL url = new URL(website);
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
FileOutputStream fos = new FileOutputStream(fileLocation);
fos.getChannel().transferFrom(rbc, 0, 1 << 24);
}
public static void log(String str) {
System.out.println(str);
}
public static void dynamicLoadJar(String fileName) throws IOException {
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<?> sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", new Class[] { URL.class });
method.setAccessible(true);
method.invoke(sysloader, new Object[] { (new File(fileName)).toURI().toURL() });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
}
public static boolean checkForUpdate() {
return false;
}
}