summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/net/minecraft/GameUpdater.java37
-rw-r--r--src/net/minecraft/GameVersion.java79
-rw-r--r--src/net/minecraft/Launcher.java6
-rw-r--r--src/net/minecraft/VersionManager.java41
4 files changed, 140 insertions, 23 deletions
diff --git a/src/net/minecraft/GameUpdater.java b/src/net/minecraft/GameUpdater.java
index 9a79880..1b02053 100644
--- a/src/net/minecraft/GameUpdater.java
+++ b/src/net/minecraft/GameUpdater.java
@@ -2,7 +2,6 @@ package net.minecraft;
import java.applet.Applet;
import java.io.DataInputStream;
-import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -73,12 +72,10 @@ public class GameUpdater implements Runnable {
protected String[] certificateRefusedMessage = new String[]{"Permissions for Applet Refused.", "Please accept the permissions dialog to allow", "the applet to continue the loading process."};
protected static boolean natives_loaded = false;
- private final String latestVersion;
- private final String mainGameUrl;
+ private final GameVersion latestVersion;
- public GameUpdater(String latestVersion, String mainGameUrl) {
+ public GameUpdater(GameVersion latestVersion) {
this.latestVersion = latestVersion;
- this.mainGameUrl = mainGameUrl;
}
public void init() {
@@ -96,6 +93,14 @@ public class GameUpdater implements Runnable {
this.pack200Supported = true;
} catch (Throwable throwable) {
}
+
+ if (!latestVersion.hasFullInfo()) {
+ try {
+ latestVersion.downloadInfo();
+ } catch (IOException e) {
+ fatalErrorOccured("Unable to get info for version", e);
+ }
+ }
}
@@ -176,10 +181,7 @@ public class GameUpdater implements Runnable {
}
this.urlList[1] = new URL(path, librariesZip);
-
- // TODO: BetaCraft's server only has versions missing from mojang's download site.
- // The launcher should use the info in "jsons.zip" to get the URL for the jar download.
- this.urlList[2] = new URL(path, "versions/a1.0.13.jar");
+ this.urlList[2] = latestVersion.gameJarUrl;
}
@@ -209,7 +211,7 @@ public class GameUpdater implements Runnable {
boolean cacheAvailable = false;
if (versionFile.exists() && (
- this.latestVersion.equals("-1") || this.latestVersion.equals(readVersionFile(versionFile)))) {
+ this.latestVersion.equals("-1") || latestVersion.isSameVersion(versionFile))) {
cacheAvailable = true;
this.percentage = 90;
}
@@ -220,10 +222,8 @@ public class GameUpdater implements Runnable {
extractJars(path);
extractNatives(path);
- if (this.latestVersion != null) {
- this.percentage = 90;
- writeVersionFile(versionFile, this.latestVersion);
- }
+ this.percentage = 90;
+ latestVersion.writeVersionFile(versionFile);
}
}
@@ -246,13 +246,6 @@ public class GameUpdater implements Runnable {
return version;
}
- protected void writeVersionFile(File file, String version) throws Exception {
- DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
- dos.writeUTF(version);
- dos.close();
- }
-
-
protected void updateClassPath(File dir) throws Exception {
this.state = STATE_UPDATING_CLASSPATH;
@@ -703,7 +696,7 @@ public class GameUpdater implements Runnable {
if (dir.exists()) {
String version = readVersionFile(dir);
- if (version != null && version.length() > 0) {
+ if (version != null && !version.isEmpty()) {
return true;
}
}
diff --git a/src/net/minecraft/GameVersion.java b/src/net/minecraft/GameVersion.java
new file mode 100644
index 0000000..7698b5d
--- /dev/null
+++ b/src/net/minecraft/GameVersion.java
@@ -0,0 +1,79 @@
+package net.minecraft;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.time.Instant;
+import java.util.Scanner;
+
+public class GameVersion {
+ public String name;
+ public String desc;
+ public Instant compiledOn;
+ public Instant releasedOn;
+
+ public URL gameJarUrl;
+ public String proxyArgs;
+
+ private boolean infoDownloaded = false;
+
+ public GameVersion(String name, String desc, long compileTimestamp, long releaseTimestamp) {
+ this.name = name;
+ this.desc = desc;
+ this.compiledOn = Instant.ofEpochMilli(compileTimestamp);
+ this.releasedOn = Instant.ofEpochMilli(releaseTimestamp);
+ }
+
+ public void downloadInfo() throws IOException {
+ URL infoUrl = new URL("http://files.betacraft.uk/launcher/assets/jsons/" + name + ".info");
+ Scanner scanner = new Scanner(infoUrl.openStream(), "UTF-8");
+ while (scanner.hasNextLine()) {
+ String[] keyValueList = scanner.nextLine().split(":", 2);
+
+ if (keyValueList.length < 2)
+ continue;
+
+ String key = keyValueList[0];
+ String value = keyValueList[1];
+
+ switch (key) {
+ case "url":
+ gameJarUrl = new URL(value);
+ break;
+ case "proxy-args":
+ proxyArgs = value;
+ break;
+ }
+ }
+ infoDownloaded = true;
+ }
+
+ public boolean hasFullInfo() {
+ return infoDownloaded;
+ }
+
+ public boolean isPreleaseOrDemo() {
+ boolean isDemo = name.contains("demo");
+ boolean isPrerelease = name.contains("pre") || name.contains("test") || name.contains("w");
+ boolean isClassic = name.startsWith("c");
+ return isDemo || isPrerelease || isClassic;
+ }
+
+ public boolean isSameVersion(File versionFile) throws IOException {
+ DataInputStream dis = new DataInputStream(Files.newInputStream(versionFile.toPath()));
+ String version = dis.readUTF();
+ dis.close();
+
+ long versionTimestamp = Long.parseLong(version);
+ return releasedOn.getEpochSecond() == versionTimestamp;
+ }
+
+ public void writeVersionFile(File file) throws IOException {
+ DataOutputStream dos = new DataOutputStream(Files.newOutputStream(file.toPath()));
+ dos.writeUTF(String.valueOf(releasedOn.getEpochSecond()));
+ dos.close();
+ }
+}
diff --git a/src/net/minecraft/Launcher.java b/src/net/minecraft/Launcher.java
index 645aa46..f3eed56 100644
--- a/src/net/minecraft/Launcher.java
+++ b/src/net/minecraft/Launcher.java
@@ -8,6 +8,7 @@ import java.awt.image.VolatileImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
@@ -48,7 +49,10 @@ public class Launcher extends Applet implements Runnable, AppletStub {
this.customParameters.put("username", userName);
this.customParameters.put("sessionid", sessionId);
- this.gameUpdater = new GameUpdater(latestVersion, "minecraft.jar?user=" + userName + "&ticket=" + downloadTicket);
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.YEAR, 2010);
+ VersionManager versionManager = new VersionManager();
+ this.gameUpdater = new GameUpdater(versionManager.getVersionForInstant(calendar.toInstant()));
}
public boolean canPlayOffline() {
diff --git a/src/net/minecraft/VersionManager.java b/src/net/minecraft/VersionManager.java
new file mode 100644
index 0000000..1c7a114
--- /dev/null
+++ b/src/net/minecraft/VersionManager.java
@@ -0,0 +1,41 @@
+package net.minecraft;
+
+import java.io.IOException;
+import java.net.URL;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Scanner;
+
+public class VersionManager {
+ public final List<GameVersion> versions = new ArrayList<>();
+
+ public VersionManager() {
+ try {
+ downloadVersionList();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public GameVersion getVersionForInstant(Instant instant) {
+ return versions.stream()
+ .filter(v -> !v.isPreleaseOrDemo())
+ .filter(v -> v.releasedOn.isBefore(instant))
+ .max(Comparator.comparing((GameVersion a) -> a.releasedOn))
+ .orElse(null);
+ }
+
+ private void downloadVersionList() throws IOException {
+ URL versionListURL = new URL("http://files.betacraft.uk/launcher/assets/version_list.txt");
+ Scanner scanner = new Scanner(versionListURL.openStream(), "UTF-8");
+ while (scanner.hasNextLine()) {
+ String[] versionInfo = scanner.nextLine().split("`");
+ long compileTimestamp = Long.parseLong(versionInfo[2]);
+ long releaseTimestamp = Long.parseLong(versionInfo[3]);
+ GameVersion version = new GameVersion(versionInfo[0], versionInfo[1], compileTimestamp, releaseTimestamp);
+ versions.add(version);
+ }
+ }
+}