简易聊天命令
experimental
WARNING
脚本API目前处于积极开发阶段,频繁出现重大变更。本文内容基于Minecraft 1.21.70版本格式编写。
谁不想要炫酷的自定义命令呢?通过脚本API,你可以创建属于自己的命令。本文将指导你使用脚本API来实现这一功能。
资源包配置
TIP
在创建脚本前,建议先掌握JavaScript基础知识、附加包知识以及脚本API基础。要了解脚本API的功能,请参阅微软官方文档
假设你已经掌握了脚本基础,现在让我们开始创建资源包。
BP/manifest.json
json
{
"format_version": 2,
"header": {
"name": "自定义命令",
"description": "使用脚本API实现的自定义命令",
"uuid": "c8c3239f-027f-4e80-890f-880eba65027d",
"min_engine_version": [1, 19, 40],
"version": [1, 0, 0]
},
"modules": [
{
"description": "行为包模块",
"type": "data",
"uuid": "cd2cd41a-1849-410e-8f0a-5d30fde4bd9a",
"version": [1, 0, 0]
},
{
"description": "游戏测试模块",
"type": "script",
"language": "javascript",
"entry": "scripts/main.js",
"uuid": "f626740d-50a6-49f1-a24a-834983b72134",
"version": [1, 0, 0]
}
],
"dependencies": [
{
"module_name": "@minecraft/server",
"version": "2.0.0-beta" // 必须使用最新版本否则会出错(截至1.21.70的最新版本)
}
]
}在清单文件中,我们添加了脚本模块。其中entry字段指定了脚本文件的存储位置,通常位于行为包的scripts文件夹内。依赖项配置允许我们在脚本中使用该模块。
- 📝manifest.json
- 🖼️pack_icon.png
- 📝main.js
创建自定义命令
现在进入有趣的部分——创建我们的自定义命令。首先导入所需模块。
BP/scripts/main.js
js
import { world } from "@minecraft/server";接下来我们将添加简单命令,例如!gmc用于切换创造模式,!gms用于切换生存模式。
BP/scripts/main.js
js
world.beforeEvents.chatSend.subscribe((eventData) => {
const player = eventData.sender;
switch (eventData.message) {
case "!gmc":
eventData.cancel = true;
player.runCommandAsync("gamemode c");
break;
case "!gms":
eventData.cancel = true;
player.runCommandAsync("gamemode s");
break;
default:
break;
}
});这是执行命令的核心函数。world.beforeEvents.chatSend.subscribe()会在聊天消息发送前触发。
switch语句会遍历所有可能的选项值,匹配时执行对应代码直到遇到breakeventData.cancel = true会取消即将发送的聊天消息——与原版命令的工作方式类似const player = eventData.sender声明了后续使用的玩家变量player.runCommandAsync('gamemode c')对消息发送者执行命令
通过标签限制命令使用权限
当前函数会持续检查玩家是否输入了触发命令的特殊消息,即使该玩家不应拥有使用权限。为防止这种情况,我们可以使用标签来限制特定人员的使用权限。
例如,我们将命令设置为仅限拥有Admin标签的玩家使用。
BP/scripts/main.js
js
import { world } from "@minecraft/server";
world.beforeEvents.chatSend.subscribe((eventData) => {
const player = eventData.sender;
if (!player.hasTag("Admin")) return;
switch (eventData.message) {
case "!gmc":
eventData.cancel = true;
player.runCommandAsync("gamemode c");
break;
case "!gms":
eventData.cancel = true;
player.runCommandAsync("gamemode s");
break;
default:
break;
}
});通俗地说,if (!eventData.sender.hasTag('Admin')) return;表示:"如果玩家没有(!)'Admin'标签,就停止执行后续脚本(return)"














