修复启动游戏补全文件时,任务没有正确归类的问题 (#5430)
Co-authored-by: Glavo <zjx001202@gmail.com>
This commit is contained in:
@@ -22,7 +22,6 @@ import org.jackhuang.hmcl.task.Task;
|
||||
import org.jackhuang.hmcl.util.function.ExceptionalFunction;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -43,28 +42,28 @@ public class DefaultGameBuilder extends GameBuilder {
|
||||
|
||||
@Override
|
||||
public Task<?> buildAsync() {
|
||||
List<String> stages = new ArrayList<>();
|
||||
var hints = new ArrayList<Task.StagesHint>();
|
||||
|
||||
Task<Version> libraryTask = Task.supplyAsync(() -> new Version(name));
|
||||
libraryTask = libraryTask.thenComposeAsync(libraryTaskHelper(gameVersion, "game", gameVersion));
|
||||
stages.add("hmcl.install.game:" + gameVersion);
|
||||
stages.add("hmcl.install.libraries");
|
||||
stages.add("hmcl.install.assets");
|
||||
hints.add(new Task.StagesHint("hmcl.install.game:" + gameVersion));
|
||||
hints.add(new Task.StagesHint("hmcl.install.libraries"));
|
||||
hints.add(new Task.StagesHint("hmcl.install.assets"));
|
||||
|
||||
for (Map.Entry<String, String> entry : toolVersions.entrySet()) {
|
||||
libraryTask = libraryTask.thenComposeAsync(libraryTaskHelper(gameVersion, entry.getKey(), entry.getValue()));
|
||||
stages.add(String.format("hmcl.install.%s:%s", entry.getKey(), entry.getValue()));
|
||||
hints.add(new Task.StagesHint(String.format("hmcl.install.%s:%s", entry.getKey(), entry.getValue())));
|
||||
}
|
||||
|
||||
for (RemoteVersion remoteVersion : remoteVersions) {
|
||||
libraryTask = libraryTask.thenComposeAsync(version -> dependencyManager.installLibraryAsync(version, remoteVersion));
|
||||
stages.add(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion()));
|
||||
hints.add(new Task.StagesHint(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion())));
|
||||
}
|
||||
|
||||
return libraryTask.thenComposeAsync(dependencyManager.getGameRepository()::saveAsync).whenComplete(exception -> {
|
||||
if (exception != null)
|
||||
dependencyManager.getGameRepository().removeVersionFromDisk(name);
|
||||
}).withStagesHint(stages);
|
||||
}).withStagesHints(hints);
|
||||
}
|
||||
|
||||
private ExceptionalFunction<Version, Task<Version>, ?> libraryTaskHelper(String gameVersion, String libraryId, String libraryVersion) {
|
||||
|
||||
@@ -871,15 +871,29 @@ public abstract class Task<T> {
|
||||
return new FakeProgressTask(done, k).setExecutor(Schedulers.defaultScheduler()).setName(name).setSignificance(TaskSignificance.MAJOR);
|
||||
}
|
||||
|
||||
public Task<T> withStagesHint(List<String> stages) {
|
||||
return new StagesHintTask(stages);
|
||||
public record StagesHint(String stage, List<String> aliases) {
|
||||
public StagesHint(String stage) {
|
||||
this(stage, List.of());
|
||||
}
|
||||
}
|
||||
|
||||
public Task<T> withStagesHints(String... hints) {
|
||||
return withStagesHints(Arrays.stream(hints).map(StagesHint::new).toList());
|
||||
}
|
||||
|
||||
public Task<T> withStagesHints(StagesHint... hints) {
|
||||
return new StagesHintTask(List.of(hints));
|
||||
}
|
||||
|
||||
public Task<T> withStagesHints(List<StagesHint> hints) {
|
||||
return new StagesHintTask(hints);
|
||||
}
|
||||
|
||||
public class StagesHintTask extends Task<T> {
|
||||
private final List<String> stages;
|
||||
private final List<StagesHint> hints;
|
||||
|
||||
public StagesHintTask(List<String> stages) {
|
||||
this.stages = stages;
|
||||
public StagesHintTask(List<StagesHint> hints) {
|
||||
this.hints = hints;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -892,8 +906,8 @@ public abstract class Task<T> {
|
||||
setResult(Task.this.getResult());
|
||||
}
|
||||
|
||||
public List<String> getStages() {
|
||||
return stages;
|
||||
public List<StagesHint> getHints() {
|
||||
return hints;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,11 +26,13 @@ public abstract class TaskExecutor {
|
||||
protected final List<TaskListener> taskListeners = new ArrayList<>(0);
|
||||
protected volatile boolean cancelled = false;
|
||||
protected Exception exception;
|
||||
private final List<String> stages;
|
||||
private final List<Task.StagesHint> hints;
|
||||
|
||||
public TaskExecutor(Task<?> task) {
|
||||
this.firstTask = task;
|
||||
this.stages = task instanceof Task<?>.StagesHintTask hintTask ? hintTask.getStages() : Collections.emptyList();
|
||||
this.hints = task instanceof Task<?>.StagesHintTask hintTask
|
||||
? hintTask.getHints()
|
||||
: List.of();
|
||||
}
|
||||
|
||||
public void addTaskListener(TaskListener taskListener) {
|
||||
@@ -59,7 +61,7 @@ public abstract class TaskExecutor {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
public List<String> getStages() {
|
||||
return stages;
|
||||
public List<Task.StagesHint> getHints() {
|
||||
return hints;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user