From 211d17f5b3636d7603e176a36f7df08712ea4a41 Mon Sep 17 00:00:00 2001 From: mineDiamond Date: Mon, 23 Mar 2026 21:06:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jackhuang/hmcl/ui/versions/WorldListPage.java | 2 +- .../java/org/jackhuang/hmcl/ui/versions/WorldManagePage.java | 2 +- .../org/jackhuang/hmcl/ui/versions/WorldManageUIUtils.java | 4 ++-- HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java index b5f0f355ad..8ad9a25161 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListPage.java @@ -189,7 +189,7 @@ public void delete(World world) { } public void copy(World world) { - WorldManageUIUtils.copyWorld(world, this::refresh); + WorldManageUIUtils.copyWorld(world, false, this::refresh); } public void reveal(World world) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManagePage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManagePage.java index 0e3ada32ba..e7427fa3ca 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManagePage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManagePage.java @@ -274,7 +274,7 @@ private AdvancedListBox getToolBar() { managePopupMenu.getContent().addAll( new IconedMenuItem(SVG.OUTPUT, i18n("world.export"), () -> WorldManageUIUtils.export(getSkinnable().world, getSkinnable().sessionLockChannel), managePopup), new IconedMenuItem(SVG.DELETE_FOREVER, i18n("world.delete"), () -> WorldManageUIUtils.delete(getSkinnable().world, () -> getSkinnable().fireEvent(new PageCloseEvent()), getSkinnable().sessionLockChannel), managePopup), - new IconedMenuItem(SVG.CONTENT_COPY, i18n("world.duplicate"), () -> WorldManageUIUtils.copyWorld(getSkinnable().world, null), managePopup) + new IconedMenuItem(SVG.CONTENT_COPY, i18n("world.duplicate"), () -> WorldManageUIUtils.copyWorld(getSkinnable().world, !getSkinnable().isReadOnly(), null), managePopup) ); toolbar.addNavigationDrawerItem(i18n("settings.game.management"), SVG.MENU, null, managePopupMenuItem -> diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManageUIUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManageUIUtils.java index 89010afd58..2beaefb4d1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManageUIUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldManageUIUtils.java @@ -87,7 +87,7 @@ public static void export(World world, FileChannel sessionLockChannel) { Controllers.getDecorator().startWizard(new SinglePageWizardProvider(controller -> new WorldExportPage(world, file, controller::onFinish))); } - public static void copyWorld(World world, Runnable runnable) { + public static void copyWorld(World world, boolean lockedByHmcl, Runnable runnable) { Path worldPath = world.getFile(); Controllers.dialog(new InputDialogPane( i18n("world.duplicate.prompt"), @@ -109,7 +109,7 @@ public static void copyWorld(World world, Runnable runnable) { return; } - Task.runAsync(Schedulers.io(), () -> world.copy(result)) + Task.runAsync(Schedulers.io(), () -> world.copy(result, lockedByHmcl)) .thenAcceptAsync(Schedulers.javafx(), (Void) -> Controllers.showToast(i18n("world.duplicate.success.toast"))) .thenAcceptAsync(Schedulers.javafx(), (Void) -> { if (runnable != null) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java index e3f4d57da9..809797529e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/World.java @@ -368,12 +368,12 @@ public void delete() throws IOException { FileUtils.forceDelete(file); } - public void copy(String newName) throws IOException { + public void copy(String newName, boolean lockedByHmcl) throws IOException { if (!Files.isDirectory(file)) { throw new IOException("Not a valid world directory"); } - if (isLocked()) { + if (!lockedByHmcl && isLocked()) { throw new WorldLockedException("The world " + getFile() + " has been locked"); }