简单聊天命令
警告
脚本 API 目前正在积极开发中,破坏性更改频繁。此页面假设使用 Minecraft 1.21.30 的格式。
谁不想要酷炫的自定义命令呢?通过脚本 API,你可以创建自己的命令。在本文中,我们将使用脚本 API 创建这些命令。
设置包¶
提示
在创建脚本之前,建议先学习 JavaScript、附加包和脚本 API 的基础知识。要了解脚本 API 的功能,请参见 Microsoft 文档
假设你已经理解了脚本的基础知识,让我们开始创建包。
manifest.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": "1.15.0-beta" // 需要是最新版本,否则会出现问题(截至 1.21.30 的最新版本)
}
]
}
在我们的清单中,我们添加了脚本模块。entry
是我们的脚本文件存储的位置。通常在行为包的 scripts
文件夹中。依赖项允许我们在脚本中使用该脚本模块。
创建自定义命令¶
现在进入有趣的部分 - 创建我们的自定义命令。首先,我们将添加模块。
接下来,我们将添加简单的命令,例如 !gmc
用于将游戏模式更改为创造模式,!gms
用于更改为生存模式。
BP/scripts/main.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
语句遍历可能的选项,如果匹配,则运行代码直到下一个break
语句。eventData.cancel = true
将取消将要发送的聊天消息 - 类似于原版命令的工作方式。const player = eventData.sender
声明变量player
以供后续使用。player.runCommandAsync('gamemode c')
在消息发送者上运行命令。
限制标签的命令使用¶
此功能将始终检查玩家是否输入特殊消息以激活命令,即使玩家不应有访问权限。为防止这种情况,我们可以使用标签将这些命令限制为特定人员。
例如,让我们使我们的命令仅对拥有 Admin
标签的玩家可用。
BP/scripts/main.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
)”
有关脚本 API 的更多信息,你可以参考 wiki 或 Microsoft 文档