Frage

Bearbeiten: Verwendete Dekompiler verwendet jetzt die Util $ os.class -Datei

Ich versuche, den Mine Craft Launcher zu modifizieren, um nach einem zu suchen minecraft Ordner im aktuellen Arbeitsverzeichnis und wenn keine vorhanden ist, verwenden Sie die festgelegten Routinen zum Kreta und laden Sie die erforderlichen Dateien herunter. Dies ist mein erster Ausflug in das Java -Programm, also fühle ich mich ein bisschen verloren. Hier ist die Quelle der beleidigenden Klassendatei: (Der Block, den ich denke, der geändert wird, startet Starts in Zeile 15)

Datei util.class

package net.minecraft;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.security.PublicKey;
import java.security.cert.Certificate;
import javax.net.ssl.HttpsURLConnection;

public class Util
{
  private static File workDir = null;

  public static File getWorkingDirectory() {
    if (workDir == null) workDir = getWorkingDirectory("minecraft");
    return workDir;
  }

  public static File getWorkingDirectory(String applicationName) {
    String userHome = System.getProperty("user.home", ".");
    File workingDirectory;
    File workingDirectory;
    File workingDirectory;
    File workingDirectory;
    switch ($SWITCH_TABLE$net$minecraft$Util$OS()[getPlatform().ordinal()]) {
    case 1:
    case 2:
      workingDirectory = new File(userHome, '.' + applicationName + '/');
      break;
    case 3:
      String applicationData = System.getenv("APPDATA");
      File workingDirectory;
      if (applicationData != null) workingDirectory = new File(applicationData, "." + applicationName + '/'); else
        workingDirectory = new File(userHome, '.' + applicationName + '/');
      break;
    case 4:
      workingDirectory = new File(userHome, "Library/Application Support/" + applicationName);
      break;
    default:
      workingDirectory = new File(userHome, applicationName + '/');
    }
    if ((!workingDirectory.exists()) && (!workingDirectory.mkdirs())) throw new RuntimeException("The working directory could not be created: " + workingDirectory);
    return workingDirectory;
  }

  private static OS getPlatform() {
    String osName = System.getProperty("os.name").toLowerCase();
    if (osName.contains("win")) return OS.windows;
    if (osName.contains("mac")) return OS.macos;
    if (osName.contains("solaris")) return OS.solaris;
    if (osName.contains("sunos")) return OS.solaris;
    if (osName.contains("linux")) return OS.linux;
    if (osName.contains("unix")) return OS.linux;
    return OS.unknown;
  }

  public static String excutePost(String targetURL, String urlParameters)
  {
    HttpsURLConnection connection = null;
    try
    {
      URL url = new URL(targetURL);
      connection = (HttpsURLConnection)url.openConnection();
      connection.setRequestMethod("POST");
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

      connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
      connection.setRequestProperty("Content-Language", "en-US");

      connection.setUseCaches(false);
      connection.setDoInput(true);
      connection.setDoOutput(true);

      connection.connect();
      Certificate[] certs = connection.getServerCertificates();

      byte[] bytes = new byte[294];
      DataInputStream dis = new DataInputStream(Util.class.getResourceAsStream("minecraft.key"));
      dis.readFully(bytes);
      dis.close();

      Certificate c = certs[0];
      PublicKey pk = c.getPublicKey();
      byte[] data = pk.getEncoded();

      for (int i = 0; i < data.length; i++) {
        if (data[i] == bytes[i]) continue; throw new RuntimeException("Public key mismatch");
      }

      DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
      wr.writeBytes(urlParameters);
      wr.flush();
      wr.close();

      InputStream is = connection.getInputStream();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));

      StringBuffer response = new StringBuffer();
      String line;
      while ((line = rd.readLine()) != null)
      {
        String line;
        response.append(line);
        response.append('\r');
      }
      rd.close();

      String str1 = response.toString();
      return str1;
    }
    catch (Exception e)
    {
      e.printStackTrace();
      return null;
    }
    finally
    {
      if (connection != null)
        connection.disconnect();
    }
    throw localObject;
  }

  public static boolean isEmpty(String str) {
    return (str == null) || (str.length() == 0);
  }

  public static void openLink(URI uri) {
    try {
      Object o = Class.forName("java.awt.Desktop").getMethod("getDesktop", new Class[0]).invoke(null, new Object[0]);
      o.getClass().getMethod("browse", new Class[] { URI.class }).invoke(o, new Object[] { uri });
    } catch (Throwable e) {
      System.out.println("Failed to open link " + uri.toString());
    }
  }

  private static enum OS
  {
    linux, solaris, windows, macos, unknown;
  }
}

Ich habe einige Nachforschungen über das aktuelle Arbeitsverzeichnis durchgeführt, bin mir jedoch nicht sicher, was modifiziert werden muss. Wenn jemand zumindest erklären könnte, was die verschiedenen Teile der Datei bedeuten, wäre das sehr hilfreich.

War es hilfreich?

Lösung

public static File getWorkingDirectory(String applicationName) {
    File workingDirectory = new File("." + File.separator + applicationName);
    if ((!workingDirectory.exists()) && (!workingDirectory.mkdirs())) 
        throw new RuntimeException("The working directory could not be created: " + workingDirectory);
    return workingDirectory;
}

Entschuldigung für die Verwirrung, das sollte für Sie gut funktionieren. Es erstellt einen Minecraft -Ordner im selben Verzeichnis wie Ihr Launcher.

HINWEIS: Auf OS X wird der Ordner im Ordner weiterhin als .App erstellt, nicht als .App/Inhalt/Ressourcen/Java -Ordner, in dem sich das tatsächliche Glas befindet. Sie haben also kein Problem in jedem Betriebssystem.

Hoffe das hilft!

Andere Tipps

Sie können das Feld jederzeit ändern, das auf das Verzeichnis hinweist, in dem MC seine Paraden setzt und es auf das ändern, was Sie wollen. Hier ist ein Ausschnitt aus meinem Launcher (http://www.github.com/lekro/moddishlauncher):

ClassLoader cl = new URLClassLoader(urls, ModdishLauncher.class.getClassLoader());
Class<?> mc = null;
try {
    mc = cl.loadClass("net.minecraft.client.Minecraft");
} catch (ClassNotFoundException e2) {
    System.err.println("Couldn't find Minecraft main class!");
    e2.printStackTrace();
}
Field[] fields = mc.getDeclaredFields();
Field mcPathField = null;
for (int i = 0; i < fields.length; i++) {
    Field f = fields[i];
    if (f.getType() != File.class) {
    continue;
    }
    if (f.getModifiers() != (Modifier.PRIVATE + Modifier.STATIC)) {
    continue;
    }
    mcPathField = f;
    break;
}
mcPathField.setAccessible(true);
try {
    mcPathField.set(null, new File(myDir + "/minecrafts/"+minecraftType+"/"));
} catch (IllegalArgumentException e2) {
    e2.printStackTrace();
} catch (IllegalAccessException e2) {
    e2.printStackTrace();
}

Dies nimmt das festcodierte Pfadfeld in der Minecraft -Klasse und modifiziert es zu allem, was Sie wollen. (zB auf einem USB -Stick, in einem benutzerdefinierten Ordner usw.)

Ich bin mir immer noch nicht ganz sicher, ob ich deine Ziele verstehe.

Wenn Sie es für Sie "Minecraft" herunterladen möchten, würde ich versuchen, dies in einer Stapeldatei und einem Shell -Skript zu tun und einfach das für Ihr System geeignet auszuführen.

Wenn Sie Ihre Welten, Texturpackungen und Mods von irgendwoher "herunterladen" möchten, können Sie dasselbe tun.

Wenn Sie für jede Minecraft -Installation möchten, auf der Sie Ihre Daten verwenden (wie auf einem USB -Stick oder so), haben Sie möglicherweise Stapeldateien, die entweder die Daten kopieren, bevor Sie Minecraft ausführen, oder verwenden Sie möglicherweise "LN", um die Verzeichnisse zu ersetzen Das Minecraft glaubt, dass es auf Ihrem USB -Stick mit Ihren eigenen verwenden wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top