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```