Domanda

Modifica: viene utilizzato decompilatore diversa ora include il file Util $ OS.class

Sto cercando di modificare il programma di avvio il mio mestiere per verificare la presenza di una cartella minecraft nella directory di lavoro corrente e se non esiste quindi utilizzare le routine stabilite per Creta e scaricare i file necessari. Questa è la mia prima incursione nel java programing quindi mi sento un po 'perso. Ecco l'origine del file di classe offendere: (il blocco che penso debba modificano inizia on line 15)

File 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;
  }
}

Ho fatto qualche ricerca su come ottenere la directory di lavoro corrente, ma non sono sicuro di che cosa ha bisogno Modifing. Se qualcuno potrebbe almeno spiegare quello che le varie parti del file significa che sarebbe molto utile.

È stato utile?

Soluzione

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;
}

Ci scusiamo per la confusione, questo dovrebbe funzionare bene per voi. Si creerà una cartella minecraft nella stessa directory del programma di avvio.

Nota: In OS X questo sarà ancora creare la cartella nella cartella del .app, non il / Contents / Resources cartelle .app / Java che il JAR reale è in, in modo da non avere alcun problema su qualsiasi sistema operativo .

Spero che questo aiuti!

Altri suggerimenti

È sempre possibile modificare il campo che punta alla directory in cui MC mette il suo salva e modificarlo in quello che vuoi. Ecco un frammento del mio programma di avvio ( 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();
}

Questa scende in campo percorso hardcoded all'interno della classe e lo modifica a tutto ciò che vuoi che sia Minecraft. (Ad esempio su una chiavetta USB, in una cartella personalizzata, ecc.)

Non sono ancora del tutto sicuro di capire i vostri obiettivi.

Se si vuole avere scaricare "Minecraft" per voi cercherei di farlo in un file batch e script di shell e appena eseguito quello che era appropriato per il sistema.

Se si vuole in qualche modo "scaricare" i tuoi mondi, texture pack e mods da qualche parte allora si potrebbe fare lo stesso.

Se quello che vuoi è per ogni Minecraft installazione si sta giocando a utilizzare i dati (come su una chiavetta USB o qualcosa del genere) si potrebbe avere i file batch che o la copia sui dati prima di eseguire minecraft o forse usare "ln" per sostituire le directory che Minecraft pensa che sia intenzione di utilizzare con il proprio sulla vostra chiavetta USB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top