Configly

Configly

集中式、可视化、便捷的模组全局配置

图书馆

Configly

CurseForgeDocsGitHub

面向 Hytale 模组的全局配置。一个给模组开发者的库。

Configly 是您模组的基础设施,而不是用户需要安装的东西。您将它打包进您的 jar,定义配置,然后发布。您的用户永远不会知道 Configly 的存在——他们只是在预期的地方得到一个干净、可编辑的配置文件。


问题所在

如今为模组提供配置文件意味着要自行注册一个 AssetStore。这会带来:

  • 一个包含单个文件的整个资源文件夹,Server/YourMod/Config/YourMod.json
  • 手动编写的资源类、编解码器、键函数和存储注册代码
  • 其他人想要覆盖某个值,只能替换整个文件,没有其他办法

而且每个这样做的模组都会把设置放在不同的位置,所以一个运行 12 个模组的服务器管理员,得在 12 种布局中翻找。

Configly 的做法

一次性注册存储,适用于所有模组。您只需要为您自己的字段编写编解码器,其他什么都不用管。每个模组的配置文件都会放在一个共享的 Server/Configs/ 文件夹中,每个文件对应一个模组。

Server/Configs/
├── Hexcode.json
├── Icarus.json
└── YourMod.json

集成

定义您的配置。扩展 Config,给它一个 BuilderCodec,然后像编写任何其他 Hytale 资源编解码器一样编写它:

public final class HexcodeConfig extends Config {
    public static final BuilderCodec<HexcodeConfig> CODEC = BuilderCodec.builder(HexcodeConfig.class, HexcodeConfig::new)
        .append(new KeyedCodec<>("RespectPvp", Codec.BOOLEAN),
            (config, b) -> config.respectPvp = b,
            config -> config.respectPvp)
        .documentation("Whether Hexcode spells honour the server PVP setting")
        .add()
        .build();
private boolean respectPvp = true;

public boolean respectsPvp() {
    return respectPvp;
}

}

setup() 中注册它:

Configly.register("Hexcode", HexcodeConfig.class, HexcodeConfig.CODEC);

Server/Configs/Hexcode.json 提供默认值:

{
  "Type": "Hexcode",
  "RespectPVP": true
}

在任何地方读取它:

HexcodeConfig.get().respectsPvp();

这就是整个集成过程。


您能得到什么

任何您想要的形态。 您的编解码器、您的字段、您的校验。Configly 从不检查您的配置,所以它可以简单到只有一个开关,也可以复杂到像一张嵌套的平衡表。

免费获得类型化资源编辑器支持。 每个字段都会变成真正的编辑器控件,每个 .documentation(...) 字符串都会成为其描述。您的用户不再需要猜测原始 JSON,您也不再需要处理“这个值是干什么的”这类提问。

热重载。 从磁盘或资源编辑器进行的编辑无需重启即可生效。

可被其他资源包修补。 兼容性资源包可以在不触碰您模组的情况下覆盖您配置的单个值,并且可以限定在安装了您的模组时才生效:

Server/Configs/Hexcode.patch

{
  "$Requires": "Riprod:Hexcode",
  "RespectPVP": false
}

补丁中未提及的所有内容都会保留您的值。这需要 Patchly;没有它 Configly 也能正常工作。

卸载安全。 如果您的模组被移除,其配置文件会原封不动地保留,而不会报错。重新安装后,所有调整过的值和第三方补丁依然存在。


发布

两种方式:您可以将 Configly.jar 放入 lib/ 并在本地打包,或者从 maven 仓库引用 Configly

plugins {
    id 'com.gradleup.shadow' version '9.4.2'
}

configurations { shadowBundle implementation.extendsFrom(shadowBundle) }

dependencies { shadowBundle(files('lib/Configly-X.Y.Z.jar')) // 或者 shadowBundle('curse.maven:configly-1640076:8580658') }

shadowJar { archiveClassifier.set('') mergeServiceFiles() configurations = [project.configurations.shadowBundle] }

tasks.build { dependsOn("shadowJar") }

您的模组独自发布。 没有必需的依赖项,您的用户无需安装任何东西。

打包是安全的。 任意数量的模组都可以各自携带自己的打包副本。启动时,一个注册存储,其余绑定到它,因此副本之间永远不会冲突,也永远不会争抢文件夹。


文档和源码: https://github.com/itsriprod/configly 问题反馈: https://github.com/itsriprod/configly/issues 许可证: GPLv3