聊天事件和命令(Chat Events and Commands)
预计阅读时间: 5 分钟
响应消息、添加自定义命令
聊天事件(Chat Events)
聊天事件(Chat Event)
当玩家在聊天中发送消息时触发聊天事件。它主要用于取消消息发送。
以下示例在玩家说 "creeper" 时回复 "Aw man"(忽略大小写)。
1.19.2+
PlayerEvents.chat(event => {
// 检查消息是否等于 creeper(忽略大小写)
if (event.message.trim().toLowerCase() == 'creeper') {
// 在1 tick后调度任务,因为如果立即回复,它会在玩家消息之前打印
event.server.scheduleInTicks(1, event.server, ctx => {
// 告诉所有人 "Aw man",绿色显示。回调数据是服务器
ctx.data.tell(Text.green('Aw man'))
})
}
})
1.18.2 及以下版本
onEvent('player.chat', event => {
// 检查消息是否等于 creeper(忽略大小写)
if (event.message.trim().toLowerCase() == 'creeper') {
// 在1 tick后调度任务,因为如果立即回复,它会在玩家消息之前打印
event.server.scheduleInTicks(1, event.server, ctx => {
// 告诉所有人 "Aw man",绿色显示。回调数据是服务器
ctx.data.tell(Text.green('Aw man'))
})
}
})
以下是取消事件的示例:
1.19.2+
PlayerEvents.chat(event => {
// 检查消息是否以 "!some_command" 开头
if (event.message.startsWith('!some_command')) {
// 回复玩家并取消事件
event.player.tell('Hi!')
event.cancel()
}
})
1.18.2 及以下版本
onEvent('player.chat', event => {
// 检查消息是否以 "!some_command" 开头
if (event.message.startsWith('!some_command')) {
// 回复玩家并取消事件
event.player.tell('Hi!')
event.cancel()
}
})
装饰聊天事件(Decorate Chat Event)
装饰聊天事件也会在玩家发送消息时触发,但用于修改消息内容。
此事件不可取消。
此事件仅在 1.19.2 及以上版本存在!如果您使用的是 1.18 及以下版本,请使用普通聊天事件!
以下示例从玩家消息中删除字母 "g":
PlayerEvents.decorateChat(event => {
// 删除字母 "g"
event.setMessage(event.message.replace('g', ''))
})
另一个示例,将 :sword: 替换为剑表情符号:
PlayerEvents.decorateChat(event => {
// 将 `:sword:` 替换为剑表情符号
event.setMessage(event.message.replace(':sword:', '⚔'))
})
命令事件(Command Events)
命令事件(Command Event)
命令事件在命令执行时触发。它是可取消的。
命令注册事件(Command Registry Event)
命令注册事件可用于注册自定义命令。它不可取消。
以下是一个简单的 /fly 命令示例:
1.19.2+
ServerEvents.commandRegistry(event => {
const { commands: Commands, arguments: Arguments } = event
event.register(Commands.literal('fly') // 命令名称
.requires(source => source.hasPermission(2)) // 检查玩家是否有管理员权限
.executes(ctx => fly(ctx.source.player)) // 如果没有包含 `target` 参数,则为执行命令的玩家切换飞行
.then(Commands.argument('target', Arguments.PLAYER.create(event))
.executes(ctx => fly(Arguments.PLAYER.getResult(ctx, 'target'))) // 为 `target` 参数中指定的玩家切换飞行
)
)
// 辅助函数
const fly = (player) => {
if (player.abilities.mayfly) {
player.abilities.mayfly = false
player.abilities.flying = false
player.displayClientMessage(Component.gold('Flying: ').append(Component.red('disabled')), true)
} else {
player.abilities.mayfly = true
player.displayClientMessage(Component.gold('Flying: ').append(Component.green('enabled')), true)
}
player.onUpdateAbilities()
return 1
}
})
1.18.2 及以下版本
onEvent('command.registry', event => {
const { commands: Commands, arguments: Arguments } = event
event.register(Commands.literal('fly') // 命令名称
.requires(source => source.hasPermission(2)) // 检查玩家是否有管理员权限
.executes(ctx => fly(ctx.source.player)) // 如果没有包含 `target` 参数,则为执行命令的玩家切换飞行
.then(Commands.argument('target', Arguments.PLAYER.create(event))
.executes(ctx => fly(Arguments.PLAYER.getResult(ctx, 'target'))) // 为 `target` 参数中指定的玩家切换飞行
)
)
// 辅助函数
const fly = (player) => {
if (player.abilities.mayfly) {
player.abilities.mayfly = false
player.abilities.flying = false
player.displayClientMessage(Component.gold('Flying: ').append(Component.red('disabled')), true)
} else {
player.abilities.mayfly = true
player.displayClientMessage(Component.gold('Flying: ').append(Component.green('enabled')), true)
}
player.onUpdateAbilities()
return 1
}
})
自定义命令事件(Custom Command Event)
当运行 /kubejs custom_command 时触发自定义命令事件。它是可取消的。
此事件可以作为创建自定义命令的更简单方式。
以下示例在玩家运行 /kubejs custom_command diamonds 时给予玩家钻石:
1.19.2+
ServerEvents.customCommand('diamonds', event => {
event.player.give(Item.of('minecraft:diamond', 64))
})
脚本文件夹:server_scripts/