变量与占位符
脚本里任何一行都可以放变量,执行到这一行时才代入。有三种:
| 种类 | 样子 | 例子 |
|---|---|---|
| 本插件变量 | {…} | {self}、{v:碎片}、{group:霜烬守卫:state} |
| DungeonPlus 占位符 | <头:参数 *参数2> | <self:player-name>、<data:value *碎片> |
| PlaceholderAPI | %…% | %player_level%、%vault_eco_balance% |
代入顺序是 <…> → {…} → %…%,所以可以互相组合,例如 <if:[{v:碎片} == 3] *&a已集齐 *&7未集齐>。
能用变量的地方:
- 所有动作的文字(消息、标题、指令、全息文字……),也包括数字和位置参数:
delay {v:等待秒数}、money {v:赏金}、teleport {v:下一个房间}。 - 所有条件,例如
{v:钥匙} >= 3,见 条件判断。 - 计分板、全息文字、目标文字:会自动刷新。计分板另外有几个专用变量,见 计分板与王条。
写错或不认得的 {…} 会原样留着,不会变成空白,方便看出哪里写错。
{player} 和 {self} 的差别
这两个最容易搞混:
| 变量 | 是谁 |
|---|---|
{player} | 收到这一行的玩家。消息发给全队时,每个人看到的都是自己的名字 |
{self} | 触发者:引发这串脚本的那位玩家(例如右键祭坛的人、踩进陷阱的人)。每个人看到的都一样 |
例子:小明右键了祭坛,触发组执行
trigger.yml
启动祭坛:
type: interact
point: 祭坛
script:
- "message &b{self} 启动了祭坛!&7({player},准备战斗)"
| 收到的人 | 看到的文字 |
|---|---|
| 小明 | 小明 启动了祭坛!(小明,准备战斗) |
| 小红 | 小明 启动了祭坛!(小红,准备战斗) |
| 小刚 | 小明 启动了祭坛!(小刚,准备战斗) |
细节:
- 没有触发者的地方(
start.yml、怪物组、任务组、end.yml):{self}会变成收到这一行的玩家,和{player}一样。 - 不是发给某位玩家的参数(数字、位置、
console指令、变量的值):{player}和{self}都是触发者;没有触发者时是空的。 command简写对每位对象各执行一次,{player}是那一次的对象:command eco give {player} 100每人各给 100。script 名称 @player执行的脚本组里,{self}是那一份的玩家。{target}是{player}的别名,{actor}是{self}的别名。
副本信息
| 变量 | 内容 | 例子 |
|---|---|---|
{dungeon} | 副本显示名称(含颜色) | &b&l霜烬古殿 |
{dungeon_id} | 副本 ID(文件夹名称) | example |
{instance} | 这一场的编号 | 3 |
{mode} | 难度模式名称 | &c困难 |
{players} | 队伍人数(还在副本里的人,含倒下、掉线等待重连的) | 4 |
{alive} | 活着的人数 | 3 |
{leader} | 队长名字 | 小明 |
{time_left} | 剩余时间 分:秒,没有时间限制时是 ∞ | 12:05 |
{time_left_seconds} | 剩余秒数,没有时间限制时是 0 | 725 |
{elapsed} | 已经过时间 分:秒 | 02:55 |
{elapsed_seconds} | 已经过秒数 | 175 |
{lives} | 剩余生命:全队共用时是共用的数量,每人各自时是收到的那位玩 家的;无限时是 ∞ | 2 |
{deaths} | 全队累计倒下次数 | 5 |
{objective} | 目前的目标文字 | 前往冰之祭坛 |
{rank} | 评价(通关后才有,在 end.yml 的 clear 里用) | S |
{region} | 收到的玩家(或触发者)现在所在的区域名称,不在区域里是空的 | 陷阱区 |
{uuid} | 收到的玩家(或触发者)的 UUID | |
{reason} | 失败原因,只在 end.yml 的 fail 里有 | 时间到了 |
end.yml
clear:
- "title &6&l通关!||&7评价 {rank} ‧ 用时 {elapsed}"
- "broadcast &6[副本] &e{leader} &7的队伍通关了 {dungeon}"
fail:
- "message &c挑战失败:{reason}(撑了 {elapsed})"
副本变量
| 变量 | 内容 |
|---|---|
{v:名称} | 副本变量的值(var 动作改的那些),没设过是 0。也可以写 {var:名称}、{data:名称} |
{list:名称} | 清单变量的全部内容,用 , 接起来;空清单是空的 |
{task:任务名} | 任务组是否正在跑:true / false |
{point:点位} | 点位的坐标文字,例如 20.5,65.0,45.5;区域是 5,64,35 ~ 12,67,42 |
config.yml
scoreboard:
lines:
- "&7寒冰碎片 &b{v:碎片}&7/3"
- "&7已启动 &f{list:已启动祭坛}"
击杀
| 变量 | 内容 |
|---|---|
{kills} | 这一场全队累计击杀数(只算副本生成的怪) |
{kills:怪物} | 某种怪的累计击杀数:怪物 ID 或显示名称(不含颜色),原版怪写 zombie 或 minecraft:zombie |
- "actionbar &7冰霜骷髅 {kills:冰霜骷髅}/20"
怪物组进度
任何地方都能用:
| 变量 | 内容 |
|---|---|
{group:组名} 或 {group:组名:state} | 状态:running 进行中 / done 已打完 / stopped 被停掉 / idle 还没开始 |
{group:组名:name} | 怪物组的显示名称(name 设置) |
{group:组名:wave} | 目前第几波(从 1 开始) |
{group:组名:waves} | 一共几波 |
{group:组名:killed} | 这一波已经打倒几只(这一组自己的怪) |
{group:组名:total} | 这一波一共几只(chance 没中的不算)。还没开始的组是第一波的数量 |
{group:组名:alive} | 这一波还活着(含还没生成出来)的数量 |
只能在怪物组自己的脚本(start、end、timeout、每一波的 start / end)和 objective 里用,指的就是这一组:
| 变量 | 内容 |
|---|---|
{group} | 这个怪物组的 ID(monster.yml 里的组名 ) |
{group_name} | 这个怪物组的显示名称 |
{killed} | 这一波已经打倒几只 |
{total} | 这一波一共几只(chance 没中的不算) |
{alive_mobs} | 这一波还活着几只 |
{wave} / {waves} | 第几波 / 一共几波 |
monster.yml
前厅卫兵:
name: "&c前厅卫兵"
objective: "&f击败前厅卫兵 &e{killed}/{total} &7(第 {wave}/{waves} 波)"
waves:
- mobs:
- "minecraft:zombie 3"
- mobs:
- "minecraft:stray 4"
start:
- "title &c第 {wave} 波||&7{group_name} 的增援到了"
在 怪物组以外的地方写 {killed}、{wave} 会原样留着;请改用 {group:组名:killed}。
随机
| 变量 | 内容 |
|---|---|
{random:1-100} | 1 到 100 的随机整数(含 1 和 100) |
{random:10} | 0 到 10 的随机整数 |
{random:甲,乙,丙} | 从这几个里随机挑一个 |
- "mob minecraft:zombie 王座 {random:2-5}"
- "teleport {random:牢房一,牢房二,牢房三} @random"
- "message &7长老:「{random:小心脚下,别回头,快走}。」"
触发组带进来的变量
在 trigger.yml 的脚本(以及它呼叫的脚本组)里,还可以用这次触发的资料:
| 变量 | 哪些种类有 | 内容 |
|---|---|---|
{trigger} | 全部 | 这个触发组的名称 |
{mob} | kill、mob-death、mob-health | 怪物 ID |
{count} | enter(写了 players 时)、mob-enter | 区域里的人数 / 怪物数 |
{group} | group-start、group-end | 怪物组 ID |
{text} | chat | 玩家说的话 |
{command} | command | 玩家输入的指令 |
{block} | break、place | 方块 ID(小写,例如 stone) |
{npc} | npc | NPC 的 ID |
{hologram} | hologram | 全息文字的名称 |
trigger.yml
暗号:
type: chat
text: 霜烬
script:
- "message &b{self} 说出了暗号「{text}」,石门缓缓打开。"
- "obstacle open 石门"
DungeonPlus 占位符
格式是 <头:参数1 *参数2 *参数3>,参数之间用「空格 + 星号」分开(空格不能省)。从 DungeonPlus 搬过来的写法可以直接用:
| 占位符 | 内容 |
|---|---|
<dungeon:name> | 副本 ID(不是显示名称,显示名称用 {dungeon}) |
<dungeon:world-name> | 副本所在的世界名称 |
<dungeon:params *位置 *默认值> | 启动参数。本插件没有启动参数,一律返回默认值 |
<data:value *名称> | 副本变量的值,同 {v:名称} |
<data:list *名称 *值> | 清单里有没有这个值:true / false |
<mob:kill-amount *怪物> | 某种怪的累计击杀数,同 {kills:怪物} |
<mob:kill-contain *怪物> | 有没有打倒过这种怪:true / false |
<self:player-name> | 触发者名字,同 {self}(没有触发者时是空的) |
<self:area-name> | 触发者所在的区域名称 |
<random:value *最小 *最大> | 两数之间的随机整数,最小、最大也可以写成 [算式] |
<area:player-size *区域> | 区域里活着的玩家数 |
<area:monster-size *区域 *怪物> | 区域里的副本怪物数,怪物不写或写 all = 全部 |
<if:[条件] *成立时 *不成立时> | 条件成立显示前者,否则显示后者 |
<item:物品 *数量 *是否扣除> | 收到的玩家(或触发者)有没有这个物品:true / false;第三个写 true 时有的话顺便拿走 |
script.yml
集齐检查:
- "$message{type=text;text=碎片:<data:value *碎片>/3 <if:[{v:碎片} == 3] *&a已集齐 *&7未集齐>} @dungeon"
- "$command{text=say <self:player-name> 在 <self:area-name>;console=true} @self"
<if:…> 里可以比大小、套占位符<if:[条件] *成立时 *不成立时> 的条件里可以用 >、<、>=、<= 比较,也可以再套 <mob:…>、<data:…> 这类占位符。
DungeonPlus 文档里的写法可以直接用:
- "$message{type=text;text=<if:[<mob:kill-amount *小白>>=10] *&a够了 *&7还差一点>} @dungeon"
- 不认得的
<…>(例如 MiniMessage 的颜色标签)会原样保留,不会被吃掉。 - DungeonPlus 的
<item:…>第 4、5 个参数(过滤颜色、只检查队长)会被忽略:一律不看颜色,对收到的玩家(或触发者)检查。 - DungeonPlus 的
<player.name>在任何文字里都能用(消息、@dungeon的指令……),会换成收到这一行或执行这一次的玩家名字,效果同{player}。
PlaceholderAPI
装了 PlaceholderAPI 时,任何 %…% 都会代入:
- 消息、标题这类发给玩家的文字:对收到的那位玩家代入(每个人看到自己的等级、余额……)。
- 数字、位置、
console指令、变量的值这类参数:对触发者代入;没有触发者时不会代入,%…%原样留着。command简写对每位对象各执行一次,对那一位代入。 - 条件运算式在没有触发者的地方,会对副本里每个人各算一次,见 条件判断。
objective的文字没有「某位玩家」,%…%不会代入({…}可以);bossbar动作的文字完全不代入变量;全息文字对建立它那一行的触发者代入。
trigger.yml
职业提示:
type: enter
region: 职业之门
script:
- "tell &7你的职业是 &e%mmocore_class%&7,等级 &e%mmocore_level%"
本插件也提供自己的 PlaceholderAPI 变量(%clouddungeon_…%),给计分板、TAB、聊天等其他插件用,例如个人击杀数 %clouddungeon_kills%、
个人伤害 %clouddungeon_damage%。完整列表见 PlaceholderAPI 变量。在副本脚本里通常直接用上面的 {…} 变量更方便。