Слой биома

Версия Minecraft
1.12.2
5,149
49
899
Суть проблемы в следующем. Согласно моей задумке, в биомпровайдере биомослои накладываются друг на друга.
Сперва генерируется 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;
    }

}
 
Решение
Ты в своем алгоритме не используешь RealGenLayerIsland.

Код, который ты закомментил в RealGenLayerIsland, возник из-за специфики генератор для ванилы: генерирует землю рядом с нулевыми координатами, ну или прямо на них. Строка актуальна для генерации чанков в радиусе до 4000-5000 чанков, считая от нуля (что-то в этом духе). Равнина генерируется потому, что ее идентификатор - 1. Ванила впоследствии заменяет единицу, которая изначально означет "не море", на биомы, а ты этого не делаешь, т.к. генеришь сразу биомы вначале.

Зачем два раза вызываешь initWorldGenSeed? Так не надо делать.

И опять не используешь родителя в GenLayerBiomes. Зачем тогда писать весь код до вызова этого слоя? Сейчас твой код в действительности выглядит так:
Java:
...
Ну вот тут почему то не могут, видишь же сам) Проблема с этими "вырезами" очевидно, на границе биомов.
Проблема не в биомах. Я без понятия что ты менял у себя в моде. Чанки, генератор мира, и так далее. Если отладкич показывает биомы правильно - биомы правильные.
 
Ну вот тут почему то не могут, видишь же сам) Проблема с этими "вырезами" очевидно, на границе биомов. А вот не было бы пустынь, я бы даже и не узнал о том, что у меня есть такая проблемс
По твоей логике если ты видишь, что на границах что-то не так, что виноват генератор биомов. Очень странная логика. Я уже третий раз пишу - смотри на отладку.
 
Слои я сказал, а не генератор биомов. Я короче, в итоге сделал так. Взял стоковый ванильный GenLayerIsland, на него наложил три региона, позумил это все. Потом наложил уже биомы и еще это все три раза позумил. Получилась шикарная красивая территория. Пустыни удалил, не хочу разбиратся че с ними не так, --- это все уже, хочу пилить геймплей и декор :)

UPD Какой то модер родился в топовой семье интиллигентов, неприемлющих мат ни в каком виде. Сочувствую ему.
 
Последнее редактирование:
Назад
Сверху