Skip to content

Commit 5cde4ce

Browse files
authored
不再用 Version 表示游戏实例 (#6322)
1 parent d297417 commit 5cde4ce

187 files changed

Lines changed: 5989 additions & 4144 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameLauncher.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,16 @@
4242
*/
4343
public final class HMCLGameLauncher extends DefaultLauncher {
4444

45-
public HMCLGameLauncher(GameRepository repository, Version version, AuthInfo authInfo, LaunchOptions options) {
46-
this(repository, version, authInfo, options, null);
45+
public HMCLGameLauncher(GameRepository repository, GameInstanceManifest manifest, AuthInfo authInfo, LaunchOptions options) {
46+
this(repository, manifest, authInfo, options, null);
4747
}
4848

49-
public HMCLGameLauncher(GameRepository repository, Version version, AuthInfo authInfo, LaunchOptions options, ProcessListener listener) {
50-
this(repository, version, authInfo, options, listener, true);
49+
public HMCLGameLauncher(GameRepository repository, GameInstanceManifest manifest, AuthInfo authInfo, LaunchOptions options, ProcessListener listener) {
50+
this(repository, manifest, authInfo, options, listener, true);
5151
}
5252

53-
public HMCLGameLauncher(GameRepository repository, Version version, AuthInfo authInfo, LaunchOptions options, ProcessListener listener, boolean daemon) {
54-
super(repository, version, authInfo, options, listener, daemon);
53+
public HMCLGameLauncher(GameRepository repository, GameInstanceManifest manifest, AuthInfo authInfo, LaunchOptions options, ProcessListener listener, boolean daemon) {
54+
super(repository, manifest, authInfo, options, listener, daemon);
5555
}
5656

5757
@Override
@@ -66,7 +66,7 @@ private void generateOptionsTxt() {
6666
if (options.isDisableAutoGameOptions())
6767
return;
6868

69-
Path runDir = repository.getRunDirectory(version.getId());
69+
Path runDir = repository.getRunDirectory(manifest.id());
7070
Path optionsFile = runDir.resolve("options.txt");
7171
Path configFolder = runDir.resolve("config");
7272

@@ -91,7 +91,7 @@ private void generateOptionsTxt() {
9191
* 1.11 ~ 1.12 : zh_cn works fine, zh_CN will display Chinese but the language setting will incorrectly show English as selected
9292
* 1.13+ : zh_cn works fine, zh_CN will automatically switch to English
9393
*/
94-
GameVersionNumber gameVersion = GameVersionNumber.asGameVersion(repository.getGameVersion(version));
94+
GameVersionNumber gameVersion = GameVersionNumber.asGameVersion(repository.getGameVersion(manifest));
9595
if (gameVersion.compareTo("1.1") < 0)
9696
return;
9797

@@ -161,7 +161,7 @@ protected void appendJvmArgs(CommandBuilder result) {
161161
if (options.isAllowAutoAgent()
162162
&& !options.isNoGeneratedJVMArgs()
163163
&& !options.isNoGeneratedOptimizingJVMArgs()
164-
&& NativePatcher.needPatchMemoryUtil(version, options.getJava().getParsedVersion())) {
164+
&& NativePatcher.needPatchMemoryUtil(manifest, options.getJava().getParsedVersion())) {
165165
LOG.info("Attempting to patch game with lwjgl-unsafe-agent");
166166
try {
167167
result.add("-javaagent:" + extractLwjglUnsafeAgent());
@@ -178,9 +178,9 @@ private Path extractLwjglUnsafeAgent() throws IOException {
178178
}
179179

180180
Library library = new Library(new Artifact("org.glavo", "lwjgl-unsafe-agent", agentVersion));
181-
String fileName = library.getArtifact().getFileName();
181+
String fileName = library.artifact().getFileName();
182182

183-
Path agentPath = repository.getLibraryFile(version, library).toAbsolutePath().normalize();
183+
Path agentPath = repository.getLibraryFile(manifest, library).toAbsolutePath().normalize();
184184
if (agentPath.toString().contains("=")) {
185185
throw new IOException("Invalid library path: " + agentPath);
186186
}

HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java

Lines changed: 223 additions & 192 deletions
Large diffs are not rendered by default.

HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,29 +37,29 @@
3737

3838
public final class HMCLModpackInstallTask extends Task<Void> {
3939
private final Path zipFile;
40-
private final String name;
40+
private final GameInstanceID instanceId;
4141
private final HMCLGameRepository repository;
4242
private final DefaultDependencyManager dependency;
4343
private final Modpack modpack;
4444
private final List<Task<?>> dependencies = new ArrayList<>(1);
4545
private final List<Task<?>> dependents = new ArrayList<>(4);
4646

47-
public HMCLModpackInstallTask(HMCLGameRepository repository, Path zipFile, Modpack modpack, String name) {
47+
public HMCLModpackInstallTask(HMCLGameRepository repository, Path zipFile, Modpack modpack, GameInstanceID instanceId) {
4848
this.repository = repository;
4949
this.dependency = repository.getDependency();
5050
this.zipFile = zipFile;
51-
this.name = name;
51+
this.instanceId = instanceId;
5252
this.modpack = modpack;
5353

54-
Path run = repository.getRunDirectory(name);
55-
Path json = repository.getModpackConfiguration(name);
56-
if (repository.hasVersion(name) && Files.notExists(json))
57-
throw new IllegalArgumentException("Version " + name + " already exists");
54+
Path run = repository.getRunDirectory(this.instanceId);
55+
Path json = repository.getModpackConfiguration(this.instanceId);
56+
if (repository.hasInstance(this.instanceId) && Files.notExists(json))
57+
throw new IllegalArgumentException("Instance " + instanceId + " already exists");
5858

59-
dependents.add(dependency.gameBuilder().name(name).gameVersion(modpack.getGameVersion()).buildAsync());
59+
dependents.add(dependency.newGameBuilder().name(this.instanceId).gameVersion(modpack.getGameVersion()).buildAsync());
6060

6161
onDone().register(event -> {
62-
if (event.isFailed()) repository.removeVersionFromDisk(name);
62+
if (event.isFailed()) repository.removeInstanceFromDisk(this.instanceId);
6363
});
6464

6565
ModpackConfiguration<Modpack> config = null;
@@ -68,12 +68,12 @@ public HMCLModpackInstallTask(HMCLGameRepository repository, Path zipFile, Modpa
6868
config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(Modpack.class));
6969

7070
if (!HMCLModpackProvider.INSTANCE.getName().equals(config.getType()))
71-
throw new IllegalArgumentException("Version " + name + " is not a HMCL modpack. Cannot update this version.");
71+
throw new IllegalArgumentException("Instance " + instanceId + " is not a HMCL modpack. Cannot update this instance.");
7272
}
7373
} catch (JsonParseException | IOException ignore) {
7474
}
7575
dependents.add(new ModpackInstallTask<>(zipFile, run, modpack.getEncoding(), Collections.singletonList("/minecraft"), it -> !"pack.json".equals(it), config));
76-
dependents.add(new MinecraftInstanceTask<>(zipFile, modpack.getEncoding(), Collections.singletonList("/minecraft"), modpack, HMCLModpackProvider.INSTANCE, modpack.getName(), modpack.getVersion(), repository.getModpackConfiguration(name)).withStage("hmcl.modpack"));
76+
dependents.add(new MinecraftInstanceTask<>(zipFile, modpack.getEncoding(), Collections.singletonList("/minecraft"), modpack, HMCLModpackProvider.INSTANCE, modpack.getName(), modpack.getVersion(), repository.getModpackConfiguration(this.instanceId)).withStage("hmcl.modpack"));
7777
}
7878

7979
@Override
@@ -89,9 +89,9 @@ public List<Task<?>> getDependents() {
8989
@Override
9090
public void execute() throws Exception {
9191
String json = CompressingUtils.readTextZipEntry(zipFile, "minecraft/pack.json");
92-
Version originalVersion = JsonUtils.GSON.fromJson(json, Version.class).setId(name).setJar(null);
93-
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(originalVersion, null);
94-
Task<Version> libraryTask = Task.supplyAsync(() -> originalVersion);
92+
GameInstanceManifest originalManifest = JsonUtils.GSON.fromJson(json, GameInstanceManifest.class).withId(instanceId).withJar(null);
93+
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(originalManifest, null);
94+
Task<GameInstanceManifest> libraryTask = Task.supplyAsync(() -> originalManifest);
9595
// reinstall libraries
9696
// libraries of Forge and OptiFine should be obtained by installation.
9797
for (LibraryAnalyzer.LibraryMark mark : analyzer) {

HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackProvider.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,42 +42,42 @@ public String getName() {
4242
}
4343

4444
@Override
45-
public Task<?> createCompletionTask(DefaultDependencyManager dependencyManager, String version) {
45+
public Task<?> createCompletionTask(DefaultDependencyManager dependencyManager, GameInstanceID instanceId) {
4646
return null;
4747
}
4848

4949
@Override
50-
public Task<?> createUpdateTask(DefaultDependencyManager dependencyManager, String name, Path zipFile, Modpack modpack) throws MismatchedModpackTypeException {
50+
public Task<?> createUpdateTask(DefaultDependencyManager dependencyManager, GameInstanceID instanceId, Path zipFile, Modpack modpack) throws MismatchedModpackTypeException {
5151
if (!(modpack.getManifest() instanceof HMCLModpackManifest))
5252
throw new MismatchedModpackTypeException(getName(), modpack.getManifest().getProvider().getName());
5353

5454
if (!(dependencyManager.getGameRepository() instanceof HMCLGameRepository repository)) {
5555
throw new IllegalArgumentException("HMCLModpackProvider requires HMCLGameRepository");
5656
}
5757

58-
return new ModpackUpdateTask(dependencyManager.getGameRepository(), name, new HMCLModpackInstallTask(repository, zipFile, modpack, name));
58+
return new ModpackUpdateTask(dependencyManager.getGameRepository(), instanceId, new HMCLModpackInstallTask(repository, zipFile, modpack, instanceId));
5959
}
6060

6161
@Override
6262
public Modpack readManifest(ZipArchiveReader file, Path path, Charset encoding) throws IOException, JsonParseException {
6363
String manifestJson = CompressingUtils.readTextZipEntry(file, "modpack.json");
6464
Modpack manifest = JsonUtils.fromNonNullJson(manifestJson, HMCLModpack.class).setEncoding(encoding);
6565
String gameJson = CompressingUtils.readTextZipEntry(file, "minecraft/pack.json");
66-
Version game = JsonUtils.fromNonNullJson(gameJson, Version.class);
67-
if (game.getJar() == null)
66+
GameInstanceManifest game = JsonUtils.fromNonNullJson(gameJson, GameInstanceManifest.class);
67+
if (game.jar() == null)
6868
if (StringUtils.isBlank(manifest.getVersion()))
6969
throw new JsonParseException("Cannot recognize the game version of modpack " + file + ".");
7070
else
7171
manifest.setManifest(HMCLModpackManifest.INSTANCE);
7272
else
73-
manifest.setManifest(HMCLModpackManifest.INSTANCE).setGameVersion(game.getJar());
73+
manifest.setManifest(HMCLModpackManifest.INSTANCE).setGameVersion(game.jar().id());
7474
return manifest;
7575
}
7676

7777
private final static class HMCLModpack extends Modpack {
7878
@Override
79-
public Task<?> getInstallTask(DefaultDependencyManager dependencyManager, Path zipFile, String name, String iconUrl) {
80-
return new HMCLModpackInstallTask((HMCLGameRepository) dependencyManager.getGameRepository(), zipFile, this, name);
79+
public Task<?> getInstallTask(DefaultDependencyManager dependencyManager, Path zipFile, GameInstanceID instanceId, String iconUrl) {
80+
return new HMCLModpackInstallTask((HMCLGameRepository) dependencyManager.getGameRepository(), zipFile, this, instanceId);
8181
}
8282
}
8383

0 commit comments

Comments
 (0)