Сап форум.
Пытаюсь переписать генерацию мира таким образом, чтобы биомы были распределены по разным широтам, проще говоря - пытаюсь воссоздать климатические пояса наподобие Climatic Control и Climatic Biomes. Юзаю супердревнюю версию, но принцип генерации остался тем же, поэтому надеюсь что это не будет иметь большой роли.
За основу взял исходники BOP под свою версию, каждому биому назначил тип климата (в 1.6.4 климатических енумов не было), далее в самом первом слое генерации чуть-чуть изменил getInts, таким образом, чтобы вместо простых 0 и 1 он заполнялся либо нулем, либо, в зависимости от Z, числом от 1 до 4, где 4 - это пустыня, 3 - тропический климат, 2 - умеренный климат, 1 - холодный климат.
Почему за основу был взят BOP? Потому что на версии 1.6.4 он слоями практически целиком копирует ваниль, плюс хотелось сразу поиграться с разными вариациями уже готовых биомов.
Последовательность слоев BOP (ее не трогал):
Привожу метод из слоя BiomeLayerCreate
По поводу кода выше - я прекрасно понимаю, что назначать таким образом пояса не совсем правильно, но по факту я просто хочу создать хотя бы работающий прототип, поэтому это не так важно.
Далее, назначение биомов в BiomeLayerBiome:
Метод, выбирающий случайный биом определенного климата:
Собственно, на этом все мои действия заканчиваются. Климатические пояса есть, в определенных мною широтах генерируются случайные биомы из заданной категории, однако границы между климатическими поясами слишком резкие в плане высоты. Вот пример:
Это касается только тех биомов, у которых minHeight и maxHeight различаются. Если всем биомам задать их одинаковыми, перепадов не будет.
Что странно, при обычной генерации этих перепадов нет даже между очень разными по высотам биомами.
Собственно вопрос - как подобное исправить?
Пытаюсь переписать генерацию мира таким образом, чтобы биомы были распределены по разным широтам, проще говоря - пытаюсь воссоздать климатические пояса наподобие Climatic Control и Climatic Biomes. Юзаю супердревнюю версию, но принцип генерации остался тем же, поэтому надеюсь что это не будет иметь большой роли.
За основу взял исходники BOP под свою версию, каждому биому назначил тип климата (в 1.6.4 климатических енумов не было), далее в самом первом слое генерации чуть-чуть изменил getInts, таким образом, чтобы вместо простых 0 и 1 он заполнялся либо нулем, либо, в зависимости от Z, числом от 1 до 4, где 4 - это пустыня, 3 - тропический климат, 2 - умеренный климат, 1 - холодный климат.
Почему за основу был взят BOP? Потому что на версии 1.6.4 он слоями практически целиком копирует ваниль, плюс хотелось сразу поиграться с разными вариациями уже готовых биомов.
Последовательность слоев BOP (ее не трогал):
BiomeLayer#initializeAllBiomeGenerators():
public static GenLayer[] initializeAllBiomeGenerators(long seed, WorldType worldtype, int dim)
{
if(dim == 0)
{
BiomeLayer obj = new BiomeLayerCreate(1L, true);
obj = new BiomeLayerFuzzyZoom(2000L, (obj));
obj = new BiomeLayerIsland(1L, (obj));
obj = new BiomeLayerZoom(2001L, (obj));
obj = new BiomeLayerIsland(2L, (obj));
obj = new BiomeLayerZoom(2002L, (obj));
obj = new BiomeLayerIsland(3L, (obj));
obj = new BiomeLayerZoom(2003L, (obj));
obj = new BiomeLayerIsland(4L, (obj));
byte size = 4;
size = getModdedBiomeSize(worldtype, size);
BiomeLayer obj1 = obj;
obj1 = BiomeLayerZoom.func_75915_a(1000L, ((obj1)), 0);
obj1 = new BiomeLayerRiverInit(100L, ((obj1)));
obj1 = BiomeLayerZoom.func_75915_a(1000L, ((obj1)), size + 2);
obj1 = new BiomeLayerRiver(1L, ((obj1)));
obj1 = new BiomeLayerSmooth(1000L, ((obj1)));
BiomeLayer obj2 = obj;
obj2 = BiomeLayerZoom.func_75915_a(1000L, ((obj2)), 0);
obj2 = new BiomeLayerBiomes(200L, ((obj2)), worldtype, 0);
obj2 = BiomeLayerZoom.func_75915_a(1000L, ((obj2)), 2);
obj2 = new BiomeLayerSub(1000L, ((BiomeLayer)(obj2)));
obj2 = new BiomeLayerZoom(1000, ((obj2)));
obj2 = new BiomeLayerShore(1000L, ((BiomeLayer)(obj2)));
for (int i = 0 + 1; i < size; i++)
{
obj2 = new BiomeLayerZoom(1000 + i, ((obj2)));
}
obj2 = new BiomeLayerSmooth(1000L, ((obj2)));
obj2 = new BiomeLayerRiverMix(100L, ((obj2)), ((obj1)));
BiomeLayerRiverMix bwg4layerrivermix = ((BiomeLayerRiverMix)(obj2));
BiomeLayerVoronoiZoom genlayervoronoizoom = new BiomeLayerVoronoiZoom(10L, ((obj2)));
(obj2).initWorldGenSeed(seed);
genlayervoronoizoom.initWorldGenSeed(seed);
return (new GenLayer[]
{
obj2, genlayervoronoizoom, bwg4layerrivermix
});
}
else
{
int biomesize = 3;
if(dim == 1)
{
biomesize = 2;
}
//Hell and promised biome gen
BiomeLayer obj = new BiomeLayerCreate(1L, false);
obj = new BiomeLayerFuzzyZoom(2000L, (obj));
for(int i = 1; i < 3; i++) { obj = new BiomeLayerZoom(2000L + i, (obj)); }
obj = BiomeLayerZoom.func_75915_a(1000L, ((obj)), 0);
obj = new BiomeLayerBiomes(200L, ((obj)), worldtype, dim);
obj = BiomeLayerZoom.func_75915_a(1000L, ((obj)), 2);
for(int j = 0; j < biomesize; j++) { obj = new BiomeLayerZoom(1000L + j, (obj)); }
BiomeLayerVoronoiZoom genlayervoronoizoom = new BiomeLayerVoronoiZoom(10L, ((obj)));
(obj).initWorldGenSeed(seed);
genlayervoronoizoom.initWorldGenSeed(seed);
return (new GenLayer[] { obj, genlayervoronoizoom });
}
}
Привожу метод из слоя BiomeLayerCreate
BiomeLayerCreate#getInts():
@Override
public int[] getInts(int par1, int par2, int par3, int par4)
{
int[] var5 = IntCache.getIntCache(par3 * par4);
boolean ocean = BOPConfigurationBiomeGen.oceanGen;
boolean abyss = Biomes.oceanAbyss.isPresent();
boolean coral = Biomes.oceanCoral.isPresent();
boolean kelp = Biomes.oceanKelp.isPresent();
for (int var6 = 0; var6 < par4; ++var6)
{
for (int var7 = 0; var7 < par3; ++var7)
{
this.initChunkSeed(par1 + var7, par2 + var6);
if(ocean)
{
if(abyss) { var5[var7 + var6 * par3] = this.nextInt(50) == 0 ? 1 : Biomes.oceanAbyss.get().biomeID; }
else if(coral) { var5[var7 + var6 * par3] = this.nextInt(20) == 0 ? 1 : Biomes.oceanCoral.get().biomeID; }
else if(kelp) { var5[var7 + var6 * par3] = this.nextInt(20) == 0 ? 1 : Biomes.oceanKelp.get().biomeID; }
else { var5[var7 + var6 * par3] = this.nextInt(10) == 0 ? 1 : 0;}
}
else
{
int a = 1;
if (par2<-2) a=1;
if (par2>=-2 && par2<-1) a=2;
if (par2>=-1 && par2<0) a=3;
if (par2>=0) a=4;
var5[var7 + var6 * par3] = a;
}
}
}
if(ocean)
{
if (par1 > -par3 && par1 <= 0 && par2 > -par4 && par2 <= 0)
{
var5[-par1 + -par2 * par3] = 1;
}
}
return var5;
}
По поводу кода выше - я прекрасно понимаю, что назначать таким образом пояса не совсем правильно, но по факту я просто хочу создать хотя бы работающий прототип, поэтому это не так важно.
Далее, назначение биомов в BiomeLayerBiome:
BiomeLayerBiome#getInts():
@Override
public int[] getInts(int x, int z, int width, int height)
{
Climat climat = null;
int[] var5 = this.parent.getInts(x, z, width, height);
int[] var6 = IntCache.getIntCache(width * height);
boolean abyss = Biomes.oceanCoral.isPresent();
boolean coral = Biomes.oceanCoral.isPresent();
boolean kelp = Biomes.oceanKelp.isPresent();
for (int iz = 0; iz < height; ++iz)
{
for (int ix = 0; ix < width; ++ix)
{
this.initChunkSeed((long)(ix + x), (long)(iz + z));
int var9 = var5[ix + iz * width];
if(dimension == 0) //SURFACE BIOMES
{
if (var9 == 0)
{
var6[ix + iz * width] = 0;
}
else
{
if (var9==1) climat = Climat.NORTH;
if (var9==2) climat = Climat.MID;
if (var9==3) climat = Climat.TROPIC;
if (var9==4) climat = Climat.DESERT;
var6[ix + iz * width] = getRandomBiomeOfType(climat);
}
if (abyss)
{
if(var9 == Biomes.oceanAbyss.get().biomeID)
{
var6[ix + iz * width] = oceanBiomes.get(this.nextInt(oceanBiomes.size())).biomeID;
}
}
if (coral)
{
if(var9 == Biomes.oceanCoral.get().biomeID)
{
var6[ix + iz * width] = oceanBiomes.get(this.nextInt(oceanBiomes.size())).biomeID;
}
}
if (kelp)
{
if(var9 == Biomes.oceanKelp.get().biomeID)
{
var6[ix + iz * width] = oceanBiomes.get(this.nextInt(oceanBiomes.size())).biomeID;
}
}
}
else if(dimension == 1) //HELL BIOMES
{
var6[ix + iz * width] = netherBiomes.get(this.nextInt(netherBiomes.size())).biomeID;
}
else if(dimension == 2) //PROMISED BIOMES
{
var6[ix + iz * width] = promisedBiomes.get(this.nextInt(promisedBiomes.size())).biomeID;
}
else
{
var6[ix + iz * width] = surfaceBiomes[this.nextInt(surfaceBiomes.length)].biomeID;
}
}
}
return var6;
}
Метод, выбирающий случайный биом определенного климата:
BiomeLayerBiome#getRandomBiomeOfType():
public int getRandomBiomeOfType(Climat climat){
while (true) {
int b = this.nextInt(BiomeGenBase.biomeList.length);
if (BiomeDictionary.isBiomeRegistered(b)) {
{
if (BiomeGenBase.biomeList[b] instanceof IClimaticBIome){
IClimaticBIome bb = (IClimaticBIome) BiomeGenBase.biomeList[b];
if (bb.getClimat()==climat){
return BiomeGenBase.biomeList[b].biomeID;
}
}
}
}
}
}
Собственно, на этом все мои действия заканчиваются. Климатические пояса есть, в определенных мною широтах генерируются случайные биомы из заданной категории, однако границы между климатическими поясами слишком резкие в плане высоты. Вот пример:
Это касается только тех биомов, у которых minHeight и maxHeight различаются. Если всем биомам задать их одинаковыми, перепадов не будет.
Что странно, при обычной генерации этих перепадов нет даже между очень разными по высотам биомами.
Собственно вопрос - как подобное исправить?
Последнее редактирование: