- 5,018
- 47
- 783
Суть проблемы в следующем. Согласно моей задумке, в биомпровайдере биомослои накладываются друг на друга.
Сперва генерируется 3 биома каждого типа первым слоем биомов(для различия назову их регионами - магматический, метаморфический и осадочный).
Затем должно генерироваться еще по 4 подтипа каждого из этих регионов с помощью трех новых слоев с биомами, отталкиваясь от проверки на точке на биом.(Это нужно, чтобы биомы одного региона находились по возможности рядом с друг другом для реалистичности)
Пошел с самого начала. Сперва, исходя из логики, подумал что раз это уже биомы одного региона, то они должны получить массив родительского слоя, то есть тех трех изначальных регионов.
Написал так:
Оно не сработало. Как было три основных биома, так и осталось. Что то сделал не так?
Затем попробовал сделать без родительского слоя. Что тоже не работает.
Затем решил что чем перестать тыркатся впустую и тратить время, спросить совета у тех, кто лучше меня разбирается в слоях, в чем тут дело и как бы это исправить.
Сперва генерируется 3 биома каждого типа первым слоем биомов(для различия назову их регионами - магматический, метаморфический и осадочный).
Затем должно генерироваться еще по 4 подтипа каждого из этих регионов с помощью трех новых слоев с биомами, отталкиваясь от проверки на точке на биом.(Это нужно, чтобы биомы одного региона находились по возможности рядом с друг другом для реалистичности)
Java:
public GenLayer[] getModdedBiomeGenerators(WorldType worldType, long seed, GenLayer[] original)
{
GenLayer start = new RealGenLayerIsland(1L);
start = new GenLayerFuzzyZoom(2000L, start);
start = new GenLayerZoom(21000L, start);
GenLayer layer1 = new GenLayerAddIsland(1L, start);
layer1 = new GenLayerAddIsland(50L, layer1);
layer1 = new GenLayerAddIsland(70L, layer1);
GenLayer layerzoom1 = new GenLayerZoom(1001L, layer1);
layerzoom1 = new GenLayerZoom(1001L, layerzoom1);
layerzoom1 = new GenLayerZoom(1002L, layerzoom1);
layerzoom1 = new GenLayerZoom(1003L, layerzoom1);
layerzoom1 = new GenLayerZoom(1004L, layerzoom1);
layerzoom1 = new GenLayerZoom(1005L, layerzoom1);
layerzoom1 = new GenLayerZoom(1006L, layerzoom1);
GenLayer layer2 = GenLayerZoom.magnify(1000L, layerzoom1, 0);
GenLayer biomes = new GenLayerBiomes(1L);
GenLayer subbiomes1 = new GenLayerMetamorphicBiomes(1L);
biomes = new GenLayerFuzzyZoom(2000L, biomes);
biomes = new GenLayerZoom(1001L, biomes);
biomes = new GenLayerZoom(1002L, biomes);
biomes = new GenLayerZoom(1003L, biomes);
biomes = new GenLayerZoom(1004L, biomes);
biomes = new GenLayerZoom(1005L, biomes);
biomes = new GenLayerZoom(1006L, biomes);
GenLayer biomeIndexLayer = new GenLayerVoronoiZoom(10L, biomes);
start.initWorldGenSeed(seed);
drawImage(1000, biomes, "biomes");
drawImage(1000, subbiomes1, "subbiomes1");
return new GenLayer[]{
layer2, biomes, subbiomes1,
biomeIndexLayer
};
}
}
Пошел с самого начала. Сперва, исходя из логики, подумал что раз это уже биомы одного региона, то они должны получить массив родительского слоя, то есть тех трех изначальных регионов.
Написал так:
Java:
public class GenLayerMagmaticBiomes extends GenLayer {
private int magmatic_hills = Biome.getIdForBiome(RegBiomes.MAGMATIC_HILLS);
private int magmatic_desert = Biome.getIdForBiome(RegBiomes.MAGMATIC_DESERT);
private int magmatic_lake = Biome.getIdForBiome(RegBiomes.MAGMATIC_LAKE);
private int magmatic_swamp = Biome.getIdForBiome(RegBiomes.MAGMATIC_SWAMP);
public final int[] all_biomes = { magmatic_hills,magmatic_desert,magmatic_lake,magmatic_swamp};
public GenLayerMagmaticBiomes(long seed, GenLayer parent) {
super(seed);
this.parent = parent;
}
public int[] getInts(int areaX, int areaY, int areaWidth, int areaHeight)
{
int[] aint = this.parent.getInts(areaX, areaY, areaWidth, areaHeight);
int[] aint1 = IntCache.getIntCache(areaWidth * areaHeight);
for (int i = 0; i < areaHeight; ++i)
{
for (int j = 0; j < areaWidth; ++j)
{
this.initChunkSeed((long)(j + areaX), (long)(i + areaY));
int k = aint[j + i * areaWidth];
int l = (k & 3840) >> 8;
k = k & -3841;
if (isBiomeOceanic(k))
{
aint1[j + i * areaWidth] = k;
}
else
if (k == Biome.getIdForBiome(RegBiomes.MAGMATIC_PLAINS))
{
aint1[j + i * areaWidth] = this.all_biomes[nextInt(this.all_biomes.length)];
}
}
}
return aint1;
}
}
Оно не сработало. Как было три основных биома, так и осталось. Что то сделал не так?
Затем попробовал сделать без родительского слоя. Что тоже не работает.
Затем решил что чем перестать тыркатся впустую и тратить время, спросить совета у тех, кто лучше меня разбирается в слоях, в чем тут дело и как бы это исправить.
Java:
public class GenLayerMetamorphicBiomes extends GenLayer {
private int metamorphic_hills = Biome.getIdForBiome(RegBiomes.METAMORPHIC_HILLS);
private int metamorphic_desert = Biome.getIdForBiome(RegBiomes.METAMORPHIC_DESERT);
private int metamorphic_lake = Biome.getIdForBiome(RegBiomes.METAMORPHIC_LAKE);
private int metamorphic_swamp = Biome.getIdForBiome(RegBiomes.METAMORPHIC_SWAMP);
public final int[] all_biomes = { metamorphic_hills,metamorphic_desert,metamorphic_lake,metamorphic_swamp};
public GenLayerMetamorphicBiomes(long seed) {
super(seed);
}
public int[] getInts(int x, int z, int width, int height)
{
int[] dest = IntCache.getIntCache(width * height);
for (int dz = 0; dz < height; dz++) {
for (int dx = 0; dx < width; dx++) {
int k = dest[dz + dx * width];
int l = (k & 3840) >> 8;
k = k & -3841;
if (k == Biome.getIdForBiome(RegBiomes.METAMORPHIC_PLAINS))
{
initChunkSeed(dx + x, dz + z);
dest[(dx + dz * width)] = this.all_biomes[nextInt(this.all_biomes.length)];
}
}
}
return dest;
}
}