Custom BiomeDecorator

Версия Minecraft
1.12.2
2,932
44
598
Доброго времени суток Земляне и Чужие!
Сегодня у меня появился вопрос: Вот я сделал генератор "цветов" допустим:
Java:
public class AshGen extends WorldGenerator
{
    public AshGen(){}

    @Override
    public boolean generate(World worldIn, Random rand, BlockPos position)
    {
        BlockBush ash = (BlockBush) RegBlocks.ash;
        
        for (int i = 0; i < 64; ++i)
        {
            BlockPos blockpos = position.add(rand.nextInt(8) - rand.nextInt(8), rand.nextInt(4) - rand.nextInt(4), rand.nextInt(8) - rand.nextInt(8));

            if (worldIn.isAirBlock(blockpos) && (!worldIn.provider.isNether() || blockpos.getY() < 255) && ash.canBlockStay(worldIn, blockpos, ash.getDefaultState()))
            {
                worldIn.setBlockState(blockpos, ash.getDefaultState(), 2);
            }
        }

        return true;
    }
}
Потом сделал BiomeDecorator который использует этот генератор:
Java:
public class BiomeDecoratorBurnedWood extends BiomeDecorator {
  
    protected AshGen ashGen;

    public BiomeDecoratorBurnedWood() {super();}

    @Override
    public void decorate(World worldIn, Random random, Biome biome, BlockPos pos)
    {
        if (decorating)
        {
            throw new RuntimeException("Already decorating");
        }
        else
        {
            chunkPos = pos;
            genDecorations(biome, worldIn, random);
            decorating = false;
        }
    }

    @Override
    protected void genDecorations(Biome biomeIn, World worldIn, Random random)
    {
        MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Pre(worldIn, random, chunkPos));

      
        generateAsh(worldIn, biomeIn, random, chunkPos);

        if (generateFalls)
        {
            generateFalls(worldIn, random, chunkPos);
        }
        
        MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Post(worldIn, random, chunkPos));
    }
    
    private void generateAsh(World worldIn, Biome biomeIn, Random random, BlockPos chunkPos)
    {
        if(TerrainGen.decorate(worldIn, random, chunkPos, DecorateBiomeEvent.Decorate.EventType.FLOWERS))
        for (int numAshGenerated = 0; numAshGenerated < flowersPerChunk; ++numAshGenerated)
        {
            int ashX = random.nextInt(16) + 8;
            int ashZ = random.nextInt(16) + 8;
            int yRange = worldIn.getHeight(chunkPos.add(ashX, 0, ashZ)).getY() + 32;

            ashGen = new AshGen();
            
            if (yRange > 0)
            {
                int ashY = random.nextInt(yRange);
                BlockPos ashBlockPos = chunkPos.add(ashX, ashY, ashZ);
                ashGen.generate(worldIn, random, ashBlockPos);
            }
        }
    }
    
    private void generateFalls(World worldIn, Random random, BlockPos chunkPos)
    {
        if(TerrainGen.decorate(worldIn, random, chunkPos, DecorateBiomeEvent.Decorate.EventType.LAKE_WATER))
        for (int k5 = 0; k5 < 50; ++k5)
        {
            int i10 = random.nextInt(16) + 8;
            int l13 = random.nextInt(16) + 8;
            int i17 = random.nextInt(248) + 8;

            if (i17 > 0)
            {
                int k19 = random.nextInt(i17);
                BlockPos blockpos6 = chunkPos.add(i10, k19, l13);
                (new WorldGenLiquids(Blocks.FLOWING_WATER)).generate(worldIn, random, blockpos6);
            }
        }

        if(TerrainGen.decorate(worldIn, random, chunkPos, DecorateBiomeEvent.Decorate.EventType.LAKE_LAVA))
        for (int l5 = 0; l5 < 20; ++l5)
        {
            int j10 = random.nextInt(16) + 8;
            int i14 = random.nextInt(16) + 8;
            int j17 = random.nextInt(random.nextInt(random.nextInt(240) + 8) + 8);
            BlockPos blockpos3 = chunkPos.add(j10, j17, i14);
            (new WorldGenLiquids(Blocks.FLOWING_LAVA)).generate(worldIn, random, blockpos3);
        }
    }

    private void generate(World worldIn, Random random, BlockPos chunkPos, EventType eventType, WorldGenerator generator, int countPerChunk)
    {
        if(TerrainGen.decorate(worldIn, random, chunkPos, eventType))
        {
            for (int count = 0; count < countPerChunk; ++count)
            {
                int randX = random.nextInt(16) + 8;
                int randZ = random.nextInt(16) + 8;
                generator.generate(worldIn, random, worldIn.getTopSolidOrLiquidBlock(chunkPos.add(randX, 0, randZ)));
            }
        }
    }
}
Теперь как его использовать в своём биоме?
По идей это должно вот так работать:
Java:
    @Override
    public BiomeDecorator createBiomeDecorator()
    {
        BiomeDecorator biomeDecorator = new BiomeDecoratorBurnedWood();
        
        biomeDecorator.flowersPerChunk = 50;

        return getModdedBiomeDecorator(biomeDecorator);
    }
Но там я так понял запускается рекурсия из за чего мир просто не загружается.
 
Решение
Java:
@Override
    public BiomeDecorator createBiomeDecorator()
    {
        BiomeDecorator biomeDecorator = new BiomeDecoratorBurnedWood();
       
        biomeDecorator.flowersPerChunk = 50;

        return getModdedBiomeDecorator(biomeDecorator);
    }
Попробуй вернуть не getModdedBiomeDecorator(biomeDecorator); а просто biomeDecorator.
Java:
@Override
    public BiomeDecorator createBiomeDecorator()
    {
        BiomeDecorator biomeDecorator = new BiomeDecoratorBurnedWood();
       
        biomeDecorator.flowersPerChunk = 50;

        return getModdedBiomeDecorator(biomeDecorator);
    }
Попробуй вернуть не getModdedBiomeDecorator(biomeDecorator); а просто biomeDecorator.
 

Eifel

Модератор
1,623
78
608
Не знаю, я просто тырил ванильный генератор цветов и дописывал 1 проверку на биом. Затем просто регал свой генератор используя в нем этот. И все работает прекрасно без всяких декораторов. Мне кажется так намного проще

Вот к примеру генератор цветов из моего мода
 
Последнее редактирование:
2,932
44
598
Вот что примерно у меня получилось:
public static Block ash = new Ash(Material.GLASS, "ash", 0.2F, 2F, SoundType.SNOW);
Java:
public class Ash extends Block{

    public Ash(final Material materialIn, final String name, float hardness,float resistanse, SoundType soundtype) {
        
        super(materialIn);
        
        this.setRegistryName(name);
        this.setUnlocalizedName(name);
        this.setSoundType(soundtype);
        this.setHardness(hardness);
        this.setResistance(resistanse);
        this.setCreativeTab(Realism.tabMain);
        
    }
Java:
public class AshGen implements IWorldGenerator{

    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
        switch (world.provider.getDimension()){
            case 0:
                generateOverworld(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
                break;
        }
    }

    public void generateOverworld(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider){
        
        Biome biome = world.getBiome(new BlockPos(chunkX << 4, world.getActualHeight(), chunkZ << 4));

        if(biome == RegBiome.BURNEDWOOD)
            
            ashWorldGeneratorM(RegBlocks.ash, 32, world, random, chunkX, chunkZ);

    }
        
   private void ashWorldGeneratorM(Ash block, int rarity, World world, Random random, int chunkX, int chunkZ){
        int x = (chunkX << 4) + random.nextInt(16) + 8;
        int y = random.nextInt(128);
        int z = (chunkZ << 4) + random.nextInt(16) + 8;
        (new AshWorldGenerator(block, rarity)).generate(world, random, new BlockPos(x, y, z));
    }
}
Java:
public class AshWorldGenerator extends WorldGenerator {

    private Ash ash;
    private IBlockState state;
    private int rarirty;

    public AshWorldGenerator(Ash ash, int rarity) {
        this.ash = ash;
        this.state = ash.getDefaultState();
        this.rarirty = rarity;
    }

    @Override
    public boolean generate(World worldIn, Random rand, BlockPos position) {
        for (int i = 0; i < this.rarirty; ++i) {
            BlockPos blockpos = position.add(rand.nextInt(8) - rand.nextInt(8), rand.nextInt(4) - rand.nextInt(4), rand.nextInt(8) - rand.nextInt(8));
            if (worldIn.isAirBlock(blockpos) && (worldIn.provider.hasSkyLight()|| blockpos.getY() < 255)) {
                Block block = this.state.getBlock();
                if(block.equals(RegBlocks.ash));
                else worldIn.setBlockState(blockpos, this.state);
            }
        }
        return true;
    }
}

Ошибка:
The method ashWorldGeneratorM(Ash, int, World, Random, int, int) from the type AshGen refers to the missing type Ash
 
Сверху