diff options
-rw-r--r-- | src/net/minecraft/GameUpdater.java | 37 | ||||
-rw-r--r-- | src/net/minecraft/GameVersion.java | 79 | ||||
-rw-r--r-- | src/net/minecraft/Launcher.java | 6 | ||||
-rw-r--r-- | src/net/minecraft/VersionManager.java | 41 |
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); + } + } +} |