Skip to content

Commit 1cb8d08

Browse files
committed
Support Legacy Fabric
1 parent 0db45ec commit 1cb8d08

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

headlessmc-launcher/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ dependencies {
2828
jarLibs group: 'org.ow2.asm', name: 'asm-tree', version: '9.7'
2929
jarLibs group: 'com.google.code.gson', name: 'gson', version: '2.10.1'
3030
jarLibs group: 'dev.xdark', name: 'deencapsulation', version: '1.0'
31+
jarLibs 'org.semver4j:semver4j:5.3.0'
3132
jarLibs project(':headlessmc-jline')
3233

3334
includeJarInResources ('net.kunmc.lab:forgecli:1.2.0:all') {

headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/FabricCommand.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import lombok.CustomLog;
44
import lombok.Getter;
5-
import lombok.val;
65
import me.earth.headlessmc.api.command.CommandException;
76
import me.earth.headlessmc.api.command.CommandUtil;
87
import me.earth.headlessmc.api.command.ParseUtil;
@@ -13,6 +12,8 @@
1312
import me.earth.headlessmc.launcher.launch.SimpleInMemoryLauncher;
1413
import me.earth.headlessmc.launcher.launch.SystemPropertyHelper;
1514
import me.earth.headlessmc.launcher.version.Version;
15+
import me.earth.headlessmc.launcher.version.VersionUtil;
16+
import me.earth.headlessmc.launcher.version.family.FamilyUtil;
1617

1718
import java.io.File;
1819
import java.io.IOException;
@@ -22,8 +23,8 @@
2223
@Getter
2324
@CustomLog
2425
public class FabricCommand extends AbstractVersionCommand {
25-
private static final String URL = "https://maven.fabricmc.net/" +
26-
"net/fabricmc/fabric-installer/0.11.0/fabric-installer-0.11.0.jar";
26+
private static final String LEGACY = "https://maven.legacyfabric.net/net/legacyfabric/fabric-installer/1.0.0/fabric-installer-1.0.0.jar";
27+
private static final String URL = "https://maven.fabricmc.net/net/fabricmc/fabric-installer/0.11.0/fabric-installer-0.11.0.jar";
2728

2829
private final SimpleInMemoryLauncher inMemoryLauncher = new SimpleInMemoryLauncher();
2930

@@ -41,8 +42,14 @@ public void execute(Version ver, String... args) throws CommandException {
4142
ctx.log("Installing Fabric for version " + ver.getName() + "...");
4243
FileManager tempFiles = ctx.getFileManager().createRelative(UUID.randomUUID().toString());
4344
File jar = tempFiles.create("fabric-installer.jar");
44-
String url = ctx.getConfig().get(LauncherProperties.FABRIC_URL, URL);
45+
Version vanilla = FamilyUtil.getOldestParent(ver);
46+
String defaultUrl = URL;
47+
if (VersionUtil.isOlderThanSafe(vanilla.getName(), "1.14") && !CommandUtil.hasFlag("-forcenew", args) || CommandUtil.hasFlag("-legacy", args)) {
48+
ctx.log("Using Legacy Fabric...");
49+
defaultUrl = LEGACY;
50+
}
4551

52+
String url = ctx.getConfig().get(LauncherProperties.FABRIC_URL, defaultUrl);
4653
try {
4754
downloadInstaller(url, jar);
4855
install(ver, jar, args);

headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/version/VersionUtil.java

+25-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package me.earth.headlessmc.launcher.version;
22

3+
import lombok.CustomLog;
34
import lombok.experimental.UtilityClass;
45
import me.earth.headlessmc.api.HasName;
56
import me.earth.headlessmc.api.util.Table;
7+
import org.semver4j.Semver;
68

79
import java.util.Collection;
810
import java.util.stream.Collectors;
911

12+
@CustomLog
1013
@UtilityClass
1114
public final class VersionUtil {
1215
public static Collection<Version> releases(Collection<Version> versions) {
@@ -19,10 +22,30 @@ public static String makeTable(Collection<Version> versions) {
1922
return new Table<Version>()
2023
.withColumn("id", v -> String.valueOf(v.getId()))
2124
.withColumn("name", HasName::getName)
22-
.withColumn("parent", v -> v.getParent() == null
23-
? "" : v.getParent().getName())
25+
.withColumn("parent", v -> v.getParent() == null ? "" : v.getParent().getName())
2426
.addAll(versions)
2527
.build();
2628
}
2729

30+
public static boolean isOlderThanSafe(String versionToTest, String versionPotentiallyYounger) {
31+
try {
32+
return isOlderThan(versionToTest, versionPotentiallyYounger);
33+
} catch (IllegalArgumentException e) {
34+
log.error(e);
35+
return false;
36+
}
37+
}
38+
39+
public static boolean isOlderThan(String versionToTest, String versionPotentiallyYounger) throws IllegalArgumentException {
40+
try {
41+
Semver semver1 = Semver.coerce(versionToTest);
42+
Semver semver2 = Semver.coerce(versionPotentiallyYounger);
43+
assert semver1 != null;
44+
assert semver2 != null;
45+
return semver1.compareTo(semver2) < 0;
46+
} catch (Exception e) {
47+
throw new IllegalArgumentException("Unable to parse semver '" + versionToTest + "' or '" + versionPotentiallyYounger + "'", e);
48+
}
49+
}
50+
2851
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.earth.headlessmc.launcher.version;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.assertFalse;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
public class VersionUtilTest {
9+
@Test
10+
public void testIsOlderThan() {
11+
assertTrue(VersionUtil.isOlderThan("1.12.2", "1.21.1"));
12+
assertTrue(VersionUtil.isOlderThan("1.11", "2.0.0"));
13+
assertTrue(VersionUtil.isOlderThanSafe("1.12.1", "1.12.2"));
14+
assertFalse(VersionUtil.isOlderThan("1.2.1", "1.1.1"));
15+
assertFalse(VersionUtil.isOlderThan("2.0.0", "1.1.1"));
16+
assertFalse(VersionUtil.isOlderThanSafe("1.1.2", "1.1.1"));
17+
18+
assertFalse(VersionUtil.isOlderThanSafe("1.15", "1.15.0"));
19+
assertFalse(VersionUtil.isOlderThanSafe("1.15.0", "1.15"));
20+
21+
assertFalse(VersionUtil.isOlderThanSafe("1.15", "1.14.4"));
22+
assertTrue(VersionUtil.isOlderThanSafe("1.14.4", "1.15"));
23+
}
24+
25+
}

0 commit comments

Comments
 (0)