From 0da57e97d61edb469f133793cc8db24f2856872b Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Tue, 17 Feb 2026 10:26:20 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=96=E7=95=8C=E8=B5=84=E6=BA=90=E5=8C=85?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/ui/versions/DatapackListPage.java | 6 +++++- .../java/org/jackhuang/hmcl/mod/Datapack.java | 15 +++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java index fb87db4696..1131c49658 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java @@ -21,6 +21,7 @@ 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; @@ -48,7 +49,10 @@ public final class DatapackListPage extends ListPageBase datapackPath) { 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); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index 48081fe486..2807781159 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -29,6 +29,7 @@ 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 ObservableList getPacks() { 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 packs = new HashSet<>(); try (FileSystem fs = CompressingUtils.readonly(sourceDatapackPath).setAutoDetectEncoding(true).build()) { @@ -106,7 +107,13 @@ public static void installPack(Path sourceDatapackPath, Path targetDatapackDirec .setSubDirectory("/datapacks/") .unzip(); - try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetDatapackDirectory.getParent().resolve("resources.zip")); + boolean newFormat = gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; + + if (newFormat) { + Files.createDirectories(targetDatapackDirectory.getParent().resolve("resourcepacks")); + } + + try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetDatapackDirectory.getParent().resolve(newFormat ? "resourcepacks/resources.zip" : "resources.zip")); FileSystem inputPackZipFS = CompressingUtils.createReadOnlyZipFileSystem(sourceDatapackPath)) { Path resourcesZip = inputPackZipFS.getPath("resources.zip"); if (Files.isRegularFile(resourcesZip)) { @@ -138,8 +145,8 @@ public static void installPack(Path sourceDatapackPath, Path targetDatapackDirec } } - public void installPack(Path sourcePackPath) throws IOException { - installPack(sourcePackPath, path); + public void installPack(Path sourcePackPath, GameVersionNumber gameVersionNumber) throws IOException { + installPack(sourcePackPath, path, gameVersionNumber); loadFromDir(); } From 402e30550b1cfe4b9bfe35331667cee393882ef0 Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Tue, 17 Feb 2026 11:30:43 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index 2807781159..2ff0c1d739 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -107,13 +107,13 @@ public static void installPack(Path sourceDatapackPath, Path targetDatapackDirec .setSubDirectory("/datapacks/") .unzip(); - boolean newFormat = gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; + boolean useNewWorldResourcePackLocation = gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; - if (newFormat) { + if (useNewWorldResourcePackLocation) { Files.createDirectories(targetDatapackDirectory.getParent().resolve("resourcepacks")); } - try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetDatapackDirectory.getParent().resolve(newFormat ? "resourcepacks/resources.zip" : "resources.zip")); + try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetDatapackDirectory.getParent().resolve(useNewWorldResourcePackLocation ? "resourcepacks/resources.zip" : "resources.zip")); FileSystem inputPackZipFS = CompressingUtils.createReadOnlyZipFileSystem(sourceDatapackPath)) { Path resourcesZip = inputPackZipFS.getPath("resources.zip"); if (Files.isRegularFile(resourcesZip)) { From 3017828ee4d6e13273d2b169297745170db386b2 Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Tue, 17 Feb 2026 13:52:46 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/jackhuang/hmcl/mod/Datapack.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index 2ff0c1d739..a4011190ad 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -107,13 +107,18 @@ public static void installPack(Path sourceDatapackPath, Path targetDatapackDirec .setSubDirectory("/datapacks/") .unzip(); - boolean useNewWorldResourcePackLocation = gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; + Path targetResourceZipPath; + boolean useNewResourcePath = gameVersionNumber != null + && gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; - if (useNewWorldResourcePackLocation) { + 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(targetDatapackDirectory.getParent().resolve(useNewWorldResourcePackLocation ? "resourcepacks/resources.zip" : "resources.zip")); + try (FileSystem outputResourcesZipFS = CompressingUtils.createWritableZipFileSystem(targetResourceZipPath); FileSystem inputPackZipFS = CompressingUtils.createReadOnlyZipFileSystem(sourceDatapackPath)) { Path resourcesZip = inputPackZipFS.getPath("resources.zip"); if (Files.isRegularFile(resourcesZip)) { From 11f93687a424b763611c3453003d7e9419e00212 Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Tue, 17 Feb 2026 14:16:14 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jackhuang/hmcl/ui/versions/DatapackListPage.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java index 1131c49658..a467304633 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java @@ -45,14 +45,13 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class DatapackListPage extends ListPageBase implements WorldManagePage.WorldRefreshable { + private final WorldManagePage worldManagePage; private final Path worldDir; private final Datapack datapack; final BooleanProperty readOnly; - private final World world; - public DatapackListPage(WorldManagePage worldManagePage) { - this.world = worldManagePage.getWorld(); + this.worldManagePage = worldManagePage; this.worldDir = worldManagePage.getWorld().getFile(); datapack = new Datapack(worldDir.resolve("datapacks")); setItems(MappedObservableList.create(datapack.getPacks(), DatapackListPageSkin.DatapackInfoObject::new)); @@ -72,7 +71,7 @@ private void installMultiDatapack(List datapackPath) { private void installSingleDatapack(Path datapack) { try { - this.datapack.installPack(datapack, world.getGameVersion()); + this.datapack.installPack(datapack, worldManagePage.getWorld().getGameVersion()); } catch (IOException | IllegalArgumentException e) { LOG.warning("Unable to parse datapack file " + datapack, e); } From f7357d004461c5df48a297ed639883ce0b384db2 Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Tue, 17 Feb 2026 14:16:53 +0800 Subject: [PATCH 5/8] fix style --- .../java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java | 1 - 1 file changed, 1 deletion(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java index a467304633..c204b17f3e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java @@ -21,7 +21,6 @@ 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; From 83a00610f280340deb8d035e761256ee867ad866 Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Tue, 17 Feb 2026 23:23:09 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java | 1 + 1 file changed, 1 insertion(+) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index a4011190ad..88c4db4d65 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -108,6 +108,7 @@ public static void installPack(Path sourceDatapackPath, Path targetDatapackDirec .unzip(); Path targetResourceZipPath; + // When the version cannot be obtained, the old version logic is used by default. boolean useNewResourcePath = gameVersionNumber != null && gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; From 0cff2d7e7209b73458bff201145ab55645185de3 Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 20 Feb 2026 21:27:18 +0800 Subject: [PATCH 7/8] update --- .../jackhuang/hmcl/ui/versions/DatapackListPage.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java index c204b17f3e..66745e5ad7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DatapackListPage.java @@ -21,6 +21,7 @@ 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,15 +45,13 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class DatapackListPage extends ListPageBase implements WorldManagePage.WorldRefreshable { - private final WorldManagePage worldManagePage; - private final Path worldDir; + private final World world; private final Datapack datapack; final BooleanProperty readOnly; public DatapackListPage(WorldManagePage worldManagePage) { - this.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)), @@ -70,7 +69,7 @@ private void installMultiDatapack(List datapackPath) { private void installSingleDatapack(Path datapack) { try { - this.datapack.installPack(datapack, worldManagePage.getWorld().getGameVersion()); + this.datapack.installPack(datapack, world.getGameVersion()); } catch (IOException | IllegalArgumentException e) { LOG.warning("Unable to parse datapack file " + datapack, e); } From b560e226032ba202cbb0afca55d7904cb0b16b5d Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 20 Feb 2026 21:29:07 +0800 Subject: [PATCH 8/8] update --- HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java index 88c4db4d65..3ac488582d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/Datapack.java @@ -110,7 +110,7 @@ public static void installPack(Path sourceDatapackPath, Path targetDatapackDirec Path targetResourceZipPath; // When the version cannot be obtained, the old version logic is used by default. boolean useNewResourcePath = gameVersionNumber != null - && gameVersionNumber.compareTo(GameVersionNumber.asGameVersion("26.1-snapshot-6")) >= 0; + && gameVersionNumber.compareTo("26.1-snapshot-6") >= 0; if (useNewResourcePath) { Files.createDirectories(targetDatapackDirectory.getParent().resolve("resourcepacks"));