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

private MapGenBase structureGenerator1 = new ...;
...
private double[] heightMap;
private Biome[] biomesForGeneration;
private float[] biomeWeights;
private double[] mainNoiseRegion;
private double[] minLimitRegion;
private double[] maxLimitRegion;
private double[] depthRegion;
{
this.noiseGeneratorN = new NoiseGeneratorPerlin(this.rand, ...);
...
this.heightMap = new double[825];
this.biomeWeights = new float[25];
}
 
 
读者可能会感到奇怪:不是说维度的区块生成没有通用程式吗?当然没有,只不过这些代码在许多模组的新维度区块生成类中都能找到,甚至连参数值都不改的,它们应该都是借鉴于原版主世界生成的相关代码。这里我们可以注意到,只有地表噪音的类型是NoiseGeneratorPerlin。
 
另外,你还应该这么做:
InitNoiseGensEvent.contextOverworld context = new InitNoiseGensEvent.ContextOverworld(minLimitPerlinNoise, maxLimitPerlinNoise, mainLimitPerlinNoise, surfaceNoise, scaleNoise, depthNoise, null);
context = TerrainGen.getModdedNoiseGenerators(this.world, this.rand, context);
minLimitPerlinNoise = context.getLPerlin1();
maxLimitPerlinNoise = context.getLPerlin2();
mainPerlinNoise = context.getPerlin();
surfaceNoise = context.getHeight();
scaleNoise = context.getScale();
depthNoise = context.getDepth();
 
看到Event这个字眼之后,你就应该明白这一段和Forge有关。
 
然后是一个World类型的变量,这也显得理所应当——这个类中当然要有一个World实例了。
 
然后就是声明了一大堆MapGenBase子类变量,这些主要用于生成大型结构。这些变量一般在声明之时就初始化,然后在初始化块中再赋值——赋的这个值,笔者也不懂其具体含义,这块读者直接参阅原版的相关源代码,就知道怎么填了。
 
之后,是一个double类型的数组heightMap,就是用于存放高度分布的,笔者也不知道这个数组长度825是怎么得出来的,按理说16×16 = 256就可以了,不过原版和很多模组的代码都是这么写的。
 
然后是一个Biome数组,它用于存储该维度中所有的生物群系种类,并在generateChunk阶段以此为依据替换表层方块。如果你的维度中只有一个生物群系,那么这个Biome数组完全没必要声明,你直接在generateChunk里面向结果编程就好了。
 
然后是一个float数组,用于指定各生物群系生成的权重。直接贴代码吧:
 
for(int i = -2; i <= 2; i++)
{
for(int j = -2; j <= 2; j++)
{
this.biomeWeights[ i + 2 + (j + 2)* 5] = 10.0F / MathHelper.sqrt((float)(i * i + j * j) + 0.2F);
}
}
 
看不懂没关系,可以照着抄,反正原版和很多模组就是这么写的。
 
最后说一句,区块生成类的构造器并没有对形参列表的强制要求(不像TileEntity和Entity,前者要求有一个零参构造器,后者要求有一个形参只有一个World类型参数的构造器),因此这里传入什么参数就完全看你个人的需求了。
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,258

个编辑