本帖最后由 Dahesor 于 2023-1-1 12:07 编辑

[命令] 命令教程“真”从零开始 (十) 简单,又新手(雾)的方块指令/setblock

声明:
1. 本教程默认所有读者看过本系列之前的内容。作者不对可能冒出来的术语或方言负责。系列教程链接见 索引
2. 本系列教程默认读者拥有关于Minecraft游戏本身的基础了解。
3. 本系列全部教程绝对适用于当前Java最新版(1.19.3)。但本帖的内容适用于自1.13以来的任意版本。
4. 本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。


<<<<<< 返回系列目录 ←←

本系列教程座右铭:
请相信可能性

——DS 祈梦

……这鬼玩意真是越来越像创世神了,(植物)【跸——】的。

——DS 神商



前言

本系列教程到现在已经有10帖了。
看起来好像讲得都是十分简单的内容,但是这已经是全部教程计划内容的4分之1了。

本教程致力于“亲民(罗嗦)”,与“完整”。
对于逻辑头脑较好的的学习者,实际上只要去看Wiki就够了,但本教程不求高效,只求适普性。
作者不想直接讲起较为复杂的内容然后只是在开头淡淡地来一句“本教程要求读者有对命令的一定了解。”所以便半推半就地——开始了本系列教程。

各位,"新手期"已经结束了。相信你在前九帖已经足够了解了指令的简单格式。
从本帖开始,作者会慢慢减少重复性的赘述,读者应该不再需要作者重复常识性的内容。请各位在阅读的时候保持大脑活跃。

诶,但这一帖还是很简单啦。

下一帖我们就要讲NBT了。
所以今天我们要来看的,是一个非常适合当作NBT的铺垫的指令——
更改方块, /setblock


1. 方块修改指令/setblock


我们已经讲述过了一些可以修改玩家的位置,游戏模式,队伍,分数等指令。
而今天,我们的指令用于关于MC的组成部分——方块。

指令/setblock可以更改位于特定坐标的方块,并有多种可以选择的模式。
格式:
  1. /setblock <x> <y> <z> <方块ID>
复制代码
<x> <y> <z> 是要更改的方块的坐标。在这里允许使用相对或局部坐标(详见 系列第2期 )。
<方块ID> 即时该方块的英文ID。

实际上这些ID有一点像是方块的英文名字:
比如你可能知道“stone”是 石头 的意思。
所以:
  1. /setblock 10 45 -6 stone
复制代码
本指令的含义即是“将坐标(10, 45 ,-6)位置的方块替换为 石头 。”

你也可能知道 空气 是“ air ”,
所以:
  1. /setblock 3 14 5 air
复制代码
的含义为将坐标(3, 14, 5)的方块替换为 空气 ——也就是 清空此处的方块

但你说,诶诶诶,我英语不好怎么办?你要说个石头或者泥土我知道英文是什么,但是要是什么“青金石砖”我上哪里知道去。
而且有的时候ID与名字不完全一样呢?

一个很容易想到的方法就是去找Wiki这里: Java版数据值列表#方块
链接内页面记录了MC所有方块的ID

但是——
我们有一种简单的多的方法来确定一个方块的ID。
游戏中按下 F3+H (若键盘有fnLock,则按下fn+F3+H),即可显示高级标签提示。

这时,当你在物品栏中把鼠标移动到一个方块上时,你能看到的将不只是它的名字,更可以看到方块ID!
长这样:



或者这样:



图中红色框里面的,就是他的ID
但是,你可能发现了一个不寻常的东西。
图里写的东西是“ minecraft:diamond_block ”。
其中的“diamond_block”我知道,是“钻石块”的意思嘛
但是那个“ minecraft: ”是什么?

这是 命名空间(Namespace)
前缀“ minecraft: ”代表了这是一个属于我的世界 原版 的东西。
当然,我现在玩的就是原版,也自然不会冒出拥有除了minecraft:以外的命名空间。

但你若安装了模组,就会发现这些模组添加的方块的命名空间并不是“minecraft:”,而是其他的什么,一般来讲,是本mod的ID。 *

当你要放置的是一个 原版 方块时,命名空间可以省略:
或者严谨点说,当不指定命名空间时,会自动默认为“minecraft:”
本指令:
  1. /setblock ~ ~ ~ dirt
复制代码
与:
  1. /setblock ~ ~ ~ minecraft:dirt
复制代码
以上两条指令效果一致。

但如果你要放置的方块来自一个模组,你需要填写命名空间。
这里不作举例。

*当然,模组作者愿意也是可以用minecraft:的,但是除非想要覆盖原有内容一般不这么做

但是,各位。
这条指令不止这些。
它还可以变得长一点

2. 模式

除了简单地选择方块放置的位置与方块的种类外,我们还有三种可以选择的执行模式,或者叫“原方块处理方式”:
替换模式(replace) 摧毁模式(destroy) ,与 保留模式(keep)
格式:
  1. /setblock <x> <y> <z> <方块ID> [replace|destroy|keep]
复制代码

我们可以从上述的三种模式“ [replace|destroy|keep] ”中选取一种使用。选择不同的模式会有不同的效果:

摧毁模式(Destroy)
在本模式下,被替换掉的方块会像是被玩家打掉一样,掉落为物品(如果可能的话),发出其破碎的声音,还会出现粒子效果。
就像下面这样:




替换模式(Replace)
本模式与摧毁模式相反。方块会被无声无息地“替换”而不是暴力摧毁。不会有声音,不会掉落物品。原来的方块就消失了。
像这样:




保留模式(keep)
本模式下只替换空气方块。若选中的位置不是空气,则不会替换。除了这点以外与替换模式相同。
像这样:



因为在图中,位置上已经有一个钻石砖了,所以保留模式无法将其替换为石头。


注意,如果你不选择模式,将会默认为替换模式。
注意,任何模式都会引起方块更新。 接下来,处于replace模式时,你无法替换一个“与原方块相同的方块”。這听起来好像无所谓,如果想要放置的和原来的方块相同好像指令不管成不成功都一样啊。
但其实不然,在这种情况下指令执行失败了,如果你接上一个条件制约的连锁型命令方块时,该命令方块不会执行。
(使用/execute store)时也会有不同输出。

到这里应该都还好吧各位。
那我们就要进入今天真正难的地方了。


3. 方块状态

你有没有想过一个问题?
比如说,你想放置一个活塞。
但你又知道,活塞可以有六个不同的朝向,上下左右前后均可。
那么,如何控制,我要放置的活塞要朝向哪边呢?

这里,我们要用到“ 方块状态(Blockstate) ”。
方块状态。看名字就知道,这玩意决定了一个方块当前的状态。
对于活塞来说方块状态储存了它的朝向,而对于其他方块,可能存储了其他的东西,例如一个拉杆是否拉开,或者半砖是上一半还是下一半。
我想说的是,不同的方块有不同的方块状态。


我们可以在方块ID的后面接上一对 中括号 [] ”来决定一个方块的状态:
像这样:
  1. /setblock ~ ~ ~ piston[] replace
复制代码

英文“ piston ”是活塞的ID。而我们在其后添加了一个“ [] ”。
这条指令是可以运行的,但是毫无意义。因为我们的“[]”里啥也没有,相当于一座空的房子。
想要让它们起作用,我们要在其中添加内容物。
这些被添加在中括号内的东西的格式为:

“[方块状态名=值]”。

让我们来如此解释:
只要你学过一点英语,你就会知道“ facinig ”是“ 朝向 ”的意思,而“ up ”又是“ 向上 ”的意思。
在本例中,“facing”就是“ 方块状态名 ”,而“up”就是
所以:
  1. [fancing=up]
复制代码
的含义就是——
朝向向上。

将上面的东西带入指令:
  1. /setblock ~ ~ ~ piston[facing=up] replace
复制代码
本指令会放置一个向上的活塞。

同理,“ down ”是 向下 ,所以:
  1. /setblock ~ ~ ~ piston[facing=down] replace
复制代码

本指令会放置一个向下的活塞。

当然,你可以将这个值替换为东西南北来得到面向四周的活塞:
  1. /setblock ~ ~ ~ piston[facing=east]
复制代码
放置一个 向东 的活塞。

不是很难吧?


3.2 多个状态


你应该知道活塞除了朝向以外还有另一个种状态,就是该活塞是否伸出。
当然,我们只要把上面的方块状态名换为“ extended ”,即“ 伸展 ”的意思——即可控制该项。
就像上一帖的/gamerule指令一样,该状态中我们使用 “true”代表“真”,“false”代表“假”。

所以,举一反三,很容易就可以得到下面两条指令:
  1. /setblock ~ ~ ~ piston[extended=false]
复制代码
放置一个活塞头没有伸出的活塞。(也就是默认值)

  1. /setblock ~ ~ ~ piston[extended=true]
复制代码
放置一个伸出了活塞头的活塞。然而,如果没有红石信号,这个活塞头会立马缩回去,像下面这样:




好现在我们有了两种方块状态。当你需要在一条指令内确定多种状态时,使用逗号“ , ”来隔开。
比如:
  1. /setblock ~ ~ ~ piston[extended=true,facing=up]
复制代码
放置一个向上且伸开的活塞。

注意,这里的逗号是英文的逗号,不要切错输入法!

各位各位

现在有个问题。
我怎么知道这些“方块状态名”或者“值”改填什么?
你要说朝向我能猜出来是“facing”,但是要是“是否伸缩”,我怎么知道改写“extended”?又怎么知道要用"true"来代表真,而不是“yes”?

方法有二(或者说,两个半)。

第一,看Wiki
不是所有的方块都有方块状态。像是石头这种一成不变的方块就没有。
但是对于任何一个有的方块,在其相对应的Wiki页面中。你可以找到一个叫做“方块状态”的表格。
这里我用门来举例:
下面是从中文MCWiki截取的一张图片:




在这里我们可以清楚地看到所有对于门的,可用的方块状态。
所以看着这个表就很容易得出:
  1. /setblock ~ ~ ~ oak_door[facing=east,half=upper,hinge=left,open=true]
复制代码
放置一个面向东方,门轴在左,打开状态的上半截木门。 呃……大概长这样:



第二,你可以直接打指令,并使用命令补全系统。
当你输入命令时,游戏会提示你有哪些选项。
像这样:



对,只要你知道每项状态都代表了什么意思,那么按一下Tab,游戏就会帮你自动补全。
这样简单多了有没有!

然后,当你在在F3调试屏时,可以看到目前指针指向的方块的所有状态:



需要注意的是,这些方块状态只是状态罢了。
一些方块实体,比如箱子——

像是“箱子内的东西”之类的东西,我们无法使用方块状态确定。
我们要用的是另一种更强大的东西——
NBT
这就是我们下一帖的要讨论的东西。


以上就是本期的全部内容了。
我们,下一期,就说NBT!
目标是“谁问NBT怎么回事,只要把本教程糊 0 他脸上即可解决问题”
咳咳。因为NBT将是本教程到目前为止最复杂的一期,所以请给我两周的时间准备~
对。
顺手求一下收藏,点赞,与人气。
再会,各位。

#更新日志

Java 1.16.5/a  页面发布
Java 1.16.5/b  感谢@chixvv 的提醒,加入了在调试屏中查看方块状态的说明。
Java 1.16.5/c  排版,修改错字
Java 1.16.5/d  补充了关于替换模式无法替换相同方块的说明。
Java 1.17/a 1.17版本升级完成
Java 1.18/a 1.18版本升级完成
Java 1.19.3/a 1.19升级完成

上一帖: [命令] 命令教程“真”从零开始 (九) 十分流水帐地一期教程教会你/gamerule

索引:系列《命令教程“真”从零开始》

下一篇: [命令] 命令教程“真”从零开始 ( X ) 我就不信不能用大白话讲清楚NBT





2021.12 数据,可能有更多内容 [命令] 命令教程“真”从零开始 (十) 简单,又新手(雾)的方块指令/setblock


声明:
1. 本教程默认所有读者看过本系列之前的内容。作者不对可能冒出来的术语或方言负责。系列教程链接在最后。
2. 本系列教程默认读者拥有关于Minecraft游戏本身的基础了解。
3. 本系列全部教程绝对适用于当前Java最新版(1.17)。但本帖的内容适用于自1.13以来的任意版本。
4. 本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。


本系列教程座右铭:
请相信可能性

——前DS 祈
……这鬼玩意真是越来越像创世神了,(植物)【跸——】的。

——前DS 神商






前言


本系列教程到现在已经有10帖了。看起来好像讲得都是十分简单的内容,但是这已经是全部教程计划内容的4分之1了。
本教程致力于“亲民(罗嗦)”,与“完整”。对于逻辑头脑较好的的学习者,实际上只要去看Wiki就够了,但本教程不求高效,只求适普性。作者不想直接讲起较为复杂的内容然后只是在开头淡淡地来一句“本教程要求读者有对命令的一定了解。”所以便半推半就地——开始了本系列教程。
各位,&quot;新手期&quot;已经结束了。相信你在前九帖已经足够了解了指令的简单格式。从本帖开始,作者会慢慢减少重复性的赘述,读者应该不再需要作者重复常识性的内容。请各位在阅读的时候保持大脑活跃。
诶,但这一帖还是很简单啦。
下一帖我们就要讲NBT了。所以今天我们要来看的,是一个非常适合当作NBT的铺垫的指令——更改方块, /setblock


1. 方块修改指令/setblock


我们已经讲述过了一些可以修改玩家的位置,游戏模式,队伍,分数等指令。而今天,我们的指令用于关于MC的组成部分——方块。
指令/setblock可以更改位于特定坐标的方块,并有多种可以选择的模式。格式:

代码:

  1. /setblock <x> <y> <z> <方块ID>
&lt;x&gt; &lt;y&gt; &lt;z&gt; 是要更改的方块的坐标。在这里允许使用相对或局部坐标(详见 系列第2期 )。而 &lt;方块ID&gt; 即时该方块的英文ID。
实际上这些ID有一点像是方块的英文名字:比如你可能知道“stone”是 石头 的意思。所以:

代码:

  1. /setblock 10 45 -6 stone
本指令的含义即是“将坐标(10, 45 ,-6)位置的方块替换为 石头 。”
你也可能知道 空气 是“ air ”,所以:

代码:

  1. /setblock 3 14 5 air
的含义为将坐标(3, 14, 5)的方块替换为 空气 ——也就是 清空此处的方块
但你说,诶诶诶,我英语不好怎么办?你要说个石头或者泥土我知道英文是什么,但是要是什么“青金石砖”我上哪里知道去。而且有的时候ID与名字不完全一样呢?
一个很容易想到的方法就是去找Wiki这里: Java版数据值列表#方块 链接内页面记录了MC所有方块的ID
但是——我们有一种简单的多的方法来确定一个方块的ID。游戏中按下 F3+H (若键盘有fnLock,则按下fn+F3+H),即可显示高级标签提示。
这时,当你在物品栏中把鼠标移动到一个方块上时,你能看到的将不只是它的名字,更可以看到方块ID!长这样:



或者这样:



图中红色框里面的,就是他的ID但是,你可能发现了一个不寻常的东西。图里写的东西是“ minecraft:diamond_block ”。其中的“diamond_block”我知道,是“钻石块”的意思嘛但是那个“ minecraft: ”是什么?
这是 命名空间(Namespace) 。前缀“ minecraft: ”代表了这是一个属于我的世界 原版 的东西。当然,我现在玩的就是原版,也自然不会冒出拥有除了minecraft:以外的命名空间。
但你若安装了模组,就会发现这些模组添加的方块的命名空间并不是“minecraft:”,而是其他的什么,一般来讲,是本mod的ID。 *
当你要放置的是一个 原版 方块时,命名空间可以省略:或者严谨点说,当不指定命名空间时,会自动默认为“minecraft:”
本指令:

代码:

  1. /setblock ~ ~ ~ dirt
与:

代码:

  1. /setblock ~ ~ ~ minecraft:dirt
以上两条指令效果一致。
但如果你要放置的方块来自一个模组,你需要填写命名空间。这里不作举例。
*当然,模组作者愿意也是可以用minecraft:的,但是除非想要覆盖原有内容一般不这么做


但是,各位。
这条指令不止这些。
它还可以变得长一点


2. 模式


除了简单地选择方块放置的位置与方块的种类外,我们还有三种可以选择的执行模式,或者叫“原方块处理方式”:
替换模式(replace) 摧毁模式(destroy) ,与 保留模式(keep)
格式:

代码:

  1. /setblock <x> <y> <z> <方块ID> [replace|destroy|keep]

我们可以从上述的三种模式“ [replace|destroy|keep] ”中选取一种使用。选择不同的模式会有不同的效果:


摧毁模式(Destroy)
在本模式下,被替换掉的方块会像是被玩家打掉一样,掉落为物品(如果可能的话),发出其破碎的声音,还会出现粒子效果。
就像下面这样:





替换模式(Replace)
本模式与摧毁模式相反。方块会被无声无息地“替换”而不是暴力摧毁。不会有声音,不会掉落物品。原来的方块就消失了。
像这样:





保留模式(keep)
本模式下只替换空气方块。若选中的位置不是空气,则不会替换。除了这点以外与替换模式相同。
像这样:





因为在图中,位置上已经有一个钻石砖了,所以保留模式无法将其替换为石头。


注意,如果你不选择模式,将会默认为替换模式。
注意,任何模式都会引起方块更新。 接下来,处于replace模式时,你无法替换一个“与原方块相同的方块”。這听起来好像无所谓,如果想要放置的和原来的方块相同好像指令不管成不成功都一样啊。
但其实不然,在这种情况下指令执行失败了,如果你接上一个条件制约的连锁型命令方块时,该命令方块不会执行。
(使用/execute store)时也会有不同输出。


到这里应该都还好吧各位。
那我们就要进入今天真正难的地方了。


3. 方块状态


你有没有想过一个问题?
比如说,你想放置一个活塞。
但你又知道,活塞可以有六个不同的朝向,上下左右前后均可。
那么,如何控制,我要放置的活塞要朝向哪边呢?


这里,我们要用到“ 方块状态(Blockstate) ”。
方块状态。看名字就知道,这玩意决定了一个方块当前的状态。
对于活塞来说方块状态储存了它的朝向,而对于其他方块,可能存储了其他的东西,例如一个拉杆是否拉开,或者半砖是上一半还是下一半。
我想说的是,不同的方块有不同的方块状态。


我们可以在方块ID的后面接上一对 中括号 [] ”来决定一个方块的状态:
像这样:

代码:

  1. /setblock ~ ~ ~ piston[] replace

英文“ piston ”是活塞的ID。而我们在其后添加了一个“ [] ”。
这条指令是可以运行的,但是毫无意义。因为我们的“[]”里啥也没有,相当于一座空的房子。
想要让它们起作用,我们要在其中添加内容物。
这些被添加在中括号内的东西的格式为:


“[方块状态名=值]”。


让我们来如此解释:
只要你学过一点英语,你就会知道“ facinig ”是“ 朝向 ”的意思,而“ up ”又是“ 向上 ”的意思。
在本例中,“facing”就是“ 方块状态名 ”,而“up”就是
所以:

代码:

  1. [fancing=up]
的含义就是——
朝向向上。


将上面的东西带入指令:

代码:

  1. /setblock ~ ~ ~ piston[facing=up] replace
本指令会放置一个向上的活塞。


同理,“ down ”是 向下 ,所以:

代码:

  1. /setblock ~ ~ ~ piston[facing=down] replace

本指令会放置一个向下的活塞。


当然,你可以将这个值替换为东西南北来得到面向四周的活塞:

代码:

  1. /setblock ~ ~ ~ piston[facing=east]
放置一个 向东 的活塞。


不是很难吧?


3.2 多个状态


你应该知道活塞除了朝向以外还有另一个种状态,就是该活塞是否伸出。
当然,我们只要把上面的方块状态名换为“ extended ”,即“ 伸展 ”的意思——即可控制该项。
就像上一帖的/gamerule指令一样,该状态中我们使用 “true”代表“真”,“false”代表“假”。


所以,举一反三,很容易就可以得到下面两条指令:

代码:

  1. /setblock ~ ~ ~ piston[extended=false]
放置一个活塞头没有伸出的活塞。(也就是默认值)


代码:

  1. /setblock ~ ~ ~ piston[extended=true]
放置一个伸出了活塞头的活塞。然而,如果没有红石信号,这个活塞头会立马缩回去,像下面这样:





好现在我们有了两种方块状态。当你需要在一条指令内确定多种状态时,使用逗号“ , ”来隔开。
比如:

代码:

  1. /setblock ~ ~ ~ piston[extended=true,facing=up]
放置一个向上且伸开的活塞。


注意,这里的逗号是英文的逗号,不要切错输入法!


各位各位


现在有个问题。
我怎么知道这些“方块状态名”或者“值”改填什么?
你要说朝向我能猜出来是“facing”,但是要是“是否伸缩”,我怎么知道改写“extended”?又怎么知道要用&quot;true&quot;来代表真,而不是“yes”?


方法有二。


第一,看Wiki
不是所有的方块都有方块状态。像是石头这种一成不变的方块就没有。
但是对于任何一个有的方块,在其相对应的Wiki页面中。你可以找到一个叫做“方块状态”的表格。
这里我用门来举例:
下面是从中文MCWiki截取的一张图片:





在这里我们可以清楚地看到所有对于门的,可用的方块状态。
所以看着这个表就很容易得出:

代码:

  1. /setblock ~ ~ ~ oak_door[facing=east,half=upper,hinge=left,open=true]
放置一个面向东方,门轴在左,打开状态的上半截木门。 呃……大概长这样:





第二,你可以直接打指令,并使用命令补全系统。
当你输入命令时,游戏会提示你有哪些选项。
像这样:





对,只要你知道每项状态都代表了什么意思,那么按一下Tab,游戏就会帮你自动补全。
这样简单多了有没有!


然后,当你在在F3调试屏时,可以看到目前指针指向的方块的所有状态:





需要注意的是,这些方块状态只是状态罢了。
一些方块实体,比如箱子——


像是“箱子内的东西”之类的东西,我们无法使用方块状态确定。
我们要用的是另一种更强大的东西——
NBT
这就是我们下一帖的要讨论的东西。


以上就是本期的全部内容了。
我们,下一期,就说NBT!
目标是“谁问NBT怎么回事,只要把本教程糊0他脸上即可解决问题”
咳咳。因为NBT将是本教程到目前为止最复杂的一期,所以请给我两周的时间准备~
对。
顺手求一下收藏,点赞,与人气。
再会,各位。


#更新日志


Java 1.16.5/a页面发布
Java 1.16.5/b感谢@chixvv 的提醒,加入了在调试屏中查看方块状态的说明。
Java 1.16.5/c排版,修改错字
Java 1.16.5/d补充了关于替换模式无法替换相同方块的说明。
Java 1.17/a 1.17版本升级完成


上一帖: [命令] 命令教程“真”从零开始 (九) 十分流水帐地一期教程教会你/gamerule


系列《命令教程“真”从零开始》
前往来自 麻瓜草稿簿 系列教程索引
【命令】命令教程“真”从零开始 (一) 指令本身,选择器,与命令方块
【命令】命令教程“真”从零开始 (二) 命令tp与相对,局部坐标与朝向锚
【命令】 命令教程“真”从零开始 (三) 四个新手指令
【命令】 命令教程“真”从零开始 (四) 有关队伍命令/team的……差不多一切
【命令】命令教程“真”从零开始 (五) 记分板与/scoreboard
【命令】 命令教程“真”从零开始 (六) /tag指令,与进阶~选择器参数
【命令】命令教程“真”从零开始 (七) 新手指令杂烩2号
【命令】命令教程“真”从零开始 (八) 区块与强制加载命令/forceload
【命令】命令教程“真”从零开始 (九) 调整苦力怕防爆,防喷/gamerule
【命令】命令教程“真”从零开始 (十) 简单,又新手(雾)的方块指令/setblock
【命令】命令教程“真”从零开始 ( X ) 我就不信不能用大白话讲清楚NBT
【命令】命令教程&quot;真&quot;从零开始(十二)数据运算三方法之一修改NBT/data
【命令】命令教程“真”从零开始(十三)给予与替换物品,命令/replaceitem
【命令】命令教程“真”从零开始(十四 ) 修改属性/attribute【一拳打爆末影龙】 【命令】命令教程“真”从零开始(十五)最接近神的一次:填充命令/fill 【命令】命令教程&quot;真&quot;从零开始(十六)复制一片区域:复制命令/clone


下一篇: [命令] 命令教程“真”从零开始 ( X ) 我就不信不能用大白话讲清楚NBT