4-1 命令与 UI
到目前为止,我们的玩家还没有什么方法和插件交互,只能被动地接受来自服务器的消息。这一章我们就来让玩家通过各种方式与服务器上的插件交互。通常而言,常用的交互方法有三种:
- 使用命令(例如
/sethome)。 - 使用图形界面(例如全球市场插件会显示一个物品栏,包含上架的物品和价格)
- 使用聊天信息交互组件(例如箱子商店插件仅需在聊天栏点按『修改』按钮即可修改价格)
这次我们先介绍前两种,因为第三种很大程度上也是一种命令,只要掌握了命令,使用聊天信息交互将是非常容易的。
命令
对于下面这样的命令,你一定不陌生:
give @s minecraft:diamond 6400
kill @e[type=item]
tp @a ~ ~ ~
遗憾的是,我们目前使用的语法高亮系统 Shiki 还不支持 Minecraft 命令的高亮,而且事实上也甚少有支持这种语法的系统。
上面这些都是服务器内置的命令,不过你应该也经常用到下面这些命令,它们是插件提供的:
sethome
tpa PlayerName
menu
命令(Command),有时也称指令,是一种非图形化地与服务器交互的方式。本质上,命令只是一组由空格分开的字符串,其中第一个被称为命令名(Command Name),其它的被称为参数(Arguments)。
你或许认为命令应该包含最前面的斜线 / 字符,但实际上不是这样,/ 是用于将命令和正常聊天消息区分开的符号,但它本身不是命令的一部分。
实际上,命令不算是一种友好的交互方式,特别是在战斗、建造或者跑酷的时候,想要输入正确的命令几乎是不可能做到的。但由于甚少有其它的交互方式能够像命令这样灵活而又容易编写,因此命令仍广泛地用于插件管理和部分高级功能中。
UI
用户界面(User Interface) 是用户与程序交互的方式,通常所说的 UI,其实是指带有图形系统的用户界面,即图形用户界面(Graphical User Interface,GUI)。用户只需要通过点击鼠标,偶尔敲击键盘,就可以完成所需的交互。
遗憾的是,插件对于客户端的 GUI 能做的事情非常有限,想要像 JEI 那样显示合成表是一件很困难的事情(尽管仍有办法做到相似的效果),而要像 Iris 或者 OptiFine 那样新建一个光影包界面管理光影设置则根本是不可能的事情。这些都是因为 GUI 是一个相对底层的系统,GUI 的绘制基本都在客户端完成,所以像是直接往游戏界面中增加按钮这样的事情是不可能做到的 —— 还记得我们在本书开头提到的吗?插件只能干预服务器的行为。所以,插件能做的仅仅是通过服务器的一些操作,改变客户端绘制的东西。
这样的操作有哪些呢?主要就是各种物品栏。
客户端在尝试打开某个物品栏的时候,会通过服务器获取物品栏中物品的信息,而服务端是可以完全控制物品信息的(名称、描述、数量、位置等),更妙的是,当玩家点击物品栏中的物品时,服务器也会收到相关的事件!因此,最简单的方法就是用物品当作『按钮』,把物品的名称当作是标签,这样就可以制作出带文本的按钮了:

有了按钮和文本,结合一些代码来实时调整物品状态,就可以组合出交互性很强的界面,诸如多级菜单,单选框等。尽管如此,如果想要做诸如『在断开连接按钮上面加一个重新连接』按钮这样的功能,那还是洗洗睡吧(笑),这部分会在后续介绍与模组的协同开发时简单提及。