Skip to content

Commit d2a9024

Browse files
CiiLuGlavo
andauthored
修复启动游戏补全文件时,任务没有正确归类的问题 (#5430)
Co-authored-by: Glavo <zjx001202@gmail.com>
1 parent 5e5d777 commit d2a9024

8 files changed

Lines changed: 76 additions & 49 deletions

File tree

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,11 @@ private void launch0() {
249249
i18n("message.doing"),
250250
() -> launchingLatch.getCount() == 0, 6.95
251251
).withStage("launch.state.waiting_launching"))
252-
.withStagesHint(Lang.immutableListOf(
253-
"launch.state.java",
254-
"launch.state.dependencies",
255-
"launch.state.logging_in",
256-
"launch.state.waiting_launching"))
252+
.withStagesHints(
253+
new Task.StagesHint("launch.state.java"),
254+
new Task.StagesHint("launch.state.dependencies", List.of("hmcl.install.assets", "hmcl.install.libraries", "hmcl.modpack.download")),
255+
new Task.StagesHint("launch.state.logging_in"),
256+
new Task.StagesHint("launch.state.waiting_launching"))
257257
.executor();
258258
launchingStepsPane.setExecutor(executor, false);
259259
executor.addTaskListener(new TaskListener() {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public static Task<?> getInstallTask(Profile profile, ServerModpackManifest mani
167167

168168
return new ServerModpackRemoteInstallTask(profile.getDependency(), manifest, name)
169169
.whenComplete(Schedulers.defaultScheduler(), success, failure)
170-
.withStagesHint(Arrays.asList("hmcl.modpack", "hmcl.modpack.download"));
170+
.withStagesHints("hmcl.modpack", "hmcl.modpack.download");
171171
}
172172

173173
public static boolean isExternalGameNameConflicts(String name) {
@@ -211,24 +211,24 @@ public static Task<?> getInstallTask(Profile profile, Path zipFile, String name,
211211
return modpack.getInstallTask(profile.getDependency(), zipFile, name, iconUrl)
212212
.whenComplete(Schedulers.defaultScheduler(), success, failure)
213213
.thenComposeAsync(createMultiMCPostInstallTask(profile, (MultiMCInstanceConfiguration) modpack.getManifest(), name))
214-
.withStagesHint(List.of("hmcl.modpack", "hmcl.modpack.download"));
214+
.withStagesHints("hmcl.modpack", "hmcl.modpack.download");
215215
else if (modpack.getManifest() instanceof McbbsModpackManifest)
216216
return modpack.getInstallTask(profile.getDependency(), zipFile, name, iconUrl)
217217
.whenComplete(Schedulers.defaultScheduler(), success, failure)
218218
.thenComposeAsync(createMcbbsPostInstallTask(profile, (McbbsModpackManifest) modpack.getManifest(), name))
219-
.withStagesHint(List.of("hmcl.modpack", "hmcl.modpack.download"));
219+
.withStagesHints("hmcl.modpack", "hmcl.modpack.download");
220220
else
221221
return modpack.getInstallTask(profile.getDependency(), zipFile, name, iconUrl)
222222
.whenComplete(Schedulers.javafx(), success, failure)
223-
.withStagesHint(List.of("hmcl.modpack", "hmcl.modpack.download"));
223+
.withStagesHints("hmcl.modpack", "hmcl.modpack.download");
224224
}
225225

226226
public static Task<Void> getUpdateTask(Profile profile, ServerModpackManifest manifest, Charset charset, String name, ModpackConfiguration<?> configuration) throws UnsupportedModpackException {
227227
switch (configuration.getType()) {
228228
case ServerModpackRemoteInstallTask.MODPACK_TYPE:
229229
return new ModpackUpdateTask(profile.getRepository(), name, new ServerModpackRemoteInstallTask(profile.getDependency(), manifest, name))
230230
.thenComposeAsync(profile.getRepository().refreshVersionsAsync())
231-
.withStagesHint(Arrays.asList("hmcl.modpack", "hmcl.modpack.download"));
231+
.withStagesHints("hmcl.modpack", "hmcl.modpack.download");
232232
default:
233233
throw new UnsupportedModpackException();
234234
}

HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,18 @@ public TaskListPane() {
106106
}
107107

108108
@FXThread
109-
private void addStages(@NotNull Collection<String> stages) {
110-
for (String stage : stages) {
111-
stageNodes.computeIfAbsent(stage, s -> {
112-
StageNode node = new StageNode(stage);
109+
private void addStagesHints(@NotNull Collection<Task.StagesHint> hints) {
110+
for (Task.StagesHint hint : hints) {
111+
StageNode node = stageNodes.get(hint.stage());
112+
113+
if (node == null) {
114+
node = new StageNode(hint.stage());
115+
stageNodes.put(hint.stage(), node);
113116
listView.getItems().add(node);
114-
return node;
115-
});
117+
}
118+
for (String stage : hint.aliases()) {
119+
stageNodes.put(stage, node);
120+
}
116121
}
117122
}
118123

@@ -129,7 +134,7 @@ public void onStart() {
129134
Platform.runLater(() -> {
130135
stageNodes.clear();
131136
listView.getItems().clear();
132-
addStages(executor.getStages());
137+
addStagesHints(executor.getHints());
133138
updateProgressNodePadding();
134139
});
135140
}
@@ -138,7 +143,7 @@ public void onStart() {
138143
public void onReady(Task<?> task) {
139144
if (task instanceof Task.StagesHintTask) {
140145
Platform.runLater(() -> {
141-
addStages(((Task<?>.StagesHintTask) task).getStages());
146+
addStagesHints(((Task<?>.StagesHintTask) task).getHints());
142147
updateProgressNodePadding();
143148
});
144149
}
@@ -394,6 +399,8 @@ private static abstract class Node {
394399
}
395400

396401
private static final class StageNode extends Node {
402+
private int runningTasksCount = 0;
403+
397404
private enum Status {
398405
WAITING(SVG.MORE_HORIZ),
399406
RUNNING(SVG.ARROW_FORWARD),
@@ -454,17 +461,23 @@ private StageNode(String stage) {
454461
}
455462

456463
private void begin() {
457-
if (status.get() == Status.WAITING) {
464+
runningTasksCount++;
465+
if (status.get() == Status.WAITING || status.get() == Status.SUCCESS) {
458466
status.set(Status.RUNNING);
459467
}
460468
}
461469

462-
public void fail() {
463-
status.set(Status.FAILED);
470+
public void succeed() {
471+
runningTasksCount = Math.max(0, runningTasksCount - 1);
472+
473+
if (runningTasksCount == 0) {
474+
status.set(Status.SUCCESS);
475+
}
464476
}
465477

466-
public void succeed() {
467-
status.set(Status.SUCCESS);
478+
public void fail() {
479+
runningTasksCount = Math.max(0, runningTasksCount - 1);
480+
status.set(Status.FAILED);
468481
}
469482

470483
public void count() {

HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import java.net.SocketTimeoutException;
4141
import java.net.URI;
4242
import java.util.ArrayList;
43-
import java.util.List;
4443
import java.util.concurrent.CancellationException;
4544
import java.util.zip.ZipException;
4645

@@ -78,21 +77,21 @@ public Object finish(SettingsMap settings) {
7877
// We remove library but not save it,
7978
// so if installation failed will not break down current version.
8079
Task<Version> ret = Task.supplyAsync(() -> version);
81-
List<String> stages = new ArrayList<>();
80+
var hints = new ArrayList<Task.StagesHint>();
8281
for (Object value : settings.asStringMap().values()) {
8382
if (value instanceof RemoteVersion remoteVersion) {
8483
ret = ret.thenComposeAsync(version -> dependencyManager.installLibraryAsync(version, remoteVersion));
85-
stages.add(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion()));
84+
hints.add(new Task.StagesHint(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion())));
8685
if ("game".equals(remoteVersion.getLibraryId())) {
87-
stages.add("hmcl.install.libraries");
88-
stages.add("hmcl.install.assets");
86+
hints.add(new Task.StagesHint("hmcl.install.libraries"));
87+
hints.add(new Task.StagesHint("hmcl.install.assets"));
8988
}
9089
} else if (value instanceof RemoveVersionAction removeVersionAction) {
9190
ret = ret.thenComposeAsync(version -> dependencyManager.removeLibraryAsync(version, removeVersionAction.libraryId));
9291
}
9392
}
9493

95-
return ret.thenComposeAsync(profile.getRepository()::saveAsync).thenComposeAsync(profile.getRepository().refreshVersionsAsync()).withStagesHint(stages);
94+
return ret.thenComposeAsync(profile.getRepository()::saveAsync).thenComposeAsync(profile.getRepository().refreshVersionsAsync()).withStagesHints(hints);
9695
}
9796

9897
@Override

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ public void checkUpdates(Collection<LocalModFile> mods) {
252252
Controllers.navigateForward(new ModUpdatesPage(modManager, result));
253253
}
254254
})
255-
.withStagesHint(Collections.singletonList("update.checking")),
255+
.withStagesHints("update.checking"),
256256
i18n("mods.check_updates"), TaskCancellationAction.NORMAL);
257257

258258
if (profile.getRepository().isModpack(instanceId)) {

HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.jackhuang.hmcl.util.function.ExceptionalFunction;
2323

2424
import java.util.ArrayList;
25-
import java.util.List;
2625
import java.util.Map;
2726

2827
/**
@@ -43,28 +42,28 @@ public DefaultDependencyManager getDependencyManager() {
4342

4443
@Override
4544
public Task<?> buildAsync() {
46-
List<String> stages = new ArrayList<>();
45+
var hints = new ArrayList<Task.StagesHint>();
4746

4847
Task<Version> libraryTask = Task.supplyAsync(() -> new Version(name));
4948
libraryTask = libraryTask.thenComposeAsync(libraryTaskHelper(gameVersion, "game", gameVersion));
50-
stages.add("hmcl.install.game:" + gameVersion);
51-
stages.add("hmcl.install.libraries");
52-
stages.add("hmcl.install.assets");
49+
hints.add(new Task.StagesHint("hmcl.install.game:" + gameVersion));
50+
hints.add(new Task.StagesHint("hmcl.install.libraries"));
51+
hints.add(new Task.StagesHint("hmcl.install.assets"));
5352

5453
for (Map.Entry<String, String> entry : toolVersions.entrySet()) {
5554
libraryTask = libraryTask.thenComposeAsync(libraryTaskHelper(gameVersion, entry.getKey(), entry.getValue()));
56-
stages.add(String.format("hmcl.install.%s:%s", entry.getKey(), entry.getValue()));
55+
hints.add(new Task.StagesHint(String.format("hmcl.install.%s:%s", entry.getKey(), entry.getValue())));
5756
}
5857

5958
for (RemoteVersion remoteVersion : remoteVersions) {
6059
libraryTask = libraryTask.thenComposeAsync(version -> dependencyManager.installLibraryAsync(version, remoteVersion));
61-
stages.add(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion()));
60+
hints.add(new Task.StagesHint(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion())));
6261
}
6362

6463
return libraryTask.thenComposeAsync(dependencyManager.getGameRepository()::saveAsync).whenComplete(exception -> {
6564
if (exception != null)
6665
dependencyManager.getGameRepository().removeVersionFromDisk(name);
67-
}).withStagesHint(stages);
66+
}).withStagesHints(hints);
6867
}
6968

7069
private ExceptionalFunction<Version, Task<Version>, ?> libraryTaskHelper(String gameVersion, String libraryId, String libraryVersion) {

HMCLCore/src/main/java/org/jackhuang/hmcl/task/Task.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -871,15 +871,29 @@ public Task<T> withFakeProgress(String name, BooleanSupplier done, double k) {
871871
return new FakeProgressTask(done, k).setExecutor(Schedulers.defaultScheduler()).setName(name).setSignificance(TaskSignificance.MAJOR);
872872
}
873873

874-
public Task<T> withStagesHint(List<String> stages) {
875-
return new StagesHintTask(stages);
874+
public record StagesHint(String stage, List<String> aliases) {
875+
public StagesHint(String stage) {
876+
this(stage, List.of());
877+
}
878+
}
879+
880+
public Task<T> withStagesHints(String... hints) {
881+
return withStagesHints(Arrays.stream(hints).map(StagesHint::new).toList());
882+
}
883+
884+
public Task<T> withStagesHints(StagesHint... hints) {
885+
return new StagesHintTask(List.of(hints));
886+
}
887+
888+
public Task<T> withStagesHints(List<StagesHint> hints) {
889+
return new StagesHintTask(hints);
876890
}
877891

878892
public class StagesHintTask extends Task<T> {
879-
private final List<String> stages;
893+
private final List<StagesHint> hints;
880894

881-
public StagesHintTask(List<String> stages) {
882-
this.stages = stages;
895+
public StagesHintTask(List<StagesHint> hints) {
896+
this.hints = hints;
883897
}
884898

885899
@Override
@@ -892,8 +906,8 @@ public void execute() {
892906
setResult(Task.this.getResult());
893907
}
894908

895-
public List<String> getStages() {
896-
return stages;
909+
public List<StagesHint> getHints() {
910+
return hints;
897911
}
898912
}
899913

HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ public abstract class TaskExecutor {
2626
protected final List<TaskListener> taskListeners = new ArrayList<>(0);
2727
protected volatile boolean cancelled = false;
2828
protected Exception exception;
29-
private final List<String> stages;
29+
private final List<Task.StagesHint> hints;
3030

3131
public TaskExecutor(Task<?> task) {
3232
this.firstTask = task;
33-
this.stages = task instanceof Task<?>.StagesHintTask hintTask ? hintTask.getStages() : Collections.emptyList();
33+
this.hints = task instanceof Task<?>.StagesHintTask hintTask
34+
? hintTask.getHints()
35+
: List.of();
3436
}
3537

3638
public void addTaskListener(TaskListener taskListener) {
@@ -59,7 +61,7 @@ public boolean isCancelled() {
5961
return cancelled;
6062
}
6163

62-
public List<String> getStages() {
63-
return stages;
64+
public List<Task.StagesHint> getHints() {
65+
return hints;
6466
}
6567
}

0 commit comments

Comments
 (0)