diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 548c3c368..b8da9da44 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -105,6 +105,10 @@ public final class Launcher extends Application { return; } + if (ConfigHolder.isUnsupportedVersion()) { + showAlert(AlertType.WARNING, i18n("fatal.config_unsupported_version")); + } + if (Metadata.HMCL_CURRENT_DIRECTORY.toString().indexOf('=') >= 0) { Main.showWarningAndContinue(i18n("fatal.illegal_char")); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java index 39630b36c..bde5c4651 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java @@ -50,6 +50,7 @@ import java.util.TreeMap; public final class Config implements Observable { + public static final int CURRENT_VERSION = 2; public static final int CURRENT_UI_VERSION = 0; public static final Gson CONFIG_GSON = new GsonBuilder() diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index 7bc0f1a64..89d3bf36e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -45,6 +45,7 @@ public final class ConfigHolder { private static GlobalConfig globalConfigInstance; private static boolean newlyCreated; private static boolean ownerChanged = false; + private static boolean unsupportedVersion = false; public static Config config() { if (configInstance == null) { @@ -72,6 +73,10 @@ public final class ConfigHolder { return ownerChanged; } + public static boolean isUnsupportedVersion() { + return unsupportedVersion; + } + public static void init() throws IOException { if (configInstance != null) { throw new IllegalStateException("Configuration is already loaded"); @@ -82,7 +87,8 @@ public final class ConfigHolder { LOG.info("Config location: " + configLocation); configInstance = loadConfig(); - configInstance.addListener(source -> FileSaver.save(configLocation, configInstance.toJson())); + if (!unsupportedVersion) + configInstance.addListener(source -> FileSaver.save(configLocation, configInstance.toJson())); globalConfigInstance = loadGlobalConfig(); globalConfigInstance.addListener(source -> FileSaver.save(GLOBAL_CONFIG_PATH, globalConfigInstance.toJson())); @@ -162,7 +168,14 @@ public final class ConfigHolder { if (deserialized == null) { LOG.info("Config is empty"); } else { - ConfigUpgrader.upgradeConfig(deserialized, content); + int configVersion = deserialized.getConfigVersion(); + if (configVersion < Config.CURRENT_VERSION) { + ConfigUpgrader.upgradeConfig(deserialized, content); + } else if (configVersion > Config.CURRENT_VERSION) { + unsupportedVersion = true; + LOG.warning(String.format("Current HMCL only support the configuration version up to %d. However, the version now is %d.", Config.CURRENT_VERSION, configVersion)); + } + return deserialized; } } catch (JsonParseException e) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java index cade4d8c7..2eded388f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java @@ -31,8 +31,6 @@ final class ConfigUpgrader { private ConfigUpgrader() { } - private static final int CURRENT_VERSION = 2; - /** * This method is for the compatibility with old HMCL versions. * @@ -42,17 +40,10 @@ final class ConfigUpgrader { static void upgradeConfig(Config deserialized, String rawContent) { int configVersion = deserialized.getConfigVersion(); - if (configVersion == CURRENT_VERSION) { + if (configVersion >= Config.CURRENT_VERSION) return; - } - if (configVersion > CURRENT_VERSION) { - LOG.warning(String.format("Current HMCL only support the configuration version up to %d. However, the version now is %d.", CURRENT_VERSION, configVersion)); - deserialized.setConfigVersion(CURRENT_VERSION); - return; - } - - LOG.info(String.format("Updating configuration from %d to %d.", configVersion, CURRENT_VERSION)); + LOG.info(String.format("Updating configuration from %d to %d.", configVersion, Config.CURRENT_VERSION)); Map rawJson = Collections.unmodifiableMap(new Gson().>fromJson(rawContent, Map.class)); if (configVersion < 1) { @@ -100,6 +91,6 @@ final class ConfigUpgrader { } } - deserialized.setConfigVersion(CURRENT_VERSION); + deserialized.setConfigVersion(Config.CURRENT_VERSION); } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index d45ec740b..46bd6c1fd 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -387,6 +387,9 @@ fatal.config_loading_failure=Cannot load configuration files.\n\ For macOS, try putting HMCL somewhere with permissions other than "Desktop", "Downloads", and "Documents" and try again. fatal.config_loading_failure.unix=Hello Minecraft! Launcher could not load the configuration file because it was created by user "%1$s".\n\ Please open HMCL as root user (not recommended), or execute the following command in the terminal to change the ownership of the configuration file to the current user:\n%2$s +fatal.config_unsupported_version=The current configuration file was created by a newer version of Hello Minecraft! Launcher, and this version of HMCL cannot load it properly.\n\ + Please update and restart HMCL.\n\ + Before updating the launcher, any settings you modify will not be saved. fatal.mac_app_translocation=Hello Minecraft! Launcher is isolated to a temporary directory by the OS due to macOS security mechanisms.\n\ Please move HMCL to a different directory before attempting to open. Otherwise, your settings and game data may be lost after restarting.\n\ Do you still want to continue? diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 3cb3090cc..7ff466928 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -376,6 +376,7 @@ fatal.config_change_owner_root=你正在使用 root 帳戶開啟 Hello Minecraft fatal.config_in_temp_dir=你正在暫存目錄中開啟 Hello Minecraft! Launcher,你的設定和遊戲資料可能會遺失。建議將 HMCL 移動至其他位置再開啟。\n是否繼續開啟? fatal.config_loading_failure=Hello Minecraft! Launcher 無法載入設定檔案。\n請確保 HMCL 對「%s」目錄及該目錄下的檔案擁有讀寫權限。 fatal.config_loading_failure.unix=Hello Minecraft! Launcher 無法載入設定檔案,因為設定檔案是由使用者「%1$s」建立的。\n請使用 root 帳戶開啟 HMCL (不推薦),或在終端中執行以下指令將設定檔案的所有權變更為目前使用者:\n%2$s +fatal.config_unsupported_version=當前設定檔案是由更高版本的 Hello Minecraft! Launcher 建立的,目前版本的 HMCL 無法正常載入。請更新並重新啟動 HMCL。\n在更新啟動器之前,你所做的所有設定更改都不會被保存。 fatal.mac_app_translocation=由於 macOS 的安全機制,Hello Minecraft! Launcher 被系統隔離至暫存目錄中。\n請將 HMCL 移動到其他目錄後再嘗試開啟,否則你的設定和遊戲資料可能會在重啟後遺失。\n是否繼續開啟? fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即將升級完成,請重新開啟 HMCL。 fatal.apply_update_failure=我們很抱歉 Hello Minecraft! Launcher 無法自動完成升級程式,因為出現了一些問題。\n但你依然可以從 %s 處手動下載 HMCL 來完成升級。 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 5b8de0d2d..db0634f44 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -385,6 +385,7 @@ fatal.config_change_owner_root=你正在使用 root 账户启动 Hello Minecraft fatal.config_in_temp_dir=你正在临时文件夹中启动 Hello Minecraft! Launcher,你的设置和游戏数据可能会丢失。建议将 HMCL 移动至其他位置再启动。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? fatal.config_loading_failure=Hello Minecraft! Launcher 无法加载配置文件。\n请确保 HMCL 对“%s”文件夹及该文件夹下的文件拥有读写权限。\n对于 macOS,尝试将 HMCL 放在除“桌面”“下载”“文稿”之外的有权限的地方再试。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 fatal.config_loading_failure.unix=Hello Minecraft! Launcher 无法加载配置文件,因为配置文件是由用户“%1$s”创建的。\n请使用 root 账户启动 HMCL (不推荐),或在终端中执行以下命令将配置文件的所有权变更为当前用户:\n%2$s\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 +fatal.config_unsupported_version=当前配置文件是由更高版本的 Hello Minecraft! Launcher 创建的,当前版本的 HMCL 无法正常加载。请更新并重启 HMCL。\n在更新启动器之前,你修改的所有设置都不会被保存。\n如果遇到问题,你可以点击右上角帮助按钮进行求助。 fatal.mac_app_translocation=由于 macOS 的安全机制,Hello Minecraft! Launcher 被系统隔离至临时文件夹中。\n请将 HMCL 移动到其他文件夹后再尝试启动,否则你的设置和游戏数据可能会在重启后丢失。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。\n是否继续启动? fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即将完成升级,请重新打开 HMCL。\n如遇到问题,你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。 fatal.apply_update_failure=我们很抱歉 Hello Minecraft! Launcher 无法自动完成升级,因为出现了一些问题。\n但你依可以从 %s 手动下载 HMCL 来完成升级。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。