实现这个自然生成建筑,仅仅需要很少的命令
首先这是用到的三个mcfunction文件
generat\generat_main.mcfunction
- gamerule commandBlockOutput false
- gamerule logAdminCommands false
- gamerule sendCommandFeedback false
- execute @a ~-64 0 ~-64 function generat:generat_mark unless @e[dx=129,dy=0,dz=129,tag=ChunkMarker]
- entitydata @e[tag=ChunkMarker] {Age:0}
复制代码 generat\generat_mark.mcfunction
- execute @s ~ ~ ~ summon area_effect_cloud ~ 0 ~ {Tags:["ChunkMarker"],Duration:2147483647}
- execute @s ~ ~ ~ summon area_effect_cloud ~ ~ ~ {Tags:["GeneratBuild","TrueMarker"]}
- execute @s ~ ~ ~ summon area_effect_cloud ~ ~ ~ {Tags:["GeneratBuild"]}
- execute @s ~ ~ ~ spreadplayers ~ ~ 64 65 false @e[tag=GeneratBuild]
- execute @e[tag=ChunkMarker] ~-32 0 ~-32 kill @e[tag=GeneratBuild,dx=64,dy=255,dz=64]
- <blockquote>execute @s ~ ~ ~ execute @e[tag=GeneratBuild,c=-1] ~ ~ ~ detect ~ ~-1 ~ grass -1 function generat:generat_build if @s[tag=TrueMarker]
复制代码 generat\generat_build.mcfunction
- summon area_effect_cloud ~ ~ ~ {Tags:["Load1"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load2"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load3"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load4"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load5"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load6"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load7"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load8"]}
- execute @s ~ ~ ~ spreadplayers ~16 ~16 0 1 false @e[tag=Load1]
- execute @s ~ ~ ~ spreadplayers ~16 ~ 0 1 false @e[tag=Load2]
- execute @s ~ ~ ~ spreadplayers ~16 ~-16 0 1 false @e[tag=Load3]
- execute @s ~ ~ ~ spreadplayers ~ ~16 0 1 false @e[tag=Load4]
- execute @s ~ ~ ~ spreadplayers ~ ~-16 0 1 false @e[tag=Load5]
- execute @s ~ ~ ~ spreadplayers ~-16 ~16 0 1 false @e[tag=Load6]
- execute @s ~ ~ ~ spreadplayers ~-16 ~ 0 1 false @e[tag=Load7]
- execute @s ~ ~ ~ spreadplayers ~-16 ~-16 0 1 false @e[tag=Load8]
- execute @s ~ ~ ~ fill ~-5 ~-1 ~-5 ~5 ~4 ~5 minecraft:stonebrick 0 hollow
- execute @s ~ ~ ~ fill ~-1 ~ ~-1 ~1 ~ ~1 minecraft:cobblestone 0
- execute @s ~ ~ ~ setblock ~ ~1 ~ diamond_block 0
复制代码 generat_main需要高频执行
把它挂在gameLoopFunction即可
- /gamerule gameLoopFunction generat:generat_main
复制代码
首先我们一点一点分析
main部分:
只有
- execute @a ~-64 0 ~-64 function generat:generat_mark unless @e[dx=129,dy=0,dz=129,tag=ChunkMarker]
复制代码 是实际有用的命令,其它都是设置消除命令提示和防止aec在三年之后消失(误)的命令这条命令的意思就是一直让玩家以~-64 0 ~-64为基准,如果129×1×129内没有marker,则执行mark部分
实际上就是当玩家走到的区块内和其它区块并不重合的时候,就会执行mark部分标记这个区块和尝试生成建筑
mark部分:
首先summon一个aec标记这个区块
- execute @s ~ ~ ~ summon area_effect_cloud ~ 0 ~ {Tags:["ChunkMarker"],Duration:2147483647}
复制代码 然后生成两个aec并扩散到65格内,但是只有一个aec是TureMarker
- execute @s ~ ~ ~ summon area_effect_cloud ~ ~ ~ {Tags:["GeneratBuild","TrueMarker"]}
- execute @s ~ ~ ~ summon area_effect_cloud ~ ~ ~ {Tags:["GeneratBuild"]}
- execute @s ~ ~ ~ spreadplayers ~ ~ 64 65 false @e[tag=GeneratBuild]
复制代码 如果想降低生成几率,那么就可以这样写:
- execute @s ~ ~ ~ summon area_effect_cloud ~ ~ ~ {Tags:["GeneratBuild","TrueMarker"]}
- execute @s ~ ~ ~ summon area_effect_cloud ~ ~ ~ {Tags:["GeneratBuild"]}
复制代码
扩散aec之后,如果aec在任何marker标记的区域内,就会被清除(kill)
- execute @e[tag=ChunkMarker] ~-32 0 ~-32 kill @e[tag=GeneratBuild,dx=64,dy=255,dz=64]
复制代码 这条就是对生成建筑条件的限制,必须自身TrueMarker,而且下面必须是草方块,且没有被清除,才会执行build部分
- <blockquote>execute @s ~ ~ ~ execute @e[tag=GeneratBuild,c=-1] ~ ~ ~ detect ~ ~-1 ~ grass -1 function generat:generat_build if @s[tag=TrueMarker]
复制代码 最后清掉所有的非marker的aec
- kill @e[tag=GenerantBuild]
复制代码 build部分:
就是当aec满足生成建筑条件之后会执行的部分,没什么好说的
先加载一下周围的区块防止无法放置方块
- summon area_effect_cloud ~ ~ ~ {Tags:["Load1"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load2"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load3"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load4"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load5"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load6"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load7"]}
- summon area_effect_cloud ~ ~ ~ {Tags:["Load8"]}
- execute @s ~ ~ ~ spreadplayers ~16 ~16 0 1 false @e[tag=Load1]
- execute @s ~ ~ ~ spreadplayers ~16 ~ 0 1 false @e[tag=Load2]
- execute @s ~ ~ ~ spreadplayers ~16 ~-16 0 1 false @e[tag=Load3]
- execute @s ~ ~ ~ spreadplayers ~ ~16 0 1 false @e[tag=Load4]
- execute @s ~ ~ ~ spreadplayers ~ ~-16 0 1 false @e[tag=Load5]
- execute @s ~ ~ ~ spreadplayers ~-16 ~16 0 1 false @e[tag=Load6]
- execute @s ~ ~ ~ spreadplayers ~-16 ~ 0 1 false @e[tag=Load7]
- execute @s ~ ~ ~ spreadplayers ~-16 ~-16 0 1 false @e[tag=Load8]
复制代码 然后生成建筑
- execute @s ~ ~ ~ fill ~-5 ~-1 ~-5 ~5 ~4 ~5 minecraft:stonebrick 0 hollow
- execute @s ~ ~ ~ fill ~-1 ~ ~-1 ~1 ~ ~1 minecraft:cobblestone 0
- execute @s ~ ~ ~ setblock ~ ~1 ~ diamond_block 0
复制代码
然后就没有然后了
这样就可以自然生成遗迹了 |