用户:MashKJo/1.12.2模组开发笔记/实现新维度:修订间差异

==== 实现generateChunk方法 ====
最难以理解的部分要来了。
 
这一部分,笔者只能说尽力地为读者讲解了,因为笔者对这一部分也只是一知半解。其实大部分Modder对这部分估计也不懂,很多模组的这块代码几乎就是照搬原版。因为Mojang在这块的代码写得实在是太抽象了,就连MCP都无法反混淆这些离谱的局部变量。我估计MC圈子里能完全看懂这些代码的只有Mojang员工和极少数社区开发者了。
 
所以,这部分的代码,如果读者不想听原理,且自己做的维度的地形生成和主世界差不多的话,直接去GitHub上一些模组的源代码仓库Copy + Paste就可以了(当然请注意这么做可能会引发一些版权问题,请先看好哪些模组采取限制宽松的开源协议,不过话说回来,大家这块的代码都是抄的原版代码,真的会有人去追究这种事情吗)。
 
实现generateChunk方法,大概是这样的:
 
然后,新建一个ChunkPrimer对象。再接连调用三个方法:generateHeightMap、setBlocksInChunk和replaceBiomeBlocks。这三个方法都用private修饰,实际上这体现了ChunkPrimer对象写入数据的一些步骤,你当然也可以把这三个方法的代码全塞在generateChunk这个方法里,但是完全没必要。把这些代码分成三个方法,更能体现代码模块化的原则。
 
然后,就开始进行结构的生成了。
 
这一切工作都做完后,便可以构造Chunk对象了。但是别急着返回该对象——我们还需要调用Chunk类的generateSkylightMap实例方法,然后才能返回。如果你不这么做,你会发现,进入你的新维度后,维度的TPS和FPS都非常低,整个维度也非常昏暗,且如果你什么都不做,整个维度都不能生成生物;但如果你放置了一个方块,那么该方块所在的区块会疯狂生成生物,很可能造成Memory Leak。
===== generateHeightMap =====
通常你需要用到generateNoiseOctaves方法,但接下来的事笔者也不懂了,请自行去GitHub上找现成的代码看吧。
 
===== setBlocksInChunk =====
原版主世界的区块生成类中,这个方法的代码是最抽象的。它有一个六重循环,循环里有大量意义不明的局部变量,最内层循环还有让人十分看不懂的一些if语句。同样建议直接去参考别人的代码。不过如果你真的想搞明白其中的原理的话,推荐去看交错次元模组的ChunkGeneratorBetweenlands源代码,在其中,setBlocksInChunk中的每个局部变量都有了意义明确的名字,只能说Angry Pixel牛逼!
 
===== replaceBiomeBlocks =====
这个方法的代码逻辑相对来说还算简单,原版主世界区块生成类中,Forge在这个方法的开头patch进去了一个事件,借此你可以操控主世界的表层方块替换。也建议在你的区块生成类中加上对于这个事件的判断。
 
这个方法中<code>surfaceNoise</code>开始发力,然后又是一个二重循环,在其中调用Biome类的genTerrainBlocks实例方法。
 
==== 实现populate方法 ====
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,258

个编辑