聊天事件和命令(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/