Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 3560|回复: 12

[教程] 【TRP|CBL|TCP】【教程】原版mod——自定义世界结构生成by乙烯

[复制链接]
发表于 2015-11-13 02:06:47 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 乙烯_中国 于 2016-3-20 17:51 编辑

大家好,我是乙烯。
今天呢,来给大家说说原版mod的一个很少有人涉及的重要分区,就是自定义世界结构。那么,世界结构是什么呢?世界结构啊,就是地图里面自动生成的结构,往大了说,有下界要塞,人工矿道,往小了说,泥土房间或者丛林神庙,包括新版本里面的雪屋也是的。那么现在怎么说呢,就是通过命令方块,来在世界里生成一些类似的这种结构。或许听上去很不可思议,毕竟我们知道,这并不像最普遍的那种原版mod可以通过execute指令(下文简称exe)很方便的对相应实体进行操作。世界结构主要还是要处理方块。那么我们并没有什么直接的方法去扫描整个世界的方块,这难道就难倒我们了吗?话不尽然。我们可以间接的去扫描世界的地形,依旧是通过exe来操作实体,以实体为指针扫描整个世界。
以实体做指针的话,必然要面对一个问题:我们应该怎样去做。那么我们已经知道,exe可以探测方块,那么我们可以探测一整块区域。但是世界是庞大的,我们就算是使用复数的指针也必须面对这个问题,我们不可能每个方块都进行读取,我们需要一片一片的读取。那么以怎样的方式读取呢,我们有没有什么方式可以套用呢?自然面前是有的,mc对世界的度量有个单位叫做区块,那么我们可以在读取范围内引入区块概念,将原本1*1的读取方式变成16*16的方式。这样的话自然就会大大减少所需处理的信息量。然而就算是这么处理,所需要的处理量依旧是庞大的。这就需要我们对整个的电路优化处理。但这是后话,我们应该先付诸实践,来看看我们目前的思路有哪些的问题。

                               
登录/注册后可看大图

这个电路是我在1.8时代时对这个项目进行测试的电路,我给其起一个诨名叫做:“Boomer”。因为这个电路总会悄无声息的占用满你的内存,然后等你发现的时候,你的mc就卡轰了。当然,需要一个红石脉冲进行启动。
那么来简诉一下,制作这个电路时的目的:为了建立一个区块的坐标系。
首先我们要设定一个基础区块。由于这电路实用性不高我就只讲计算的部分了。
这是一个周期的电路。每周期有四组及其相似的命令。
  1. execute
  2. @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ ~ ~-16
  3. minecraft:bedrock 0 summon ArmorStand ~ 0 ~-16
  4. {CustomName:HeyIKnowYouAreWatching,CustomNameVisible:1b,NoGravity:1b,Marker:1b}
复制代码

  1. execute
  2. @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ ~ ~
  3. minecraft:bedrock 0 setblock ~ ~ ~ barrier 0
复制代码

恩,中间有些东西就不要吐槽啦。
首先第一条命令的作用是对所有的指针探测其z轴负方向的下一个区块有没有被探测。如果未被探测,则在该区块放置一个指针。
第二条指令的话,每个指针将自己所在的区块标记为已探测。
同理会对四个方向进行读取。
然后细心的读者会发现图中的循环是有9个命令方块的,那么剩下来的那个方块代表着什么呢,自然是清理无用的指针。
  1. execute
  2. @e[type=ArmorStand,name=HeyIKnowYouAreWatching] ~ ~ ~ detect ~ 0 ~-16
  3. minecraft:barrier 0 execute @e[c=1] ~ ~ ~ detect ~ 0 ~16 minecraft:barrier 0
  4. execute @e[c=1] ~ ~ ~ detect ~-16 0 ~ minecraft:barrier 0 execute @e[c=1] ~ ~ ~
  5. detect ~16 0 ~ minecraft:barrier 0 kill @e[c=1]
复制代码

无用的指针是指不需要再次探测周围四处是否已经读取。那么自然,四个方向都被标记为已探测的指针就会被删除。
整体的总结:优点是初步实现了设想,确实能够建立一个区块模式,然而缺点是对传送毫无办法。一旦玩家传送到未加载被处理的区域的时候,这个机器将不会工作。
思考一下,首先是卡的问题,我们可以考虑降低指针的密度来解决这个问题。
那么我们是否要做一个让玩家不断对所在区块建立区块原点的装置呢?答案是必然的,但是随之而来的问题就是我们要怎样进行建立呢?如果直接以脚下作为基准的话,我们自然要面对两片已经被读取的区域的对齐问题。那么这个问题其实超级麻烦。所以我们要想一个其他办法。比如对齐坐标。
说到坐标,大家认识我的或多或少应该记得我前段时间发了一个GPS的原型机,非常的简陋。那么之后cbl的syl也是和我提过,这个的话其实是有实现单刻输出的方法的,至于具体的实现办法我会单独开贴进行详细的说明。这里就知道我们能够直接获取玩家所在坐标的x和z的取整值(四舍五入)。
我们一旦能够获取坐标的话,事情就简单很多了。
以下是对x进行处理的样例命令。
  1. /scoreboard
  2. players operation x x = @a x
复制代码

对玩家的x值进行备份
  1. /scoreboard
  2. players operation x x %= c32 c
复制代码

将x值对32取余
  1. /scoreboard
  2. players operation x x += c32 c
复制代码

X+32
  1. /scoreboard
  2. players operation x x %= c32 c
复制代码

再次取余
这样的话我们就可以获取玩家对西南方下一个指针基准点的△x和△z。
这里计算的步骤为什么要多两步呢?答案很简单。举个例子吧,比如玩家的x为-731,
那么我们进行完前两步所得到的结果必然是一个负数。一旦加入负数的话我们要处理的工作就得*2,两个坐标就得*4,这是非常不合算的。
这里的话所取得的负数必然是大于-32的,因为是对32进行的取余,所以我们加上32,再次取余,这样的话相当于强行选择西南方的基准点。处理也方便许多。
那么这里我们就可以在玩家正下方召唤一个指针,并通过△x和△z将其引导至该去工作的地方。这里依旧采用非常粗暴的二分法。这里是将结果可视化,实际上就是把△x和△z转换为二进制。

                               
登录/注册后可看大图

这是输出为数据的方式,这里由于我为了方便debug加入了这么一个转化为数据的步骤,不是必须的,实际操作中直接输出就好。
这里是一个循环的例子。
  1. /scoreboard
  2. players test x x 16 31
复制代码

  1. /scoreboard
  2. players set x1 x 1
复制代码

非必须
  1. /scoreboard
  2. players remove x x 16
复制代码

  1. /scoreboard
  2. players test x1 x 1 1
复制代码

非必须
  1. tp @e[name=ch]
  2. ~-16 ~ ~
复制代码

这是一个输出二进制的第一位的命令循环。除了第一行的命令其余需要使用con模式进行探测。
所需要探测的范围分别是
1 1
2 3
4 7
8 15
16 31

之后就是探测周围区块,这里我稍微偷下懒通过穷举读取了周围的100个区块。实际上只用了25个之类。但是由于是常态执行的所以基本上是能在玩家到达之前生成完毕。也有一定的缺点,就是例如传送一类的东西,玩家可能会被生成的建筑糊一脸,嘛。。。这个其实可以不用在意了,毕竟传送到别的原版建筑也是会被糊一脸的。
然后我们就建立完成了一个自定义世界结构的框架。接下来的工作就是根据mod的需求来编写建筑和生成条件。
这里我会发布一个自己编写的自定义世界结构的原版mod,由于进行了测试,单指令不太方便,所以呢,以工程文件的形式发布。
这里写得生成条件呢,有点简陋。
我们可以探测方块和实体来判断所读取的区块是什么生物群系,举些例子吧,如果指针读取到大量的染色粘土方块,那么自然就是黏土山,读取到大量的菌丝,那么自然就是一个蘑菇生物群系,如果读取到大量的沙,那么自然是沙漠,如果在低高度读取到了雪,那么就是雪原,如果读取到了马,那么这里会是平原。。。。。。例子太多,这个主要就是看mod编写者对游戏性质的掌控如何了。当然也可以自己写选择的算法。这样的话其实生成的位置是与种子相关的。这里也需要注意一下,如果满足条件的区域过多的话,需要限制一下生成范围。
我这里选择的生成条件是马。
  1. execute
  2. @e[type=EntityHorse] ~ ~ ~ scoreboard players set @e[name=on,c=1] c 1
复制代码

恩,我的指针取名为on。
我发布的这个原版mod呢,非常卡,我能够稳定在30fps以上。因为会在平原有马的地方生成一个有海晶石组成的双层迷宫。迷宫算法并不复杂,我就不在此贴说明了。复杂程度看了一下,还算是可以接受的,并不会特别难,但是也能让你稍微绕一下。玩家在范围内会受到挖掘疲劳III的debuff,但是没有水。所以想探索这个迷宫的话推荐有一套不错的装备以及一定量的tnt储备,tnt最好直接带上。当然,内部没有光照,是个非常不错的天然刷怪区域。迷宫的奖励是大量的红石储备,八个金块,一个钻石块,以及一个远古守卫者和一个末地传送门框架。
这里有个小tip,由于原版mod的建筑有可能和要塞覆盖,脸黑的人直接就把末地门覆盖掉了,所以这种传送门多点也没有什么关系的。
另一个小tip,自定义世界结构并不推荐生成非常庞大的地上建筑。地上建筑的话,会牵扯大量的亮度计算,基本上会GG。
顺带一提,这个mod我没有debug,不过基本思路是不会错的,有bug的话欢迎反馈。如果用不了的话把里面的漏斗里的物品重新放一下就好。

评分

参与人数 14人气 +27 金粒 +251 金锭 +2 贡献 +1 收起 理由
siiftun1857 + 1 + 1 【TRP|CBL|TCP】吓到我了
《企启》 + 1 + 5 膜拜触手~
-ZCH- + 1 【TRP|CBL|TCP】吓死我了......敢不敢加更.
玄素 + 1 + 15 标题吓人系列2333
sylqiuyifeng + 4 + 50 + 1 很棒的作品!
8784 + 1 + 2 噗三个优秀小组都被你抢了
scorpio975 + 2 + 50 【TRP|CBL|TCP】 这标题真是吓到我了.
末影矿工 + 2 + 50 Mcbbs有你更精彩~
chyx + 2 + 33 楼主你太帅了~
pacerrecap + 4 愿Him常在你左右!
simon3000 + 2 三只章鱼三只章鱼抱大腿~抱大腿~.
PTmissionary + 4 + 1 愿Him常在你左右!
lichi2050 + 2 码字+创意+拖精安慰
jianghr + 45 + 1 码字+创意+拖精安慰

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 02:23:06 | 显示全部楼层
大致过了一遍,基本可行。实物我就没时间倒腾了,原因你懂的。
群里面和你讲过复制以太mod,考虑上是:以太的空中高度不会和地面结构冲突,1.2.5的以太2
现在回想下除了新世界新方块和gui,基本上效果现在都已经能做出就来了。最后是,真的这是个很好的mod,无后可惜了。
然后,类似此种世界生成的,是否考虑像半年前贰逼介绍的oneblockcommand的展开方法。

点评

一个贡献给少了  详情 回复 发表于 2015-11-13 06:41
回复

使用道具 举报

发表于 2015-11-13 06:41:55 | 显示全部楼层
jianghr 发表于 2015-11-13 02:23
大致过了一遍,基本可行。实物我就没时间倒腾了,原因你懂的。
群里面和你讲过复制以太mod,考虑上是:以太 ...

一个贡献给少了
回复

使用道具 举报

发表于 2015-11-13 07:12:51 | 显示全部楼层
我跟你讲你这标题吓到我了
回复

使用道具 举报

发表于 2015-11-13 07:41:07 | 显示全部楼层
原创是谁给弄上去的……
其实这个的用处也不是很大额……
电脑还卡一卡的
直接一个盔甲架随机传送(扩散玩家那个指令而且范围要大)然后检测然后就直接clone了……
哪里还需要放那么多盔甲架啊……

点评

不卡才怪。。。  详情 回复 发表于 2017-8-17 11:53
人家就是在研究如何精确控制区域划分,然后你就在这里说spreadplayer 得你继续装吧,这逼装的太好  详情 回复 发表于 2015-11-13 19:09

评分

参与人数 1人气 +1 收起 理由
chyx + 1 juan

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 19:09:39 | 显示全部楼层
林扬骐 发表于 2015-11-13 07:41
原创是谁给弄上去的……
其实这个的用处也不是很大额……
电脑还卡一卡的

人家就是在研究如何精确控制区域划分,然后你就在这里说spreadplayer
得你继续装吧,这逼装的太好

点评

小的有眼不识泰山,请多见谅…… 我就是觉得把这种高科技拿来做自定义遗迹其实很浪费,表示用一个很简单的方法就能做出来 我也有我自己的想法,请不要随随便便就否定别人的想法,谢谢  详情 回复 发表于 2015-11-14 10:41
um。。。。应该可以理解成, 套exe 以区块间的某一点为基准点扫描区块, 这样内存貌似吃不消……  详情 回复 发表于 2015-11-13 19:29
回复

使用道具 举报

发表于 2015-11-13 19:29:54 | 显示全部楼层
sylqiuyifeng 发表于 2015-11-13 19:09
人家就是在研究如何精确控制区域划分,然后你就在这里说spreadplayer
得你继续装吧,这逼装的太好 ...

um。。。。应该可以理解成,
套exe 以区块间的某一点为基准点扫描区块,
这样内存貌似吃不消……
回复

使用道具 举报

发表于 2015-11-14 10:41:21 | 显示全部楼层
本帖最后由 林扬骐 于 2017-8-24 15:52 编辑
sylqiuyifeng 发表于 2015-11-13 19:09
人家就是在研究如何精确控制区域划分,然后你就在这里说spreadplayer
得你继续装吧,这逼装的太好 ...

小的有眼不识泰山,请多见谅

我就是觉得把这种高科技拿来做自定义遗迹其实很浪费,表示用一个很简单的方法就能做出来

我也有我自己的想法,请不要随随便便就否定别人的想法,谢谢
回复

使用道具 举报

发表于 2016-1-2 09:53:37 | 显示全部楼层
啪 膝盖交了,这种系统的问题还是有的,不过已经很厉害了(我表示想过逻辑,但是指令不行直接放弃了)
回复

使用道具 举报

发表于 2016-1-2 10:00:52 | 显示全部楼层
虽然看不懂  但是看上去好像很牛 逼的样子  膝盖给你了
回复

使用道具 举报

头像被屏蔽
发表于 2016-7-7 08:11:09 | 显示全部楼层
原创国产技术帖绝对打满分

这帖子有时候能帮到很多擂台赛的人,但是……

乙烯你能不能先别在德国泡了啊,回来补图好不好QAQ
回复

使用道具 举报

发表于 2017-8-17 11:53:14 | 显示全部楼层
林扬骐 发表于 2015-11-13 07:41
原创是谁给弄上去的……
其实这个的用处也不是很大额……
电脑还卡一卡的

不卡才怪。。。

评分

参与人数 1金粒 -10 收起 理由
贰逼 -10 无意义

查看全部评分

回复

使用道具 举报

发表于 2017-8-18 20:59:25 | 显示全部楼层
乙烯已经脱了CB坑跑向程序猿了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2017-12-18 16:46 , Processed in 0.091057 second(s), 7 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。