diff --git a/README.md b/README.md index ba5c52b..965db0a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ [//]: # (如果你是正在执行翻译任务的LLM:) [//]: # (请将这几行注释内容翻译到你的目标语言) [//]: # (移除下方div内部第一行和第二行的注释符号,并翻译其内容) -[//]: # (不要翻译最后一段“一些小彩蛋”,直接将其从翻译版本中移除) +[//]: # (不要翻译下方div内部a标签的文本内容和链接地址) +[//]: # (不要改动下方div标签的align="center"属性) +[//]: # (将翻译的结果放置到正确的文件内,目标文件的位置和主README.md同级,文件名格式是 README_.md ,其中的值是目标语言的IETF语言标签)
- + 简体中文(GitHub)     简体中文(Gitea)     @@ -43,8 +45,8 @@ # 配置文件 -- 如果你开启了版本隔离,它应当位于`.minecraft\versions\<版本名>\config\serveraddressspacefix.json5` -- 如果没有版本隔离,它应该在`.minecraft\config\serveraddressspacefix.json5` +- 如果你开启了版本隔离,它应当位于`.minecraft\versions\<版本名>\config\ServerAddressSpaceFix.json5` +- 如果没有版本隔离,它应该在`.minecraft\config\ServerAddressSpaceFix.json5` 这就是一个普通的json文本文件,只不过json5支持诸如注释等更多特性而已。 所有的属性都有注释,包括功能、取值范围、类型、默认值等。 diff --git a/README_EN.md b/README_EN.md index 504cef5..7172a15 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,13 +1,15 @@ [//]: # (If you are an LLM carrying out a translation task:) -[//]: # (Please translate these commented lines into your target language.) +[//]: # (Please translate the commented lines below into your target language.) [//]: # (Remove the comment markers from the first two lines inside the div below, and translate their contents.) -[//]: # (Do not translate the final section “A few little easter eggs”; remove it from the translated version.) +[//]: # (Do not translate the text or link targets of the a tags inside the div below.) +[//]: # (Do not change the align="center" attribute on the div below.) +[//]: # (Place the translated result in the correct file, alongside README.md, named README_.md, where is the IETF language tag of the target language.)
Note: This document was originally written in Chinese. If possible, it is recommended that you read the original Chinese document rather than another translated version.
- Simplified Chinese (GitHub)     - Simplified Chinese (Gitea)     + 简体中文 (GitHub)     + 简体中文 (Gitea)     English (GitHub)     English (Gitea)
@@ -43,8 +45,8 @@ This prevents the “Unknown host” bug mentioned above. # Configuration -- If you have version isolation enabled, it should be located at `.minecraft\versions\\config\serveraddressspacefix.json5` -- If you do not have version isolation enabled, it should be at `.minecraft\config\serveraddressspacefix.json5` +- If you have version isolation enabled, it should be located at `.minecraft\versions\\config\ServerAddressSpaceFix.json5` +- If you do not have version isolation enabled, it should be at `.minecraft\config\ServerAddressSpaceFix.json5` This is just a regular JSON text file, except that JSON5 supports extra features such as comments. All properties are annotated, including their purpose, range of values, type, default value, and so on. diff --git a/build.gradle.kts b/build.gradle.kts index 01a26fd..ea7ca18 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import java.nio.file.Paths + plugins { id("net.fabricmc.fabric-loom") `maven-publish` @@ -22,6 +24,27 @@ repositories { name = "Nucleoid" url = uri("https://maven.nucleoid.xyz/") } } +afterEvaluate { + val MixinJarPath = configurations.loaderLibraries.get().resolvedConfiguration + .resolvedArtifacts + .find { it.moduleVersion.id.group == "net.fabricmc" && it.moduleVersion.id.name == "sponge-mixin" }!! + .file + val IsSupportDceVM = Paths.get(System.getProperty("java.home")) + .resolve("bin") + .resolve("java") + .toFile() + .let { + val ReturnCode = ProcessBuilder(it.absolutePath, "-XX:+AllowEnhancedClassRedefinition", "-version") + .start() + .waitFor() + return@let ReturnCode == 0 } + loom.runs.named("client") { + jvmArguments.add("-javaagent:${MixinJarPath.absolutePath}") + if (IsSupportDceVM == true) jvmArguments.add("-XX:+AllowEnhancedClassRedefinition") } + loom.runs.named("server") { + jvmArguments.add("-javaagent:${MixinJarPath.absolutePath}") + if (IsSupportDceVM == true) jvmArguments.add("-XX:+AllowEnhancedClassRedefinition") } } + loom { splitEnvironmentSourceSets() diff --git a/gradle.properties b/gradle.properties index ce0432d..a24de53 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,10 +6,10 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=26.1 loader_version=0.18.4 -loom_version=1.16-SNAPSHOT +loom_version=1.17-SNAPSHOT # Mod Properties -mod_version=0.2.3 +mod_version=0.2.4 maven_group=xyz.thewhitedog9487 archives_base_name=ServerAddressSpaceFix @@ -20,11 +20,8 @@ compatible_with=26.x # https://modrinth.com/mod/modmenu/versions # https://maven.terraformersmc.com/releases/com/terraformersmc/modmenu -modmenu_version=18.0.0-alpha.7 +modmenu_version=18.0.0-beta.1 # https://modrinth.com/mod/yacl/versions # https://maven.isxander.dev/#/releases/dev/isxander/yet-another-config-lib -yacl_version=3.9.0+26.1-fabric - -# https://mvnrepository.com/artifact/org.projectlombok/lombok -lombok_version=1.18.46 \ No newline at end of file +yacl_version=3.9.0+26.1-fabric \ No newline at end of file diff --git a/src/client/java/xyz/thewhitedog9487/Event/ClientLifecycleEventsRegister.java b/src/client/java/xyz/thewhitedog9487/Event/ClientLifecycleEventsRegister.java index 1cec35b..c1faf22 100644 --- a/src/client/java/xyz/thewhitedog9487/Event/ClientLifecycleEventsRegister.java +++ b/src/client/java/xyz/thewhitedog9487/Event/ClientLifecycleEventsRegister.java @@ -4,15 +4,24 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import xyz.thewhitedog9487.Settings; import static xyz.thewhitedog9487.ServerAddressSpaceFixClient.ModLogger; -import static xyz.thewhitedog9487.Settings.SettingsInstance; +import static xyz.thewhitedog9487.Settings.*; public class ClientLifecycleEventsRegister { public static void Register(){ ClientLifecycleEvents.CLIENT_STARTED.register(ClientInstance -> { - ModLogger.info("正在从" + Settings.ConfigFilePath + "加载设置..."); - Settings.SettingsHandler.load(); - SettingsInstance = Settings.SettingsHandler.instance(); - Settings.RegisterConfigFileReloadWatcher(); } ); + if (Settings.SettingsHandler == null){ + ModLogger.warn("当前没有安装YACL,因此无法调整和保持Mod配置"); + SettingsInstance = new Settings(); } + else { + ModLogger.info("正在从" + Settings.ConfigFilePath + "加载设置..."); + Settings.SettingsHandler.load(); + SettingsInstance = Settings.SettingsHandler.instance(); + if (SettingsInstance.ConfigurationVersionCode != CurrentConfigurationVersionCode){ + // 必要时手动处理升降级,现在不必要,就这么办了 + SettingsInstance.ConfigurationVersionCode = CurrentConfigurationVersionCode; + SettingsHandler.save(); } + Settings.RegisterConfigFileReloadWatcher(); } } ); ClientLifecycleEvents.CLIENT_STOPPING.register(ClientInstance -> { + if (Settings.SettingsHandler == null) return; ModLogger.info("正在保存设置到" + Settings.ConfigFilePath + "..."); Settings.SettingsHandler.save(); } ); } } \ No newline at end of file diff --git a/src/client/java/xyz/thewhitedog9487/RemoveInFuture.java b/src/client/java/xyz/thewhitedog9487/RemoveInFuture.java new file mode 100644 index 0000000..d893976 --- /dev/null +++ b/src/client/java/xyz/thewhitedog9487/RemoveInFuture.java @@ -0,0 +1,33 @@ +package xyz.thewhitedog9487; + +import net.fabricmc.loader.api.FabricLoader; + +import java.io.IOException; +import java.nio.file.Files; + +import static xyz.thewhitedog9487.ServerAddressSpaceFixClient.*; + +/** + * 预计27.1正式版发布后删除 + */ +@Deprecated +public class RemoveInFuture { + @Deprecated + public static void MigrateConfiguration() { + var OldPath = FabricLoader.getInstance() + .getConfigDir() + .resolve(ModID + ".json5") + .toAbsolutePath(); + if (OldPath.toFile().exists()){ + try { + ModLogger.info("发现旧的配置文件,正在进行迁移"); + Files.copy(OldPath, Settings.ConfigFilePath); + boolean IsSuccessDeleted = OldPath.toFile().delete(); + if (IsSuccessDeleted) { + ModLogger.info("迁移完成,已删除旧的配置文件"); + } else { + ModLogger.warn("迁移完成,但未能删除旧的配置文件,请手动删除 " + OldPath.toAbsolutePath()); } + } catch (IOException e) { + ModLogger.error("迁移配置文件失败"); + ModLogger.error(e.getLocalizedMessage()); + e.printStackTrace(); } } } } diff --git a/src/client/java/xyz/thewhitedog9487/ServerAddressSpaceFixClient.java b/src/client/java/xyz/thewhitedog9487/ServerAddressSpaceFixClient.java index 70ef8e7..3306e0f 100644 --- a/src/client/java/xyz/thewhitedog9487/ServerAddressSpaceFixClient.java +++ b/src/client/java/xyz/thewhitedog9487/ServerAddressSpaceFixClient.java @@ -7,11 +7,13 @@ import xyz.thewhitedog9487.Event.ClientLifecycleEventsRegister; public class ServerAddressSpaceFixClient implements ClientModInitializer { public static final String ModID = "serveraddressspacefix"; - public static final Logger ModLogger = LoggerFactory.getLogger(ModID); + public static final String FriendlyModID = "ServerAddressSpaceFix"; + public static final Logger ModLogger = LoggerFactory.getLogger(FriendlyModID); @Override public void onInitializeClient() { // This entrypoint is suitable for setting up client-specific logic, such as rendering. + RemoveInFuture.MigrateConfiguration(); ClientLifecycleEventsRegister.Register(); } } \ No newline at end of file diff --git a/src/client/java/xyz/thewhitedog9487/Settings.java b/src/client/java/xyz/thewhitedog9487/Settings.java index d253612..37b8044 100644 --- a/src/client/java/xyz/thewhitedog9487/Settings.java +++ b/src/client/java/xyz/thewhitedog9487/Settings.java @@ -18,22 +18,28 @@ import java.nio.file.WatchService; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; -import static xyz.thewhitedog9487.ServerAddressSpaceFixClient.ModID; -import static xyz.thewhitedog9487.ServerAddressSpaceFixClient.ModLogger; +import static xyz.thewhitedog9487.ServerAddressSpaceFixClient.*; public class Settings { public static Path ConfigFilePath = FabricLoader.getInstance() .getConfigDir() - .resolve(ModID + ".json5") + .resolve(FriendlyModID + ".json5") .toAbsolutePath(); - public static ConfigClassHandler SettingsHandler = ConfigClassHandler.createBuilder(Settings.class) - .id(Identifier.fromNamespaceAndPath(ModID, "settings_confighandler")) - .serializer(SettingsConfigClassHandler -> GsonConfigSerializerBuilder.create(SettingsConfigClassHandler) - .setPath(ConfigFilePath) - .appendGsonBuilder(GsonBuilder::setPrettyPrinting) - .setJson5(true) - .build() ) - .build(); + public static ConfigClassHandler SettingsHandler = null; + public static long CurrentConfigurationVersionCode = 0; + + static { + try { + SettingsHandler = ConfigClassHandler.createBuilder(Settings.class) + .id(Identifier.fromNamespaceAndPath(ModID, "settings_confighandler")) + .serializer(SettingsConfigClassHandler -> GsonConfigSerializerBuilder.create(SettingsConfigClassHandler) + .setPath(ConfigFilePath) + .appendGsonBuilder(GsonBuilder::setPrettyPrinting) + .setJson5(true) + .build() ) + .build(); + } catch (NoClassDefFoundError _) {} } + public static volatile Settings SettingsInstance; // region 配置文件变更监听器 @@ -59,13 +65,24 @@ public class Settings { SettingsInstance = SettingsHandler.instance(); ModLogger.info("检测到配置文件变更,已重新加载设置。");} if (!WatchKey.reset()) { - break;}} + break; } } } catch (InterruptedException InterruptedException) { Thread.currentThread().interrupt(); } catch (IOException e) { throw new RuntimeException(e); } } ) ); } // endregion + @SerialEntry(comment = + """ + 配置文件版本号 + 用于在配置文件结构发生变化且需要手动干预时进行兼容性处理 + 非必要情况下你不应该手动修改这个数据,否则可能导致本Mod的配置文件出现损坏或其他问题 + 类型:整数 + 取值范围:0 ~ Long.MAX_VALUE + 当前值:0 + """) + public long ConfigurationVersionCode = CurrentConfigurationVersionCode; + @SerialEntry(comment = """ 是否启用本模组的功能 diff --git a/更新日志 ChangeLog.md b/更新日志 ChangeLog.md index 4594e99..f29da5e 100644 --- a/更新日志 ChangeLog.md +++ b/更新日志 ChangeLog.md @@ -1,3 +1,10 @@ +# 0.2.4 +时间:2026 06 17 +1. 修复未安装YACL会导致游戏出现`NoClassDefFoundError`崩溃的问题 +2. 将配置文件名从`serveraddressspacefix.json5`改为`ServerAddressSpaceFix.json5` +3. 为配置文件添加版本号 +4. 更改Logger名称 + # 0.2.3 时间:2026 06 04 1. 使用YACL Config API自动将功能开关状态保存到文件内