feat: 添加新版本世界指定资源包位置支持 (#5552)

This commit is contained in:
mineDiamond
2026-02-20 21:34:10 +08:00
committed by GitHub
parent 1e42034a0b
commit 68c291e23a
2 changed files with 22 additions and 8 deletions

View File

@@ -21,6 +21,7 @@ import javafx.beans.property.BooleanProperty;
import javafx.collections.ObservableList;
import javafx.scene.control.Skin;
import javafx.stage.FileChooser;
import org.jackhuang.hmcl.game.World;
import org.jackhuang.hmcl.mod.Datapack;
import org.jackhuang.hmcl.task.Schedulers;
import org.jackhuang.hmcl.task.Task;
@@ -44,13 +45,13 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
import static org.jackhuang.hmcl.util.logging.Logger.LOG;
public final class DatapackListPage extends ListPageBase<DatapackListPageSkin.DatapackInfoObject> implements WorldManagePage.WorldRefreshable {
private final Path worldDir;
private final World world;
private final Datapack datapack;
final BooleanProperty readOnly;
public DatapackListPage(WorldManagePage worldManagePage) {
this.worldDir = worldManagePage.getWorld().getFile();
datapack = new Datapack(worldDir.resolve("datapacks"));
world = worldManagePage.getWorld();
datapack = new Datapack(world.getFile().resolve("datapacks"));
setItems(MappedObservableList.create(datapack.getPacks(), DatapackListPageSkin.DatapackInfoObject::new));
readOnly = worldManagePage.readOnlyProperty();
FXUtils.applyDragListener(this, it -> Objects.equals("zip", FileUtils.getExtension(it)),
@@ -68,7 +69,7 @@ public final class DatapackListPage extends ListPageBase<DatapackListPageSkin.Da
private void installSingleDatapack(Path datapack) {
try {
this.datapack.installPack(datapack);
this.datapack.installPack(datapack, world.getGameVersion());
} catch (IOException | IllegalArgumentException e) {
LOG.warning("Unable to parse datapack file " + datapack, e);
}

View File

@@ -29,6 +29,7 @@ import org.jackhuang.hmcl.util.gson.JsonUtils;
import org.jackhuang.hmcl.util.io.CompressingUtils;
import org.jackhuang.hmcl.util.io.FileUtils;
import org.jackhuang.hmcl.util.io.Unzipper;
import org.jackhuang.hmcl.util.versioning.GameVersionNumber;
import java.io.IOException;
import java.nio.file.*;
@@ -57,7 +58,7 @@ public class Datapack {
return packs;
}
public static void installPack(Path sourceDatapackPath, Path targetDatapackDirectory) throws IOException {
public static void installPack(Path sourceDatapackPath, Path targetDatapackDirectory, GameVersionNumber gameVersionNumber) throws IOException {
boolean containsMultiplePacks;
Set<String> packs = new HashSet<>();
try (FileSystem fs = CompressingUtils.readonly(sourceDatapackPath).setAutoDetectEncoding(true).build()) {
@@ -106,7 +107,19 @@ public class Datapack {
.setSubDirectory("/datapacks/")
.unzip();
try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetDatapackDirectory.getParent().resolve("resources.zip"));
Path targetResourceZipPath;
// When the version cannot be obtained, the old version logic is used by default.
boolean useNewResourcePath = gameVersionNumber != null
&& gameVersionNumber.compareTo("26.1-snapshot-6") >= 0;
if (useNewResourcePath) {
Files.createDirectories(targetDatapackDirectory.getParent().resolve("resourcepacks"));
targetResourceZipPath = targetDatapackDirectory.getParent().resolve("resourcepacks/resources.zip");
} else {
targetResourceZipPath = targetDatapackDirectory.getParent().resolve("resources.zip");
}
try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetResourceZipPath);
FileSystem inputPackZipFS = CompressingUtils.createReadOnlyZipFileSystem(sourceDatapackPath)) {
Path resourcesZip = inputPackZipFS.getPath("resources.zip");
if (Files.isRegularFile(resourcesZip)) {
@@ -138,8 +151,8 @@ public class Datapack {
}
}
public void installPack(Path sourcePackPath) throws IOException {
installPack(sourcePackPath, path);
public void installPack(Path sourcePackPath, GameVersionNumber gameVersionNumber) throws IOException {
installPack(sourcePackPath, path, gameVersionNumber);
loadFromDir();
}