# BetterConfig
一个非常强大且易于使用的基于命令的配置库,适用于服务器和客户端。
## 创建一个简单的配置
首先,创建一个新的类。这将是存放所有配置的类。在这个例子中,我们将
将这个类命名为 `Configs`。请确保这个类是 `public`!接下来,为你的配置条目创建一个字段。该
字段不应该是 final。使用 `@Config` 注解标记这个字段。字段的初始值将用作
默认(回退)值。你可以通过设置 `comment` 属性来添加注释。
```java
public class Configs {
@Config(comment = "This is an example!")
public static String exampleString = "default";
}
```
最后,注册你的 `Configs` 类。
- 对于 Fabric 用户,在你的 mod 的 `onInitialize(Client)` 方法中注册 `Configs` 类。将 `` 替换为你的
mod 的 id。有时你可能省略泛型,只用 `<>`。
- 在客户端:
```java
new ModConfigBuilder(, Configs.class).build();
```
- 在服务器:
```java
new ModConfigBuilder(, Configs.class).build();
```
- 对于 Paper 用户,在你的插件的 `onEnable` 方法中注册 `Configs` 类。将 `` 替换为你的
插件的名称。
```java
new ModConfigBuilder<>(, Configs.class).build();
```
就这样!现在你可以通过 `Configs.exampleString` 访问 `exampleString`。你可以使用
config 命令编辑 `exampleString`。
- 在 Fabric 中,客户端和服务器有不同的命令。对于两者,将 `` 替换为你的 mod 的 id。
- 在客户端,执行 `/cconfig exampleString set `。
- 在服务器,执行 `/config exampleString set `。
- 在 Paper 服务器上,执行 `/config exampleString set `。将 `` 替换为你的
插件的名称。
## 这还不是全部!
此 mod 还原生支持使用 `Collection` 和 `Map` 作为变量类型。这些配置将拥有
可用选项 `add`、`put` 和 `remove`。此外,你可以定义你自己的 (de)serialisers 来创建
具有任意类型的配置。要做到这一点,你只需要在构建配置时注册 (de)serialiser。例如,要创建
具有 `Block` 类型的配置,你可以
```java
new ModConfigBuilder<>(, Configs.class)
.registerTypeHierarchy(Block.class, new BlockAdapter(), BlockArgumentType::block)
.build();
```
其中 `BlockAdapter` 扩展了 `TypeAdapter`,并且 `BlockArgumentType` 实现了 `ArgumentType`。参阅
[这些测试](fabric/src/testmod/java/dev/xpple/betterconfig) 以获得完整的了解。一个相同的设置适用于 Paper
可以在 [这里](paper/src/testplugin/java/dev/xpple/betterconfig) 找到。
此外,你可以通过创建你自己的方法来完全改变更新你的配置值行为。只需
将 `setter`、`adder`、`putter` 或 `remover` 作为属性添加到你的 `@Config` 注解中即可。
一个很好的用途是根据单个值将条目键值对添加到 `Map`。考虑以下配置。
```java
@Config(putter = @Config.Putter("none"), adder = @Config.Adder("customMapAdder"))
public static Map exampleMapAdder = new HashMap<>(Map.of("a", "A", "b", "B"));
public static void customMapAdder(String string) {
exampleMapAdder.put(string.toLowerCase(Locale.ROOT), string.toUpperCase(Locale.ROOT));
}
```
对于 `putter` 的 `"none"` 值表示将不会有 putter 可用。这样,你可以像往常一样在你的
代码中使用此 `Map`,并通过 `/(c)config exampleMapAdder add ` 向其中添加值。 更多细节请参阅
[@Config 的 JavaDocs](common/src/main/java/dev/xpple/betterconfig/api/Config.java)。
更新方法的参数也可以进行定制。
```java
@Config(adder = @Config.Adder(value = "customTypeAdder", type = int.class))
public static Collection exampleCustomType = new ArrayList<>(List.of("%", "@"));
public static void customTypeAdder(int codepoint) {
exampleCustomType.add(Character.toString(codepoint));
}
```
对于 putters,有单独的 key 和 value 类型属性。
还有更多东西!为了获得一些说明性示例,请参阅
[Fabric](fabric/src/testmod/java/dev/xpple/betterconfig/Configs.java) 和
[Paper](paper/src/testplugin/java/dev/xpple/betterconfig/Configs.java) 中 `Configs` 类。
## 安装
将 `${betterconfig_version}` 替换为 artifact 版本。
你可以选择我的 maven 仓库和 GitHub 的 package 仓库。
### 我的 maven 仓库
```gradle
repositories {
maven {
url 'https://maven.xpple.dev/maven2'
}
}
```
### GitHub packages
```gradle
repositories {
maven {
url 'https://maven.pkg.github.com/xpple/BetterConfig'
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
```
导入它:
```gradle
dependencies {
// Fabric
include modImplementation('dev.xpple:betterconfig-fabric:${betterconfig_version}')
// Paper (也包含插件文件夹内的 JAR)
compileOnly 'dev.xpple:betterconfig-paper:${betterconfig_version}'
}
```