跳到主要内容

变量与占位符

脚本里任何一行都可以放变量,执行到这一行时才代入。有三种:

种类样子例子
本插件变量{…}{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}剩余秒数,没有时间限制时是 0725
{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}npcNPC 的 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 变量。在副本脚本里通常直接用上面的 {…} 变量更方便。