data-driven event system
1# 命令
2
3大多情况下,你应该使用 `/` 类型的命令,但有时,我们会需要一些额外的发挥空间。
4
5## 创建命令
6
7创建新的命令很简单,你要做的是:实现 `Command` 接口,通过创建一个[映射编解码器](https://forge.gemwire.uk/wiki/Codecs)来序列化或反序列化命令,然后用 `CommandTypes.register()` 来注册编解码器。
8
9让我们创建一个能够将字符串转化为标准输出的命令。
10
11```java
12public record DummyCommand(String text) implements Command {
13
14 @Override
15 public boolean execute(EventContext context) {
16 System.out.println(text());
17 return true; //执行成功则返回
18 }
19
20 @Override
21 public CommandType type() {
22 return null;
23 }
24}
25```
26
27接下来,我们再为这个命令[编解码器](https://forge.gemwire.uk/wiki/Codecs)创建一个编解码器。
28
29```java
30public static final MapCodec<DummyCommand> CODEC = Codec.STRING.fieldOf("text").xmap(DummyCommand::new, DummyCommand::text);
31```
32
33再然后,我们需要注册这一命令来获取 `CommandType`。
34
35```java
36public static final CommandType DUMMY = CommandType.register(new Identifier("modid", "print"), DummyCommand.CODEC);
37```
38
39最后,在 `type()` 返回这个类型。
40
41```java
42@Override
43public CommandType type() {
44 return MyModInit.DUMMY;
45}
46```
47
48## 事件的上下文
49
50你可以通过事件的上下文,检索与事件类型一起传递的 `LootContext`。
51
52```java
53context.lootContext().getWorld(); //返回服务端世界
54
55context.lootContext().get(LootContextParameters.TOOL); //如果不存在,返回形式参数或空值。
56
57context.lootContext().requireParameter(LootContextParameters.TOOL); //如果不存在,返回形式参数或抛出异常。
58```