NBT命令和指令方块的入门指南(“我的世界脚本”)

作者:来源:三省网发布时间:2018-02-05 16:40

导读:觉得Minecraft里指令太多,不知道从哪开始上手?这篇博客将带你轻松入门!

大家好!

 

编辑: 

  我想大家都听过Minecraft我的世界,而且都熟悉并喜爱这个块状沙盒游戏(如果不是因为这个沙盒游戏,你们可能都不会看这篇文章)。这些年来,Minecraft已经从一个(并不)“简单”的块状沙盒游戏发展成一个巨型的游戏平台。不要误会我的意思:它仍然是原来那个有趣的沙盒生存游戏,但是如果你深入了解一下指令方块和其功能的概念(如1.12),你将会发现一个全新的世界。 

 

  像所有事情一样,从什么地方开始入手是一个问题。Minecraft太大型了,如果你看一下(https://minecraft.gamepedia.com/Commands)这里面的指令,你会立刻意识到这里面包含太多东西了。如果你觉得这些不足以让你惊奇,那么你可以再去关注以下内容:在你使用自定义的项目时(例如:一个拥有自定义特征的镐,就包含自定义名称和一些特定的附魔),你会发现更多闻所未闻的东西:如称之为NBT结构(https://minecraft.gamepedia.com/Chunk_format#NBT_stru

cture)。它基本上是一个特定的代码,用来指定某些与你想要定制或生成的物品(或玩家,怪物,街道等)直接相关的属性。 

  还是不知道怎么开始吗?不用担心,这篇博客能够教你入门:-)

 

要求: 

  在开始之前,你要确保你有一个Minecraft世界(创造模式)在你的处置范围内(确保你能使用作弊码)。在这里,我建议你使用MCEdit(下载地址 http://www.mcedit.net/)。MCEdit是Minecraft的开放源地图编辑器。你可以在里面下载保存一个世界,并在你的世界里编辑任何内容----从世界里的任何特定方块,到玩家的库存和物品。 

  虽然不是必须的,但它们对你能有很大的帮助,特别是如果你想手动确定某些物品属性时。(后面我会再解释的) 

 

建议:不要依赖指令生成器! 

  你可能会想:“为什么不要这样呢?”毕竟很多所谓的指令生成器,只要你大概指定出你需要的东西,他们就会为你生成你所需要的指令。问题就这样简单地解决了,对吧?

  当然不。使用这些生成器并不能解决你的问题。事实上,你没有解决任何问题,只是将一些不可避免的问题推迟了。如果这些网站的信息是错误的呢?这种情况很常见;如果你要升级更新Minecraft版本?它可能会破坏你现有的指令;又如果你用的某些指令生成器不是最新版本,那么你就倒霉了。 

  但如果你理解了这些基本概念,也就不会有这些麻烦了。

 

步骤1 - 了解指令结构(NBT 命令) 

  “我的世界”中的所有指令都由这些部分组成:指令本身,一个或多个指令的参数(考虑坐标时用/tp,考虑数量时用/give),和一些可选择的NBT标签,其可以在处理项目时用来设置特定的属性。例如指定剑上的附魔。 

  NBT部分对大多数玩家来说很难,但如果你认真琢磨一下原理,其实它是非常简单的。首先:整个定义位于大括号之间:{}。第二:组成NBT数据的几个元素('命令')可以由特定的部分组成: 

· TAG_Compound母标签类的一种:当你拥有不同元素组成的东西时,我们通常把它称为一个复合物,你需要使用大括号包含它:{} 

· TAG_List母命令类的一种:有时是多个项目形成的一种集合,例如物品上的传说(你用不同的字符来定义)或者附魔(由不同的化合物组成)。我们使用方括号包含一个列表:[] 

· TAG_String字符类的一种:基本上是一个字或一段文字。它使用引号组包含在一起:“” 

· TAG_Boolean数值类的一种:它用来表明某事是对的或错的,然后接受或者拒绝,它的作用就像仅使用0和1这样的值时的作用。 

还有很多命令可以使用,但因为这是一篇入门博客,我现在就只说这些基本的,有关NBT命令的完整概述,请参阅此wiki页面。(https://minecraft.gamepedia.com/NBT_format)

 

步骤2 - 了解要使用的数据(命令) 

  MCEdit在这可以起作用了,而minecraft wiki在这也可以起很好的作用。比如,我们想给自己的钻石剑改名为Mobslicer,它具有Unbreaking III(不可摧毁 lv3)的附魔。这时我们可以看一下剑上提到的这个wiki页面(https://minecraft.gamepedia.com/Sword#Data_values)。但是这里面没有关于可使用标签的信息。因为NBT结构是在另一个页面上说明的:player.dat格式页面(https://minecraft.gamepedia.com/Player.dat_format),特定的项目结构部分(https://minecraft.gamepedia.com/Player.dat_format#Item_structure)。 

首先我们要给这个项目起一个特定的名字。将鼠标向下滚动搜索,你最终会找到显示属性部分(https://minecraft.gamepedia.com/Player.dat_format#Disp

lay_Properties),这个才是我们需要的:

  NAME:这个项目在显示器上的名称。 

 

  然后我们该怎么用它呢?还记得上面提到的TAG列表吗?当你再次检索该wiki页面并将鼠标停在Name前面的图标上时,你会注意到它提到了TAG_String。如果你还记得前面我说的,你会注意到处理字符时应该使用引号(“”)。这是第一步。 

  如果我们进一步检索,你会看到名称以树状结构显示。它显示为“属性”。将鼠标停在显示器前(图标),你会看到TAG_Compound。我们需要使用{}包含它。这个时候我们就能知道这才是名字的正确写法:

display:{Name:“你想要的名字”}。 

  下一步:附魔。你应该已经注意到了上面的格式在这同样也适用,但要更复杂一些。在前面的例子中,我直接从头跳到尾了,这次我要按照正常的顺序来操作了。如果想要指定某些附魔,我们需要使用ench的代码。当我们再次把鼠标停在图标处,你会看到TAG_List。很简单,这个时候我们需要[]。综上所述,我们需要这样:ench:[]。 

  接下来,你可以指定一个单一的附魔,它的结构是一个复合物。所以你应该使用{}。于是我们现在需要这样:ench:[{}]。 

  最后一步:单一的附魔由两部分组成:id(TAG_Short)和lvl(TAG_Short)。Short算是一种指定数字的方法。它的类型一定要记住,因为具体的数值可以确定最大值的特定属性。比如,Short能规定一个值的范围为-32678到32767.当你指定的值比它高或者低时,你会得到一个错误的值,或者最大值(最小值)。

  还有最后一个问题:Unbreaking的ID值是多少呢?为了找出这个,你可以直接进这个wiki页面(https://minecraft.gamepedia.com/Enchantment)。而Unbreaking的部分在:https://minecraft.gamepedia.com/Enchanting#Unbr

eaking。通过查找我们可以得知:Unbreaking的ID值为 34,最高级别是III。 

  而我们最终要输入的NBT字符应该是这样:

  ench:[{id:34,lvl:3}]。 

  然后我们可以将这两个命令合并成一个命令,可以得到:{display:{Name:“Mobslicer”},ench:[{id:34,lvl:3}]}。很简单吧?

  还有MCEdit怎么操作呢?很简单的...比方说,当我们不知道指令时,或者我们从wiki里也找不到指令时,我们可以从创造模式里获取指令。我们需要用什么来重命名自己的剑呢?答:剑,铁砧和附魔书: 

  MCEdit有一个很不错的地方就是,任何水平的玩家都能操作它。它可以检索方块,它可以检索箱子的内容...还有它也可以访问玩家库存: 

  你看下上图,就会知道为什么当你决定要建造某物时,MCEdit非常好用。换句话说,就是它的属性和数值一目了然。

 

  首先看我的包裹:你看图标这,我们可以看到它是一个列表,它包含了2个TAG_Compounds。我们好像在哪里见过这个名字,对吧?你可以看到我的diamond_sword在复合命令的上方。这个称为display的项目是另一个包含Name的复合命令标签,它的图标显示:它属于字符类型,并且包含Mobslicer。

也就是:display:{Name:“Mobslicer”}。 

  然后我们会再次看到ench,它包含一个列表(还记得 []?),还有1个复合物命令({})。复合命令由id和level组成,它们有一个S图标(TAG_Short),其中id为34,level为3。所以:ench:[{id:34,lvl:3}]。 

  还没结束呢......仔细看一下,你会发现我的包裹本身就是一个列表。我的物品ID是一个字符,叫做:minecraft:diamond_sword。我们还使用了Count(TAG_Byte)和Slot。 

  {id:““Minecraft”:diamond_sword”,Count:1}

  我想这一串代码肯定可以用在某个地方。

  剧透的人会告诉我们:它当然可以。

  /testfor @p {Inventory:[{id:"minecraft:diamond_sword",Count:1b}]}.

  比如这个命令,就可以查找到拥有钻石剑的玩家的包裹。 

  有人可能会想:“这个“b”哪里来的?”。很简单:还记得我提到过MCEdit中的B图标表示TAG_Byte吗?所以“我的世界”是如何确定1实际上是TAG_Byte,而不是TAG_Short?这就是b起作用的地方。

不用wiki,不用互联网,只要有铁砧,剑,书和MCEdit就可以。而且我们现在已经学习了2种指令。

 

步骤3 - 了解指令方块

  指令方块是““我的世界”脚本”的核心(我喜欢这样称呼它)。指令方块有三种类型以及每种类型有两种状态:

  充能:你的基本指令方块。用红石启动时,可以运行单个命令。

  连锁:绿色的变种。连锁指令方块应放置在其他指令方块之后(充能或重复,注意侧面的箭头),并保证其执行(以及顺序)。 

  重复:神秘的紫色变种。重复指令方块的功能正如它们的名字一样:它们一遍又一遍地重复一个指令。 

  一个指令方块可以有两种状态:无条件(默认,见顶部方块)或有条件(见底部方块)。状态基本上决定了一个指令方块的工作内容。状态的基本作用就是确定一个指令方块是否应该运行或执行它的指令。当指令方块是有条件的状态时,它才会执行它的命令。 

  记得之前我展示库存的那一部分吗?如果把这个/ testfor指令设置在一个指令方块上会怎么样?它能测试出我的库存中是否有钻石剑。还有我会在它后面附加一个有条件的连锁指令方块,其中包含:“你有一把剑!” 这样的结果会很有意思: 

  最后:创造模式库存中是没有指令方块的,你需要将/ give @p command_block。设置在方块上,然后打开界面,并操作你所看到的按钮。 

 

步骤4 - 熟悉识别码 

  现在,我要用一种有趣的方式讲解,这样你可能会更容易记住我说的。我要说的是:识别码也被称为目标选择器。如果你往上翻,你会注意到我在指令中使用了@p好几次。简单说就是“最近的玩家”的意思,还有更多的意思,如下面列出的。

@p:target nearest player。(目标是最近的玩家。)

@r:target random player。(目标是随机玩家。) 

· @a:target all player。(目标是所有玩家。) 

@e:target all entities(=mobs and players alike)。(目标是所有实体)(小怪和玩家)。 

@s:target the executing entity。 (目标是执行中的实体。) 

  比如,想给随机玩家一把钻石剑?很简单:/ give @r “Minecraft”:diamond_sword。 

 

步骤5 - 熟悉计分板 

  最后一点:计分板。它可能是这个游戏中最棘手的功能之一,它让大多数玩家感觉无从下手。我现在不打算在这里详细介绍(因为这只是一篇入门级指南)。但我还是会展示给你们看的,为什么计分板对玩家来说那么重要... 

  正如其名,计分板就是“我的世界”中存储大量有关玩家和怪物(“实体”)的信息的地方。你有看过你的minecraft统计数据吗?你肯定不知道这个,进入暂停菜单(点击逃生),然后点击“统计”按钮。你会看到很多特别厉害的东西:例如,你退出游戏多少次,你走了多远,你爬了多远,你坐矿车,船或马走了多久...... 

  “我的世界”怎么会有这些信息?当然是用计分板! 

  最棒的地方是我们也可以使用这个计分板。它可以让你知道一些有关“我的世界”所有实体的具体信息,或者你也可以自己手动添加特定的信息。 

  再举个例子:记得之前说的附魔剑吗?如果我们把它设置好,这样每个加入游戏的玩家就都可以免费获得一把剑了。可以考虑把它做成给新玩家的福利包。所以现在我们需要能够给所有玩家一把剑的指令,这条指令还需要重复一遍,再执行指令一次。 

  现在设置这样一个重复指令方块: 

  /give @a minecraft diamond_sword 1 0 {display:{Name:"Mobslicer"}, ench:[{id:34, lvl:3}]}. 

  如果你也这样做,玩家们会爱死你的,你猜猜接下来会发生什么?我告诉你吧,这会给所有玩家不断的发钻石剑,无穷无尽的钻石剑。但这并不是我们想要的,我们希望给所有的玩家一把钻石剑,但只给一把,对吧。 

  所以这个时候我们需要以某种方式确定玩家是否已经拿到了一把剑。如果没有,他们会得到一把。我们需要标记已经得到剑的玩家。 

  这是计分板可以发挥作用的地方,尤其是命令功能。输入这个指令: 

  / testfor @a [tag =!gotsword] 

  接下来会发生什么呢?我会添加了一个选择器,测试所有玩家(@a):所有没有标签的玩家都会被称为gotsword。如果带有标签的玩家出现,我就会知道他们应该得到一把剑,并且标记他们收到的那把剑。这些识别器和选择器可以用在很多指令中,包括/ give。

  /give @a[tag=!gotsword] minecraft:diamond_sword 1 0 {display:{Name:"Mobslicer"}, ench:[{id:34, lvl:3}]} 

这是我们要在重复指令方块中使用的指令。我要说下,除非我们标记了已经收到剑的玩家,不然这个指令会重复执行,像之前说的那样:它会给玩家发无穷无尽的剑。因此,从一个重复指令方块开始(或者使用一个正常的指令来测试),不要添加别的指令,而是在它后面添加一个连锁指令方块(看箭头!)。设置连锁指令方块为有条件状态,并添加以下指令: 

/scoreboard players tag @a[tag=!gotsword] add gotsword 

所以第一个指令方块会给所有没有gotsword命令的玩家一把剑。第二个指令方块只会在第一个指令执行之后才会执行,并且会用gotsword标记这些玩家。这样所有玩家只会得到一把剑,不会再发第二把。

  在你的创造模式世界里尝试一下吧,你很快就会明白我说的这些了。 

  想验证它是否有效?输入这个指令: /scoreboard players tag @p list.它会列出所有你当前有的命令,如果上面的指令已经执行了,你会看到之前提到的“gotsword”。如果删除这个命令,你就会立即得到一把新的剑:

/scoreboard players tag @p remove gotsword. 

想要了解更多有关计分板的信息,你可以查看它的wiki页面

(https://minecraft.gamepedia.com/Scoreboard)。我还会在以后的博客文章中更详细地介绍它,今天就说到这了。

  由于这是我发布的第一篇文章,我本人也需要先适应一下。想了解更多关于入门““我的世界”脚本”的一些窍门,我会在以后的博客中再具体介绍的。

 

  感谢你的浏览,希望本篇文章对你有所帮助。

我的世界

网易游戏代理的《我的世界》(Minecraft)手游,你想玩的,这里都有! 全新村庄更新重磅上线,焕然一新的村庄和村民,特色“袭击”玩法开启村庄保卫战。更有第五人格、阴阳师、赛尔号等大波超人气玩法等你来体验! 作为中国顶尖UGC游戏平台,《我的世界》汇聚全球优秀创造者提供海量玩法内容,共同打造更好的游戏大世界! 凭借开放自由的游戏世界、超乎想象的游戏玩法,《我的世界》深受上亿玩家的喜爱。[详情]