diff options
| author | cflip <cflip@cflip.net> | 2023-08-24 19:31:05 -0600 | 
|---|---|---|
| committer | cflip <cflip@cflip.net> | 2023-08-24 19:31:05 -0600 | 
| commit | 1a1e124db2bd5e6d71ecb5fcaba4c26e576d70ea (patch) | |
| tree | 635a211dfefdf8a36ec9ae2e41e957b625e8961d /src | |
| parent | 7b45cf43de3ff5e95b43107a338856901ccb7383 (diff) | |
Get versions and jar URL from BetaCraft's version_list.txt
Diffstat (limited to 'src')
| -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); +		} +	} +} | 
