我的世界自定义世界结构详解 一个原版MOD

时间:2018-02-12 来源:88130安卓下载 作者:佚名

  我的世界自定义世界结构详解 一个原版MOD。那今天给大家介绍我的世界原版MOD中的一个大家都不怎么在意的MOD:自定义世界结构,那感兴趣的玩家不妨进来看看下面有关自定义世界结构的介绍哦!希望对大家有所帮助。

  游戏园我的世界官方群: 325049520 欢迎各路喜爱我的世界的小伙伴们加入讨论!

  今天呢,来给大家说说原版mod的一个很少有人涉及的重要分区,就是自定义世界结构。那么,世界结构是什么呢?世界结构啊,就是地图里面自动生成的结构,往大了说,有下界要塞,人工矿道,往小了说,泥土房间或者丛林神庙,包括新版本里面的雪屋也是的。那么现在怎么说呢,就是通过命令方块,来在世界里生成一些类似的这种结构。或许听上去很不可思议,毕竟我们知道,这并不像最普遍的那种原版mod可以通过execute指令(下文简称exe)很方便的对相应实体进行操作。世界结构主要还是要处理方块。那么我们并没有什么直接的方法去扫描整个世界的方块,这难道就难倒我们了吗?话不尽然。我们可以间接的去扫描世界的地形,依旧是通过exe来操作实体,以实体为指针扫描整个世界。

  以实体做指针的话,必然要面对一个问题:我们应该怎样去做。那么我们已经知道,exe可以探测方块,那么我们可以探测一整块区域。但是世界是庞大的,我们就算是使用复数的指针也必须面对这个问题,我们不可能每个方块都进行读取,我们需要一片一片的读取。那么以怎样的方式读取呢,我们有没有什么方式可以套用呢?自然面前是有的,mc对世界的度量有个单位叫做区块,那么我们可以在读取范围内引入区块概念,将原本1*1的读取方式变成16*16的方式。这样的话自然就会大大减少所需处理的信息量。然而就算是这么处理,所需要的处理量依旧是庞大的。这就需要我们对整个的电路优化处理。但这是后话,我们应该先付诸实践,来看看我们目前的思路有哪些的问题。

  这个电路是我在1.8时代时对这个项目进行测试的电路,我给其起一个诨名叫做:“Boomer”。因为这个电路总会悄无声息的占用满你的内存,然后等你发现的时候,你的mc就卡轰了。当然,需要一个红石脉冲进行启动。

  那么来简诉一下,制作这个电路时的目的:为了建立一个区块的坐标系。

  首先我们要设定一个基础区块。由于这电路实用性不高我就只讲计算的部分了。

  这是一个周期的电路。每周期有四组及其相似的命令。

  execute

  @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ ~ ~-16

  minecraft:bedrock 0 summon ArmorStand ~ 0 ~-16

  {CustomName:HeyIKnowYouAreWatching,CustomNameVisible:1b,NoGravity:1b,Marker:1b}

  execute

  @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ ~ ~

  minecraft:bedrock 0 setblock ~ ~ ~ barrier 0

  恩,中间有些东西就不要吐槽啦。

  首先第一条命令的作用是对所有的指针探测其z轴负方向的下一个区块有没有被探测。如果未被探测,则在该区块放置一个指针。

  第二条指令的话,每个指针将自己所在的区块标记为已探测。

  同理会对四个方向进行读取。

  然后细心的读者会发现图中的循环是有9个命令方块的,那么剩下来的那个方块代表着什么呢,自然是清理无用的指针。

  execute

  @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ 0 ~-16

  minecraft:barrier 0 execute @e[c=1] ~ ~ ~ detect ~ 0 ~16 minecraft:barrier 0

  execute @e[c=1] ~ ~ ~ detect ~-16 0 ~ minecraft:barrier 0 execute @e[c=1] ~ ~ ~

  detect ~16 0 ~ minecraft:barrier 0 kill @e[c=1]

  无用的指针是指不需要再次探测周围四处是否已经读取。那么自然,四个方向都被标记为已探测的指针就会被删除。

  整体的总结:优点是初步实现了设想,确实能够建立一个区块模式,然而缺点是对传送毫无办法。一旦玩家传送到未加载被处理的区域的时候,这个机器将不会工作。

  思考一下,首先是卡的问题,我们可以考虑降低指针的密度来解决这个问题。

  那么我们是否要做一个让玩家不断对所在区块建立区块原点的装置呢?答案是必然的,但是随之而来的问题就是我们要怎样进行建立呢?如果直接以脚下作为基准的话,我们自然要面对两片已经被读取的区域的对齐问题。那么这个问题其实超级麻烦。所以我们要想一个其他办法。比如对齐坐标。

  说到坐标,大家认识我的或多或少应该记得我前段时间发了一个GPS的原型机,非常的简陋。那么之后cbl的syl也是和我提过,这个的话其实是有实现单刻输出的方法的,至于具体的实现办法我会单独开贴进行详细的说明。这里就知道我们能够直接获取玩家所在坐标的x和z的取整值(四舍五入)。

  我们一旦能够获取坐标的话,事情就简单很多了。

  以下是对x进行处理的样例命令。

  /scoreboard

  players operation x x = @a x

  对玩家的x值进行备份

  /scoreboard

  players operation x x %= c32 c

  将x值对32取余

  /scoreboard

  players operation x x += c32 c

  X+32

  /scoreboard

  players operation x x %= c32 c

  再次取余

  这样的话我们就可以获取玩家对西南方下一个指针基准点的△x和△z。

  这里计算的步骤为什么要多两步呢?答案很简单。举个例子吧,比如玩家的x为-731,

  那么我们进行完前两步所得到的结果必然是一个负数。一旦加入负数的话我们要处理的工作就得*2,两个坐标就得*4,这是非常不合算的。

  我的世界自定义世界结构详解 一个原版MOD。那今天给大家介绍我的世界原版MOD中的一个大家都不怎么在意的MOD:自定义世界结构,那感兴趣的玩家不妨进来看看下面有关自定义世界结构的介绍哦!希望对大家有所帮助。

  游戏园我的世界官方群: 325049520 欢迎各路喜爱我的世界的小伙伴们加入讨论!

  今天呢,来给大家说说原版mod的一个很少有人涉及的重要分区,就是自定义世界结构。那么,世界结构是什么呢?世界结构啊,就是地图里面自动生成的结构,往大了说,有下界要塞,人工矿道,往小了说,泥土房间或者丛林神庙,包括新版本里面的雪屋也是的。那么现在怎么说呢,就是通过命令方块,来在世界里生成一些类似的这种结构。或许听上去很不可思议,毕竟我们知道,这并不像最普遍的那种原版mod可以通过execute指令(下文简称exe)很方便的对相应实体进行操作。世界结构主要还是要处理方块。那么我们并没有什么直接的方法去扫描整个世界的方块,这难道就难倒我们了吗?话不尽然。我们可以间接的去扫描世界的地形,依旧是通过exe来操作实体,以实体为指针扫描整个世界。

  以实体做指针的话,必然要面对一个问题:我们应该怎样去做。那么我们已经知道,exe可以探测方块,那么我们可以探测一整块区域。但是世界是庞大的,我们就算是使用复数的指针也必须面对这个问题,我们不可能每个方块都进行读取,我们需要一片一片的读取。那么以怎样的方式读取呢,我们有没有什么方式可以套用呢?自然面前是有的,mc对世界的度量有个单位叫做区块,那么我们可以在读取范围内引入区块概念,将原本1*1的读取方式变成16*16的方式。这样的话自然就会大大减少所需处理的信息量。然而就算是这么处理,所需要的处理量依旧是庞大的。这就需要我们对整个的电路优化处理。但这是后话,我们应该先付诸实践,来看看我们目前的思路有哪些的问题。

  这个电路是我在1.8时代时对这个项目进行测试的电路,我给其起一个诨名叫做:“Boomer”。因为这个电路总会悄无声息的占用满你的内存,然后等你发现的时候,你的mc就卡轰了。当然,需要一个红石脉冲进行启动。

  那么来简诉一下,制作这个电路时的目的:为了建立一个区块的坐标系。

  首先我们要设定一个基础区块。由于这电路实用性不高我就只讲计算的部分了。

  这是一个周期的电路。每周期有四组及其相似的命令。

  execute

  @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ ~ ~-16

  minecraft:bedrock 0 summon ArmorStand ~ 0 ~-16

  {CustomName:HeyIKnowYouAreWatching,CustomNameVisible:1b,NoGravity:1b,Marker:1b}

  execute

  @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ ~ ~

  minecraft:bedrock 0 setblock ~ ~ ~ barrier 0

  恩,中间有些东西就不要吐槽啦。

  首先第一条命令的作用是对所有的指针探测其z轴负方向的下一个区块有没有被探测。如果未被探测,则在该区块放置一个指针。

  第二条指令的话,每个指针将自己所在的区块标记为已探测。

  同理会对四个方向进行读取。

  然后细心的读者会发现图中的循环是有9个命令方块的,那么剩下来的那个方块代表着什么呢,自然是清理无用的指针。

  execute

  @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ 0 ~-16

  minecraft:barrier 0 execute @e[c=1] ~ ~ ~ detect ~ 0 ~16 minecraft:barrier 0

  execute @e[c=1] ~ ~ ~ detect ~-16 0 ~ minecraft:barrier 0 execute @e[c=1] ~ ~ ~

  detect ~16 0 ~ minecraft:barrier 0 kill @e[c=1]

  无用的指针是指不需要再次探测周围四处是否已经读取。那么自然,四个方向都被标记为已探测的指针就会被删除。

  整体的总结:优点是初步实现了设想,确实能够建立一个区块模式,然而缺点是对传送毫无办法。一旦玩家传送到未加载被处理的区域的时候,这个机器将不会工作。

  思考一下,首先是卡的问题,我们可以考虑降低指针的密度来解决这个问题。

  那么我们是否要做一个让玩家不断对所在区块建立区块原点的装置呢?答案是必然的,但是随之而来的问题就是我们要怎样进行建立呢?如果直接以脚下作为基准的话,我们自然要面对两片已经被读取的区域的对齐问题。那么这个问题其实超级麻烦。所以我们要想一个其他办法。比如对齐坐标。

  说到坐标,大家认识我的或多或少应该记得我前段时间发了一个GPS的原型机,非常的简陋。那么之后cbl的syl也是和我提过,这个的话其实是有实现单刻输出的方法的,至于具体的实现办法我会单独开贴进行详细的说明。这里就知道我们能够直接获取玩家所在坐标的x和z的取整值(四舍五入)。

  我们一旦能够获取坐标的话,事情就简单很多了。

  以下是对x进行处理的样例命令。

  /scoreboard

  players operation x x = @a x

  对玩家的x值进行备份

  /scoreboard

  players operation x x %= c32 c

  将x值对32取余

  /scoreboard

  players operation x x += c32 c

  X+32

  /scoreboard

  players operation x x %= c32 c

  再次取余

  这样的话我们就可以获取玩家对西南方下一个指针基准点的△x和△z。

  这里计算的步骤为什么要多两步呢?答案很简单。举个例子吧,比如玩家的x为-731,

  那么我们进行完前两步所得到的结果必然是一个负数。一旦加入负数的话我们要处理的工作就得*2,两个坐标就得*4,这是非常不合算的。

  这里的话所取得的负数必然是大于-32的,因为是对32进行的取余,所以我们加上32,再次取余,这样的话相当于强行选择西南方的基准点。处理也方便许多。

  那么这里我们就可以在玩家正下方召唤一个指针,并通过△x和△z将其引导至该去工作的地方。这里依旧采用非常粗暴的二分法。这里是将结果可视化,实际上就是把△x和△z转换为二进制。

  这是输出为数据的方式,这里由于我为了方便debug加入了这么一个转化为数据的步骤,不是必须的,实际操作中直接输出就好。

  这里是一个循环的例子。

  /scoreboard

  players test x x 16 31

  /scoreboard

  players set x1 x 1

  非必须

  /scoreboard

  players remove x x 16

  /scoreboard

  players test x1 x 1 1

  非必须

  tp @e[name=ch]

  ~-16 ~ ~

  这是一个输出二进制的第一位的命令循环。除了第一行的命令其余需要使用con模式进行探测。

  所需要探测的范围分别是

  1 1

  2 3

  4 7

  8 15

  16 31

  之后就是探测周围区块,这里我稍微偷下懒通过穷举读取了周围的100个区块。实际上只用了25个之类。但是由于是常态执行的所以基本上是能在玩家到达之前生成完毕。也有一定的缺点,就是例如传送一类的东西,玩家可能会被生成的建筑糊一脸,嘛。。。这个其实可以不用在意了,毕竟传送到别的原版建筑也是会被糊一脸的。

  然后我们就建立完成了一个自定义世界结构的框架。接下来的工作就是根据mod的需求来编写建筑和生成条件。

  这里我会发布一个自己编写的自定义世界结构的原版mod,由于进行了测试,单指令不太方便,所以呢,以工程文件的形式发布。

  这里写得生成条件呢,有点简陋。

  我们可以探测方块和实体来判断所读取的区块是什么生物群系,举些例子吧,如果指针读取到大量的染色粘土方块,那么自然就是黏土山,读取到大量的菌丝,那么自然就是一个蘑菇生物群系,如果读取到大量的沙,那么自然是沙漠,如果在低高度读取到了雪,那么就是雪原,如果读取到了马,那么这里会是平原。。。。。。例子太多,这个主要就是看mod编写者对游戏性质的掌控如何了。当然也可以自己写选择的算法。这样的话其实生成的位置是与种子相关的。这里也需要注意一下,如果满足条件的区域过多的话,需要限制一下生成范围。

  我这里选择的生成条件是马。

  execute

  @e[type=EntityHorse] ~ ~ ~ scoreboard players set @e[name=on,c=1] c 1

  恩,我的指针取名为on。

  我发布的这个原版mod呢,非常卡,我能够稳定在30fps以上。因为会在平原有马的地方生成一个有海晶石组成的双层迷宫。迷宫算法并不复杂,我就不在此贴说明了。复杂程度看了一下,还算是可以接受的,并不会特别难,但是也能让你稍微绕一下。玩家在范围内会受到挖掘疲劳III的debuff,但是没有水。所以想探索这个迷宫的话推荐有一套不错的装备以及一定量的tnt储备,tnt最好直接带上。当然,内部没有光照,是个非常不错的天然刷怪区域。迷宫的奖励是大量的红石储备,八个金块,一个钻石块,以及一个远古守卫者和一个末地传送门框架。

  链接:

  密码:abvp

  这里有个小tip,由于原版mod的建筑有可能和要塞覆盖,脸黑的人直接就把末地门覆盖掉了,所以这种传送门多点也没有什么关系的。

  另一个小tip,自定义世界结构并不推荐生成非常庞大的地上建筑。地上建筑的话,会牵扯大量的亮度计算,基本上会GG。

  顺带一提,这个mod我没有debug,不过基本思路是不会错的,有bug的话欢迎反馈。如果用不了的话把里面的漏斗里的物品重新放一下就好。

  PS:在此非常感谢我的世界玩家乙烯_中国的分享。

  以上就是我的世界自定义世界结构详解 一个原版MOD。更多精彩尽在游戏园我的世界专区。

  热门攻略推荐:

  关于新快照对红石系统的修改介绍

  增加了防爆盾的小型瀑布TNT连发炮详解(附存档)

  15w45a模拟自然生成球类建筑制作详解

  我的世界刷怪塔怎么做 刷怪塔制作图文详解

热门搜索

手游排行榜

  • 最新排行
  • 最热排行
  • 评分最高