“变量是一种魔法,它们让你能够用一个简单的表达式解决复杂的问题。”
—— 约翰·冯·诺伊曼
什么是标签?
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
如果你懂编程的话,那么可以把标签当作一种变量。
(由于官方对于标签的描述对国人来讲较为含糊,因此本部分将插入很多我的个人见解,如有异议欢迎点我反馈!)
实际上在之前我们已经用到过了标签(有吗?我也忘了),
这是一个很简单的例子:
<player.name>
然后我们在以下代码中用到了它:
example_task:
type: task
script:
- narrate "Hi!<player.name>"
假如执行的玩家名称为“CAT”这段脚本运行后将会输出“Hi!CAT”。
也就是说这里<player.name>代表了玩家名,如果想要实现自动识别玩家名并输出,而不是应对每一个玩家来做一个单独的脚本,那么标签的作用就十分明显了。
不过,标签的作用其实远不止于此。
常见的标签
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
最常用的标签是颜色标签(colors),也几乎是Denizen中最简单的标签。您可能熟悉minecraft中的基本颜色代码系统&(或者§,在基岩版中常见),例如“&4喵喵喵”在游戏中将显示为“喵喵喵”。至于为什么在JAVA版中是“&”符号,这里也推荐使用&而不是§,这是因为“§”符号在电脑中很难打出来,而“&”在大多数键盘上都很容易打出来)。
不过在Denizen的脚本中还可以这么写,给颜色代码加上<> 例如:<&4>喵喵喵
假设我想要给Denizen中输出的脚本标为灰色,那么这里就可以写:“<&7>你的文本”
(具体的颜色代码参数请参考这里)
以下的不同写法的效果也是一样的:
§7喵喵喵
&7喵喵喵
<&7>喵喵喵
<gray>喵喵喵
<&color[gray]>喵喵喵
<element[喵喵喵].color[gray]>
标签的实际使用
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
一个简单的标签可能是将玩家传送到某个坐标,或是将某个NPC传送到自己的位置
teleport <npc> <player.location>
所以,标签就这么简单?NONONO,截止目前为止所讲的内容的确非常简单,但标签的实际应用可能会非常复杂,例如这样的:
- teleport <player.location.find_entities[living].within[<[range]>]> <player.cursor_on[<[distance]>].if_null[<player.location.forward[<[distance]>]>]>
不过一般都不会见到这么长的标签,请不要担心!这里只是显得故意冗长而复杂LOL
只是为了让您体验一下 Tag 在有经验的用户手中拥有的强大功能,基本脚本几乎不需要这么长时间的标签。
所以请记住,在Denizen中,唯一的限制只有脚本编写者的想象力!
那么,如何制作标签呢?
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
正如您可能已经猜到的那样,查看上面的较长示例时,标签不仅限于我们提供的预选标签列表。标记由脚本编写者从多个部分构建,以满足其需求。
标签的组成部分
有两种基本的类型标签可用作脚本编写者的构建块。这些类型包括:Base(基本)标签和Sub(子)标签。
Base标签
想象一个树结构,Base就是树的树干部分,任何情况下Base都应该位于标签的最顶端。
Sub标签
Base是树的树干部分,而Sub则是树延伸出的枝叶部分。Sub标签的存在是在Base标签之上建立的,Base标签包含了其下所有的Sub标签。
更长的标签链
该标签返回玩家正在查看的任何实体。如果您在查看其他玩家时使用此选项,则将返回该玩家的名称。
(由于大陆地区访问Denizen手册网站异常,本部分将在日后进行补充)

A PlayerTag Is A Player In A Tag
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
(由于大陆地区访问Denizen手册网站异常,本部分将在日后进行补充)
带有输入值的标签
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
某些标签需要输入值。例如,
<util.random.int[<#>].to[<#>]>
该标签采用两个简单的数字输入值(“from”和“to”),并返回两者之间的随机数。
在最基本的情况下,这些输入可以简单地填充他们期望的任何类型的值。因此,您可以在游戏内命令行中输入,它会按预期从 1 到 10 叙述一个随机数。如果你重复这个命令几次,你每次都会得到一个不同的随机数(除非它重复,因为真正的随机性有时会这样做)。/ex narrate

标签作为标签的输入?!
简单的值输入非常适合测试,但在实际使用中,您通常会找到将动态值放入标签输入中的理由。下面是一个有趣的示例脚本:
slowly_dying:
type: task
script:
- narrate "You think you're so special with <player.health> health left?!"
- hurt <player> <util.random.decimal[0].to[<player.health.div[2]>]>
- narrate "Hah! Take that, <player.name>! Now you only have <player.health> health left!"
每次运行此示例脚本时,玩家将损失随机数量的生命值,最高可达其生命值的一半,通常更少。它还会告诉他们受到伤害之前和之后的健康状况。
(由于大陆地区访问Denizen手册网站异常,本篇目将在日后进行补充)
下一节,我们将继续进行世界脚本的教学!




发表回复