mcbbs原帖:https://www.mcbbs.net/thread-851489-1-1.html
一些题外话(点击展开)
此帖的内容来源于命令方块吧里我和Rainbow_的讨论。在他的鼓励下,我决定在这里(注:指mcbbs)发一个帖子,分享一下我们的成果
在技巧版的第一个帖子
在村民身上的测试
目前已经确定与村民睡觉有关的nbt是SleepingX, SleepingY, SleepingZ和Brain.memories里面的"minecraft:home"。控制村民是否睡觉以及睡觉状态的是前三个标签。这三个标签对应一个床的坐标。第四个标签用于保存床的位置。
SleepingX, SleepingY, SleepingZ仅在正在睡觉的村民中发现,没有睡觉的村民中没有发现此nbt。当使用data命令修改这三个nbt时,村民会被传送至修改后的坐标。如果此坐标下有一个床,村民就会在这个床上睡觉,并且朝向会以这个床的朝向为基准。但是村民依然认为他的床是Brain里的坐标指定的床,因此如果把这个坐标调为别的床的坐标,村民会在调整后的床上躺下,但是会躺着移动到原来的床附近。此时查看村民的nbt,仍然会发现SleepingX,SleepingY,SleepingZ这三个nbt,并且指向的是你设定的坐标
结论
目前可以判断直接控制村民是否睡觉以及睡觉时的状态的因素就是SleepingX, SleepingY, SleepingZ这三个标签以及这三个标签对应坐标的床的方向。只要这三个标签存在且对应坐标的床也存在,村民就会呈现睡觉的姿势,并且睡觉时的朝向由这个床的朝向来决定。
修改村民的睡觉状态
如果要通过编辑这些nbt来控制村民睡觉与否以及睡觉姿势,首先要避免村民自身的因素干扰(因为村民有起床的判定),就是说,需要将村民的NoAI设置为1。然后需要编辑村民的SleepingX, SleepingY, SleepingZ标签,使这三个标签指向一个床。编辑好之后,村民就会在这个床上睡觉。然后使用/tp命令,将村民传送至任意地点。这时原本的三个标签的内容并不会改变(只要床不被破坏),因此村民仍然呈睡觉的状态。这样就可以做到让村民睡在任意地点了。
在其他生物上的应用
此标签在其他的生物身上同样适用。不过,不同的是,其他生物没有睡觉与起床的设定,因此,如果不设置为NoAI,生物虽然能够入睡,但是仍然会四处移动,甚至表现出攻击性。比如,你可以将一个爬行者加上SleepingX, SleepingY, SleepingZ以及NoAI,让爬行者入睡。
命令示例
鉴于可能会有一些人对命令不是很懂,或者不想看那么长篇大论的文章,我就在这个部分直接给出一个命令示例,大家在使用时稍作修改即可。
假设一个情况,我们想让一个爬行者睡在坐标(100,75,100)处。
假设在坐标(110,75,100)处有一个床,我们就可以编辑爬行者的SleepingX, SleepingY, SleepingZ以及NoAI标签(假设此时游戏中有一个爬行者)。
/data merge entity @e[type=creeper,limit=1] {SleepingX:110,SleepingY:75,SleepingZ:100,NoAI:1}
此时爬行者就会在移动至坐标为(110,75,100)的床上并进入睡觉状态。然后使用tp命令
/tp @e[type=creeper,nbt={NoAI:1b}] 100 75 100
现在爬行者就乖乖地躺在我们指定的坐标上了。
补充说明
以上测试均在19w11b中进行,但实测在19w08a里就可以使用这些命令来修改生物的睡觉状态了(19w08a和19w09a里没有Brain标签,不过不影响对村民睡觉状态的编辑)。
在生物中的测试里,除了末影龙无法睡觉(当然,也可能是方法不对)以外,其他的所有生物均可使用此方法入眠(只是一些生物的睡姿可能会比较怪)。绝大部分生物在睡觉时都会90°后仰,但是在对鱿鱼的测试中,没有发现明显的后仰。查看其nbt时,能够发现这三个标签的存在,因此对鱿鱼的睡眠的主观判断没有其他生物那么明显。
如果在使用summon命令刷出生物的同时为其加上这些nbt,生物会在在床上生成,过一段时间后就会自动传送至原命令指定的地点,无需额外使用tp命令。