本帖最后由 PotatoMaster101 于 2016-6-10 20:48 编辑

由于太多新手的问题、本人也没有时间一个一个回复,所以今天发本帖。

大家好。今天来发一个指令方块基础的Q&A(别告诉我你不知Q&A是啥(问题和答案))。

Q1:NBT的集合(MC1.7+)
A:我看很多人都问我,如果我又要有Attributes,又要有Equipment,实现在同一个实体上面怎么做?这个十分简单。多个NBT的格式就是:
  1. {NBT1,NBT2,NBT3}
复制代码
比如:如果我要刷一个自定义带有装备,而且有药水属性的僵尸,那么指令就是:
  1. /summon Zombie ~ ~1 ~
  2. {Equipment:[xxx],ActiveEffects:[xxx]}
复制代码
以上指令中xxx为省略的内容。只是把主要的格式发了出来。大家看见,主要就是每个NBT之间加一个逗号就行了。
这里用的是母标签和子标签。举例子,a:{b,c,d}里面,a就是母标签,内部的b,c和d就是子标签。

警告:我看见很多新手都会这样写:{Equipment:[xxx]},{ActiveEffects:[xxx]},这样是错的。多个NBT不能开多个括号,而是全部集中在一个括号之内。

之后又有人问我,怎么给村名卖的东西附魔?怎么给生物的装备附魔?等等的问题。这个很简单,需要用到的是{tag}。格式是:
  1. {NBT1,tag:{NBT2}}
复制代码
主要就是在NBT里面加上tag,然后再包括进弯曲括号就行了。比如,如果我要给一个僵尸附魔的装备:
  1. /summon Zombie ~ ~1 ~
  2. {Equipment:[{id:"xxx",Count:1b,Damage:0s,
  3. tag:{ench:[xxx]}}]}
复制代码
同样,xxx为省略的部位。大家看见,Equipment是给装备的NBT。里面的id,damage和count都加好了,但是如果我还要附魔,那就是在Equipment里面再加上tag,之后里面再写进ench。加入tag的原因是因为{ench}是指定给僵尸穿的装备的,而并不是给僵尸的。

再比如,村名交易:
  1. /summon Villager ~ ~1 ~
  2. {Offers:{Recipes:[{maxUses:xxx,
  3. buy:{id:"xxx",Count:1b,Damage:0s,tag:{xxx}},
  4. sell:{id:"xxx",Count:1b,Damage:0s,tag:{xxx}}}]}}
复制代码
同上,tag内可以输入ench,AttributeModifiers等等和物品有关的NBT。原因同上,tag内的nbt都是给物品的,而不是给村民的。


Q2:指令方块输出:“Data tag parsing failed: Unbalanced curly brackets .........” (MC1.7+)
A:这是因为输入的NBT的括号没有对称造成的。如果开了一个括号,那就要关闭一个括号。比如,如果:
  1. {xxxxx}}
复制代码
那就是错的,因为开了一个括号,但是却关闭了两个括号。正确的方法是:
  1. {xxxxx}
复制代码
之后方形括号也一样。指令方块如果输出:“Data tag parsing failed: Unbalanced square brackets ........”,那就是方形括号不对称。
总体来说,开几个括号就要关掉几个。比如:
如果开启是:{[[[{{{{,那么关闭就是:}}}}]]]}。
如果开启是:{{{{[[[[{{{{{{{,那么关闭就是:}}}}}}}]]]]}}}}。


Q3:/setblock(或者/fill)显示“Cannot place block outside of the world” (MC1.7+)
A:这是因为setblock和fill指令只可以在已经载入的Chunk内放置方块。如果输入:“/setblock ~10000 ~ ~999999 minecraft:redstone_block”,那么一般就会失败,因为远离玩家x为10000格,z为999999格的地方的Chunk并未加载。最好的解决方法是,首先TP自己到那个setblock或者fill的地方,然后再使用指令方块。这样子每次玩家到了那个地方,Chunk就会被加载,这样子就可以实现指令了。

出生点chunk是一直都会被加载的,所以玩家在出生地做红石,指令方块都会被激活。

值得一提的是,/spreadplayers指令可以把实体随机传送到chunk并未加载的地方,并且可以在短时间内加载那个chunk。所以/spreadplayers可以做一个chunk加载器。


Q4:关于如何改变物品/方块的附加值 (MC1.7+)
A:每个物品都有一个附加值 (Damage),但是大部分的物品附加值都为0。附加值用来分辨同样方块内的种类,比如羊毛的ID都是"minecraft:wool",但是他们却有不同的颜色,这个就是使用附加值做的。一般指令都会给玩家一个输入附加值的选项。

比如,/give指令的格式是:
  1. /give <玩家> <物品> [数量] [附加值] [dataTag]
复制代码
这里的附加值就是来分辨方块的。一般没有附加值的物品,附加值都为0(比如黑曜石,地壳什么)。如果是羊毛,或者染色玻璃的话,那就有附加值了。附加值一般是数字 0 - 15,每种数字代表一种颜色。

在NBT内,附加值是使用Damage标签来控制的。比如:
  1. {Equipment:[{id:"xxx",Count:1b,Damage:0s}]}
复制代码
Damage:0s就是控制附加值。后面的s是单位,一定要加上。


Q5:关于转义的使用(MC1.7+)
A:很多人问本人如何使用转义。在MC中,转义是让电脑知道双引号顺序。请看一下例子:
"abc"def"ghi"
上面这行文字有4个双引号。如果直接读取这行文字,那么可以有不同的概念:
1. abc和ghi在双引号中间,而def没有双引号。
2. abc和ghi在整个双引号之内,而def在整个双引号之内的双引号之内。

这里就要用到转义了。在MC中,转义的用处就是“双引号中的双引号”。转义字符为 “\”。下面来举个例子:"abc\"def\"ghi"
以上就是正确的格式。因为以上这行文字的意思就是,abc和ghi被双引号包括。而def是被双引号之内的双引号所包括。这样子电脑就可以理解其意思。

之后来讲解的是多级转义。计算多级转义字符数量的公式是 2^n-1。一开始本人称为0级转义,就是没有任何转义,因为2^0-1 = 0。所以没有任何转义字符。之后一级就是 \" ,也就是 2^1-1 = 1,带有一个转义字符。二级为 2^2-1 = 3,带有3个转义字符,例子如下:
"a\"b\\\"c\\\"d\"e"
以上例子中,a和e被最外面的0级转义双引号包围。b和d被一级转义包围,最中间的c被二级转义包围。多级转义可理解为双引号之内的双引号之内的双引号之内的双引号之内的双引号... 可以无限的下去。

最后用一些MC内的指令来举例子:
  1. /setblock ~ ~2 ~ minecraft:command_block 0 replace
  2. {Command:"/tellraw @a {"text":"一级转义"}"}
复制代码
由于Command这个NBT是String储存的,所以它的值需要有双引号包围。但是Command内还有/tellraw这条指令,其json也需要有双引号包围,所以在Json内就使用一级转义。请看下一个例子:
  1. /setblock ~ ~2 ~ minecraft:command_block 0 replace
  2. {Command:"/tellraw @a {"text":"请按我","clickEvent":{"action":"run_command","value":"/summon Pig ~ ~ ~ {CustomName:\\"我是一头猪\\"}"}}"}
复制代码
在这条指令中,和前一个例子差不多,但是在Json的clickEvent中又加入了一个带有CustomName的/summon指令。CustomName也是一个String,所以也应该有双引号包围。CustomName要被双引号包围,在Json的clickEvent中。Json也要有双引号包围,在Command中。Command也要被双引号包围,所以这样子就形成了多级转义。转义的最内部的CustomName需要用二级转义才可以,否则会出错。

当然,不光只有用在双引号内,还有一些特殊的转义符可以用在文本处理中。例如最常用的就是“\n”,这个转义符用处是空一行。可以在/tellraw内使用:
  1. /tellraw @a
  2. {"text":"换行\n换行"}
复制代码
这样子tellraw的输出就是“换行(空一行)换行”。这个\n是直接加入进去,不需要用任何空格什么分开。

教程结束。如果有任何综合类的问题请发进回复,会加入本贴。任何关于单独指令的问题将会被无视。


==========END==========

Update log:
V1.0.6: Added more details to Q5. - 10/6/2016
V1.0.5: Added more details to Q1. - 9/6/2016
V1.0.4: Added more examples in Q5 for easier understanding. - 7/6/2016
V1.0.3: Minor changes on version info. Added Q5. - 4/6/2016
V1.0.2: Combined Q1 and Q2, added more detail to Q4 (now Q3). - 19/07/2015
V1.0.1: Added one question (Q5). - 18/04/2015
V1.0.0: Basic layout, added 4 questions (Q1 - Q4). - 12/04/2015

[groupid=546]Command Block Logic[/groupid]