命令和可交互对象

命令和可交互对象

为服务器管理员添加新命令和可交互对象,让他们能用更少的代码让服务器熠熠生辉。添加执行命令的方块和实用命令以支持服务器管理员。

实用

指令与互动块

为服务器管理员新增指令和互动方块,只需更少代码即可让服务器大放异彩。新增可运行指令的方块(指令方块)及辅助指令,全力支援服务器管理员。

辅助性指令:附带方向的增强粒子指令、实体动画播放指令、可组合的执行指令,以及更多功能。


快速入门

使用此插件的玩家必须拥有 OP 权限或持有 interactables:command-admin 权限。

给自己一个交互方块:/give <你的名字> Interactive_Block。放置后,对着方块使用 /int:ib 打开编辑器。(/ib 作为别名仍然有效。)

功能特性

交互方块

交互方块在触发时运行一条或多条指令。对着方块使用 /int:ib 打开编辑器。编辑器有两个标签页——触发条件(方块如何被激活)和 指令(运行什么内容)。切换标签页时,每个标签页的更改会保留,点击保存时所有更改会一并保存。

指令之间用分号(;)分隔。最后一条指令的输出会被存储并在编辑器中显示,便于调试。

触发类型

  • 玩家交互 (默认) — 当玩家在方块上按下 [F] 键时触发。
  • 重复执行 — 按计时器触发。设置间隔秒数(最小 0.1 秒)。
  • 玩家加入世界 — 当任意玩家完全加载进入世界时触发。使用 $p 来指定该玩家。
  • 玩家死亡 — 当任意玩家死亡时触发。使用 $p 来指定死亡的玩家。
  • 方块破坏 — 当任意方块被破坏时触发。可设置半径,仅在该距离内触发(0 = 任意距离)。使用 $b.x/y/z$b.id 获取被破坏方块的信息。
  • 方块放置 — 当玩家放置方块时触发。半径选项与方块破坏相同。使用 $b.x/y/z$b.id 获取放置方块的信息。
  • 合成 — 当玩家完成一次合成后触发。使用 $recipe.id$recipe.qty 获取合成配方信息。

令牌变量

在指令字符串中使用这些变量来引用触发事件的上下文:

  • $p — 触发玩家的名称
  • $p.x$p.y$p.z — 触发玩家的世界坐标
  • $p.xi$p.yi$p.zi — 触发玩家的整数坐标(向下取整)
  • $self.x$self.y$self.z — 指令方块自身的位置(始终可用)
  • $self.xi$self.yi$self.zi — 指令方块的整数坐标(向下取整)
  • $b.x$b.y$b.z — 事件方块的位置 (on_block_break, on_block_place)
  • $b.xi$b.yi$b.zi — 事件方块的整数坐标 (on_block_break, on_block_place)
  • $b.id — 事件方块或物品的类型 ID,例如 Soil_Dirt (on_block_break, on_block_place)
  • $recipe.id — 合成配方 ID (仅限 on_craft)
  • $recipe.qty — 合成数量 (仅限 on_craft)

xi/yi/zi 这些变体对于需要方块坐标的指令非常有用,例如 /setblock $p.xi $p.yi $p.zi

on_player_join 示例: /give $p Rock_Gem_Voidstone --quantity=1; say Welcome, $p!

on_block_break 示例: say $p broke $b.id at $b.x $b.y $b.z

on_craft 示例: int:exec check @s(flag=quest_active); say $p crafted $recipe.qty x $recipe.id

指令

  • /int:ib — 打开交互方块编辑器(需先看向一个方块)
  • /int:exec — 执行指令,支持实体选择器展开或 foreach 循环
  • /int:check — 如果选择器匹配(或不匹配)实体,则中止指令链
  • /int:flag [add, remove, list] — 在实体上添加、移除或列出字符串标记,用于过滤
  • /int:tp — 将实体传送至坐标或另一实体处
  • /int:entityanim — 在实体上播放或停止动画
  • /int:particle — 在指定位置或实体处生成粒子效果,可附带偏移和方向

所有指令都保留了旧名称作为别名(/ib/exec/check/flag/entityanim/xparticle),因此已有的指令方块可以继续工作。


/int:exec

展开实体选择器并执行任意指令。对于让原版指令配合 @e@a 等使用,以及使用 foreach 遍历实体非常有用。

/int:exec say @a
> 展开 @a 为所有玩家名称,并全部说出

/int:exec give @p Rock_Gem_Voidstone --quantity=1
> 给予最近的玩家一个物品

/int:exec foreach @e(radius=200,type=NPC) say hi @s
> 对每个匹配的 NPC 执行一次 "say hi <uuid>"

/int:exec foreach @s int:entityanim @s Walk
> 对自身播放 Walk 动画

/int:exec int:flag list @l
> 列出你正在看的实体上的标记

/int:exec int:flag add hostile @l(radius=20)
> 将你视线中的目标(最远 20 格)标记为 hostile

Foreach 语法: /int:exec foreach <选择器> <指令> 对每个匹配的实体执行一次该指令。在指令内部,@s 指代循环中的当前实体。

注意:可选参数(例如 --quantity=1)在使用 exec 时必须用引号括起来:"--quantity=1"


/int:check

检查选择器是否匹配实体。如果条件不满足,则中止指令链的其余部分。非常适合根据条件来限制指令的执行。

默认情况下,如果选择器匹配到 0 个实体则中止。在选择器前加上 ! 可反转逻辑——如果匹配到 任意 实体则中止。

注意:要使用实体选择器(@s@p@a 等),请通过 exec 运行 check:/int:exec check @s(flag=hasKey)。如果直接使用,/int:check 不会展开选择器。

/int:exec check @s(flag=hasKey)
> 如果触发玩家没有 "hasKey" 标记则中止

/int:exec check @e(radius=10,type=NPC,limit=1)
> 如果 10 格内没有 NPC 则中止

/int:exec check !@s(flag=cooldown)
> 如果玩家已有 "cooldown" 标记则中止

指令链示例: int:exec check @s(flag=hasKey); give @s Reward_Item 1; int:flag remove hasKey @s 只有在玩家拥有 "hasKey" 时,才给予奖励并移除标记。

冷却示例: int:exec check !@s(flag=cooldown); doSomething; int:flag add cooldown @s 只有在玩家没有冷却标记时才执行,然后添加该标记。


/int:flag

为实体附加简单的字符串标记。标记会持久存在于实体上,并可用于过滤实体查询。

  • /int:flag add <名称> <目标...> — 为一个或多个实体添加标记
  • /int:flag remove <名称> <目标...> — 从一个或多个实体移除标记
  • /int:flag list <目标...> — 列出一个或多个实体上的标记

目标是实体标识符:PlayerNameEntity#123 或 UUID。先使用 /int:exec foreach 展开选择器。

/int:exec foreach @e(radius=20,type=NPC) int:flag add hostile @s 将所有附近的 NPC 标记为 "hostile"

int:check @s(flag=hasKey); say This runs only if the player has the "hasKey" flag


/int:entityanim

在目标实体上播放或停止动画。

语法: /int:entityanim <目标> <动画> [槽位]

目标: PlayerNameEntity#123 或 UUID 字符串。在指令方块中,使用 $p 来指定触发玩家。从命令行中,使用 /int:exec foreach @s int:entityanim @s <动画> 来指定自己。

动画:

  • 任意动画名称(例如 WalkHurtSleep
  • random* — 从实体的模型中选择一个随机动画
  • stopcancel — 停止指定槽位中的动画

槽位 (可选,默认为 actionmovementstatusactionfaceemote

/int:entityanim Steve Walk /int:exec foreach @s int:entityanim @s random emote /int:entityanim Steve stop action

动画示例


/int:particle

在指定位置或实体上生成粒子效果。支持偏移和方向旋转。

语法: /int:particle <粒子类型> [--target=?] [--x=?] [--y=?] [--z=?] [--dx=?] [--dy=?] [--dz=?] [--duration=?] [--direction=?]

位置:

  • --targetPlayerNameEntity#123 或 UUID。基础位置是该实体的位置。在指令方块中,使用 --target=$p 在触发玩家处生成。
  • --x/y/z — 绝对世界坐标。如果同时设置了 --target,这些值会覆盖对应的坐标轴。
  • 不带位置参数 — 默认为世界原点(0, 0, 0)。

偏移量 (可选)

  • --dx--dy--dz — 在基础位置上应用的偏移量。

其他:

  • --duration — 生成器运行的时间,单位为秒 (默认值:1.0)
  • --direction — 旋转生成器方向:updownnorthsoutheastwest

/int:particle IceBall_Explosion "--target=$p" 在触发玩家处生成(指令方块上下文)

/int:particle IceBall_Explosion "--target=$p" --dy=1.5 在玩家上方 1.5 格处生成

/int:particle IceBall_Explosion --x=10 --y=64 --z=20 --duration=3 绝对位置,持续 3 秒

/int:particle IceBall_Explosion "--target=$p" --direction=up 方向朝上(适用于定向效果)


/int:tp

将单个实体传送至世界坐标或另一个实体处。与 /int:exec foreach 配合使用可实现多实体传送。

语法:

  • /int:tp <目标> <x> <y> <z> [--yaw=?] [--pitch=?] — 传送至坐标(~ 用于相对坐标)
  • /int:tp <目标> <目标位置> — 传送至另一实体的位置

目标: PlayerNameEntity#123 或 UUID。

/int:tp Steve 100 64 200 将 Steve 传送到绝对坐标

/int:tp Steve ~ ~10 ~ 将 Steve 垂直向上传送 10 格

/int:tp Steve Alex 将 Steve 传送到 Alex 的位置

/int:exec foreach @a int:tp @s 0 100 0 将所有玩家传送至 0,100,0


实体查询

你可能已经熟悉其他游戏中的类似系统,但它提供了一种基于条件来指定玩家和 NPC 的方法,而不是直接指定它们。支持 /int:exec/int:check/int:flag 以及在交互方块指令内部使用。

/int:exec say @p
> 说出最近玩家的名字

/int:exec say @a
> 说出所有玩家的名字

/int:exec say @e(radius=5)
> 说出 5 格内所有实体的名字/UUID

/int:exec foreach @e(radius=200,type=NPC) say hi @s
> 对每个匹配的 NPC 执行一次 "say hi <uuid>"

选择器

  • @s — 自身(执行指令的实体)
  • @p — 最近玩家
  • @a — 所有玩家
  • @r — 随机玩家
  • @e — 所有实体(需要半径过滤器,否则默认为 0 格)
  • @l — 你正在看的实体;@l(radius=N) 延长作用范围 (默认 8 格)

选择器过滤器

  • radius — 仅限 X 格内的实体。如果包含其他过滤器则必须启用;默认为 0 格。
  • limit — 将结果限制为 X 个实体
  • sortnearestrandomid
  • type — 按实体类型过滤:playernpc
  • model — 按模型 ID 过滤
  • memory — 按记忆组过滤(例如 kweebectrork
  • tag — 仅包含具有特定标记的实体(参见 /int:flag
  • shape — 查询形状:spheretubebox (默认值:tube)
  • height — 圆柱体/长方体查询的高度 (默认值:与半径相同)

下一阶段计划功能

  • 更多触发类型
  • exec 指令的更新,支持在特定位置、方向或实体处执行
  • 其他改进指令