MC命令教程“真”从零开始 (八) 区块与强制加载命令/forceload

您所在的位置:网站首页 怎样屏蔽命令方块所有语言 MC命令教程“真”从零开始 (八) 区块与强制加载命令/forceload

MC命令教程“真”从零开始 (八) 区块与强制加载命令/forceload

2024-07-17 12:01| 来源: 网络整理| 查看: 265

这是原载于MCBBS论坛上的命令教程。随着论坛的消失,这系列教程经修缮(可能需要几天时间)后被迁移至此。

本文某种程度上是一个白话版的Wiki

作者不保证对本教程的维护和更新(全随兴致),请您自行判断内容是否过时。不过,若有更多问题欢迎在评论区提出

教程声明:

系列教程默认读者是按照顺序阅读的

教程默认读者有对Minecraft的基础了解

教程主要注重基础原理,实践内容极少

本篇教程适用于Java 1.20.6,但大部分内容也适用于1.13+

今天,我们先把“教程进度”这种事情放到一边,看向一个很严肃,很重要的东西——区块,与强制加载。好吧,我们已经第8帖了却连NBT都没碰到呢,有点奇怪。但是,有些东西,放在NBT后将会更奇怪(连NBT都讲了居然还回来说如此简单的指令),所以......请等到第11篇再说吧。

前言

当创作者制作地图时,经常喜欢把“指令区”与“游戏区”分得很远。为什么呢?因为很多开阔式地图是没有墙壁遮挡的,(比如起床战争)。如果你直接紧贴着游戏区安放命令方块——那玩家一转头就能看到一堆指令方块,很不美观。

所以,我们习惯于把指令方块们移到很远的位置,可能有上千格远。这导致了一个问题——指令方块无法运行。你可以尝试一下,在离你1000格开外的地方放置一个指令方块,并尝试远程激活它(比如,远程激活红石) 该指令方块不会执行——它失效了。不管如何,你无法激活一个离你很远的命令方块并运行其中的指令。而本帖,就来讨论如何解决这个问题。

1. 区块

在说/forceload指令之前,我们要从游戏机制说起。

Minecraft的地图真的很大很大,而我们的电脑相比这么大的地图......还是太弱了。想要时时刻刻加载整个大地图,对超过2.30399754×1017(或23亿亿)个方块运算,对于现在电脑的能力来说是个不可能完成的任务。

MC用了一个简单的办法来突破这个难关——我不加载整个世界,只加载玩家旁边的东西不就得了?反正玩家也只能影响他周围的东西嘛。

所以,在游戏中,地图被分成了无数个小块,而电脑只加载玩家周围的那几块。离玩家远的区域就不理他,不加载。

而这些被分成的小块,被称为“区块”(Chunks)。现在,各位,在游戏中,按下F3+G(如果有fnLock请按fn+f3+G),即可显示由黄色线条标示的区块边界:

黄色的区块边界

各位看到的就是我目前区块的边界线。

一个区块的大小是16格长*16格宽,高度不限每个区块都是一个竖着的长方体,长宽为16,高度从虚空边界一直到建筑高度上限。所以,如果在显示区块边界的情况下抬头,你将会看到四周的边界向头顶延伸:

区块是没有高度限制的

有一点美感是吧。为了让你更直观地看到一个区块,可以看向下图:

把一个区块拿出来

——本图来自MCWiki

上图展示的就是一个单独被截取的区块。这可以让你瞬间明白一个区块的形状。好。游戏就是将偌大的地图分割为这些一个一个的区块。而每时每刻只加载特定的区块——即玩家周围的那些。那么,玩家周围多少的区块被加载了呢?这取决于你的游戏设置。在游戏的选项→视频设置中,有一项叫“渲染距离”的设置。该设置决定了以玩家为中心的区块加载范围:

渲染距离设置

如图中的示例被调整到了最高,也就是32个区块。这是你向任意方向会被加载的区块个数——上例中为32个。所以区块加载范围的正方形边长就是渲染距离+渲染距离再加上你自己所处的区块,加载的区域边长就是:渲染距离 × 2 + 1

在上例中,加载范围是65格。

而在未被加载的区块,一切都会停止:农作物会停止生长,红石与命令方块不会有反应,射出的箭矢会停在半空,被点燃的TNT不会爆炸——直到有玩家靠近加载区块,它们才会继续动起来。

由于渲染距离选项直接影响了游戏每刻需要处理的地图大小,所以将本选项调小一点会大幅减轻你电脑的负担。

现在,让我们来看向建筑高度限制。这个高度,320格,是你可以放置方块的最高处。为什么要这么限制?弄成和长宽一样的无限不好么?当你理解区块的形状时,就很容易得到答案——因为区块的高度是不限的。所以如果高度弄成无限的,游戏将可能需要加载无限多的方块——正如电脑无法负担加载所有地图一样,它也无法对一个无限高的区域运算。所以那些解决了高度限制的模组(比如Cubic Chunk)的解决办法就是把区块弄成正方体的,而不是目前的一个擎天柱。

1.1 区段

每个区块都被分成了24个小块,每一块是16*16*16,4096格。这些更小的格子叫做“区段”。在上方区块边界的图片中,你可以看到一条条蓝色的线,它们就代表了区段的边界。

这些边界被用在随机刻生成——我们会在第9篇讨论。

作为外加:1. 除了玩家周围的区域会被加载以外,世界出生点的区块也会加载。(有关世界出生点见第7帖)2. 这个区块加载范围是对应当前维度的,所以如果你在进入地狱门之前点燃一颗TNT,它不会在你进入地狱后爆炸,因为你进入地狱后加载的就是地狱的区块,而主世界的TNT就暂停了——直到你返回主世界——前提是在主世界没有其他玩家在你的地狱门附近,因为他们会在你进入地狱后继续加载区块。

3. 以上只是简单讲述了区块。有关更多(比如传播等级)你可以到本页面寻找更多信息。

2. 强制加载/forceload

所以你现在理解了为什么如果指令方块离开游戏区太远就无法运行了吧。如何解决这个问题就是接下来的内容——那么各位,我们终于进入主题了:指令/forceload。从名字就可以看出来。该指令可以强制使一个特定的区块不断加载,即使它周围没有玩家。

                  注意,本指令为Java版独有特性              

      基岩版拥有相同功能的指令为/tickingarea

                   可以前往wiki的这个页面寻找更多信息              

2.1 添加

首先,来看如何将一个区块添加为强制加载区块:格式:

(forceload指令格式/添加/简化版)

好,解析:forceload 指令头 强制加载指令add 子指令  即“添加区块” 位置  你要添加的区块的任意所属方块的xz坐标。

嗯,只需要找到任意一个属于该区块的方块。然后填入它的x与z坐标,就能锁定这个区块。你可以注意到,这里不需求y坐标——原因我们在上面说过了——区块是一个大擎天柱,没有上下之分。

比如:

会把该方块 (140, -30) 所属的那个区块添加为强制加载。

注意在这里世界是接受使用“~”来代表相对坐标的,所以说,一般来讲你只需要找到你要强制加载的区块(比如你的指令室所使用的区块),然后在原地打上/forceload add ~ ~  就好了。

2.2 范围选择

当然,在实际的应用中,你需要的可能不只一个区块,而MC好心地给予了一种可以快速地选择一堆区块的方法:

对角线选择法

格式:

在上面的格式中,我们有两个方块的坐标,而本指令会把两个区块的对角线所形成的长方形内的区块全部选取:

本指令会把六个区块加载,因为两者形成的对角线包含了6个区块这段描述可能有点模糊?没关系,我们上图:

选择的区域

你应该看懂了。但这里有一点需要注意的地方。

注意事项:1. 大量添加强制加载区块会增加电脑的负担。若添加了太多区块,会导致游戏卡顿,崩溃,甚至损坏存档。2. 本指令是区分维度的。在地狱/末地使用此指令会将地狱/末地的区块强制加载,即使无人在地狱/末地它也会加载,像主世界强制加载区块一样。

2.3 删除

当你不想要一个区块成为强制加载区块,想要删除它,怎么办?这是一个相当简单的问题,只要将上方的add替换为remove就好了:格式:

除了“remove”以外其他一模一样。你同样可以选择一大片的区块:例:

移除指令中指明的12个区块当然,如果你要删除的太多,总会有可能有不耐烦的时候,此时可以直接使用以下指令来清除所有强制加载区块:

移除所有强制加载

2.4 查询

强制加载这种东西嘛,如果添加多了,你很可能就忘了哪里有添加那里没有。所以/forceload拥有一个可以查询强制加载区块的子指令是被需要的。如果你有一天突然忘记了哪里是你的强制加载区块,请试一试下面的命令吧:格式:

本指令会给出指定的“x, y”所属的区块是否是一个强制加载区块:

查询该区块是否为强制加载区块

注意“[ ]”是可选元素,所以当你不填写时,游戏会给出当前维度所有被添加的强制加载区块:

显示所有强制加载区块嗯,这看起来是该指令的全部了......但是,指令没了,本教程还没结束。去看一看当你输入指令/forceload query后游戏的提示结果吧......你看到了什么?我呢,在我本人的位置(-180, 184),将我现在处于的区块设为了强制加载区块。现在我输入/forceload query,请问我会看到什么?游戏会如何告诉我“这里有一个区块是强制加载区块?”直接显示”方块(-180, 184)所属的区块是强制加载区块“?逗呐,游戏做会用一个方块的坐标来表示一个区块这种不严谨的事情吗?不会。实际上,游戏显示的是:

[-12,  11]

这是什么鬼?这是区块坐标。

3. 区块坐标

实际上,你不完全需要看下面的内容,也能使用/forceload指令。

区块坐标嗯。好像……这是个新东西?坐标这个东西我们早在第2帖就和/teleport指令一起讲过了——坐标我知道,但是区块坐标是什么?

我们的坐标,是以方格来计算的,从原点(0,0,0)开始,每一个经过一个方块就增加(减少)1。

那么,区块坐标,当然就是把区块当成那个“方格”,自原点(0, 0)开始,每经过一个区块,数值加(减)1。

比如,坐标(100, 34, -125)指的是从原点出发,向正X轴方向100,向正y34,向负z125格的位置。

那么,区块(1, 5)就是从原点——世界中心的区块开始,向x轴移动1个区块,向z轴移动5个区块后到达的——那个区块。注意,区块只有两个坐标,是没有y轴的——因为上面说了,区块是一个顶天立地的大柱子。

因为一个区块的边长是16格,所以区块坐标总是方块坐标除以16后向下取整的数字。比如,一格方块的x与z坐标是120与245,那么:

             

再向下取整:7.5→7,15.3125→15。该方块所属的区块的区块坐标就是(7, 15)。

当然,我们并不需要每次都用这么复杂的运算——只要简单地按f3打开调试屏,就i可以很简单地找到区块坐标:

区块坐标

这是我在上面红线上的内容。看起来比较奇怪是吧,但是很好理解。你可以在上面看到 0 -4 1三个数字(后面中括号内的用不上)i第一个数字0即使区块的x坐标,最后的数字1即是区块的y坐标。而中间的数字是区段的坐标。所以,[0, 1]这就是该区块的坐标



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3