Цветы и прочий декор

Версия Minecraft
1.7.10
1,976
68
220
Доброго времени суток, господа о/

Сколько бы я не пытался, но генерироваться эти чёртовы цветы не хотят, и хоть ты тресни. Пробовал и через генерацию, и через декоратор... Ничего. Подскажите, что не так?

Код:
@Override
public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) {
	int var4 = par2 * 16;
	int var5 = par3 * 16;
	BiomeGenAlfheim biome = (BiomeGenAlfheim) this.worldObj.getBiomeGenForCoords(var4 + 16, var5 + 16);
	long p1 = this.rand.nextLong() / 2L * 2L + 1L;
	long j1 = this.rand.nextLong() / 2L * 2L + 1L;
	this.rand.setSeed(this.worldObj.getSeed());
	this.rand.setSeed((long)par2 * p1 + (long)par3 * j1 ^ this.worldObj.getSeed());
	biome.decorate(worldObj, rand, par2, par3);
}
Код:
@Override
public void decorate(World world, Random rand, int chunkX, int chunkZ) {
	//super.decorate(world, rand, chunkX, chunkZ); <- causes Already Decorating!! error
	
	double d0 = plantNoise.func_151601_a((double) (chunkX + 8) / 200.0D, (double) (chunkZ + 8) / 200.0D);
	int k;
	int l;
	int i1;
	int j1;

	if (d0 < -0.8D) {
		this.theBiomeDecorator.flowersPerChunk = 15;
		this.theBiomeDecorator.grassPerChunk = 5;
	} else {
		this.theBiomeDecorator.flowersPerChunk = 4;
		this.theBiomeDecorator.grassPerChunk = 10;
		genTallFlowers.func_150548_a(2);

		for (k = 0; k < 7; ++k) {
			l = chunkX + rand.nextInt(16) + 8;
			i1 = chunkZ + rand.nextInt(16) + 8;
			j1 = rand.nextInt(world.getHeightValue(l, i1) + 32);
			genTallFlowers.generate(world, rand, l, j1, i1);
		}
	}

	{ // Botania
		// Flowers
		int dist = Math.min(8, Math.max(1, ConfigHandler.flowerPatchSize));
		for(int i = 0; i < ConfigHandler.flowerQuantity; i++) {
			if(rand.nextInt(ConfigHandler.flowerPatchChance) == 0) {
				int x = chunkX + rand.nextInt(16) + 8;
				int z = chunkZ + rand.nextInt(16) + 8;
				int y = world.getTopSolidOrLiquidBlock(x, z);
	
				int color = rand.nextInt(16);
				boolean primus = rand.nextInt(380) == 0;
	
				for(int j = 0; j < ConfigHandler.flowerDensity * ConfigHandler.flowerPatchChance; j++) {
					int x1 = x + rand.nextInt(dist * 2) - dist;
					int y1 = y + rand.nextInt(4) - rand.nextInt(4);
					int z1 = z + rand.nextInt(dist * 2) - dist;
	
					if(world.isAirBlock(x1, y1, z1) && world.getBlock(x1, y1 - 1, z1) == AlfheimBlocks.elvenGrass) {
						if(primus) {
							world.setBlock(x1, y1, z1, ModBlocks.specialFlower, 0, 2);
							TileSpecialFlower flower = (TileSpecialFlower) world.getTileEntity(x1, y1, z1);
							flower.setSubTile(rand.nextBoolean() ? LibBlockNames.SUBTILE_NIGHTSHADE_PRIME : LibBlockNames.SUBTILE_DAYBLOOM_PRIME);
							SubTileDaybloom subtile = (SubTileDaybloom) flower.getSubTile();
							subtile.setPrimusPosition();
						} else {
							world.setBlock(x1, y1, z1, ModBlocks.flower, color, 2);
							if(rand.nextDouble() < ConfigHandler.flowerTallChance && ((BlockModFlower) ModBlocks.flower).func_149851_a(world, x1, y1, z1, false))
								BlockModFlower.placeDoubleFlower(world, x1, y1, z1, color, 0);
						}
					}
				}
			}
		}
		
		// Mushrooms
		for(int i = 0; i < ConfigHandler.mushroomQuantity; i++) {
			int x = chunkX + rand.nextInt(16) + 8;
			int z = chunkZ + rand.nextInt(16) + 8;
			int y = rand.nextInt(26) + 4;

			int color = rand.nextInt(16);
			if(world.isAirBlock(x, y, z) && ModBlocks.mushroom.canBlockStay(world, x, y, z))
				world.setBlock(x, y, z, ModBlocks.mushroom, color, 2);
		}
	}
}

Вообще, вот весь код, который может пригодится в понимании данной проблемы - тык
или, если та не работает - тык - путь /src/main/java/alfheim/common/world/dim/

Очень надеюсь на вашу помощь, ибо каждый день промедления затягивает релиз, а это не очень хорошо, мне ещё баги искать... :angel:
Заранее спасибо :3
 
Решение
В методе популейт 2-й и 3-й параметры...
Это как бы координаты чанков. Их нужно умножать на 16...
При выяснении биома ты это делаешь, но в генератор передаёшь всё равно не умноженные.
1,200
37
237
Я, конечно, уверен, что я говорю о плохом способе реализации, но всё же:

Обычный генератор, в нем на каждый чанк (ну.. сделай там проверку по биому, шанс генерации и т.д.) запускается генератор. Генератор чуть бы не самый обычный: цикл - кол-во на чанк; в нём рандомом берёшь x, z, и через метод (точно не помню, смотри по height, solid и т. д.) в world нахожу y. Дальше сам знаешь.
 
5,018
47
783
Попробуй мои грибы(старый код с 1.7)
Код:
public class NewWorldGenMushroom implements IWorldGenerator {

 @Override
 public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
 switch(world.provider.dimensionId) {
 case -1: 
 break;
 case 0:generateSurface(world, random, chunkX *16, chunkZ *16);break;
 case 1: 
 break;
 }

 }



 private void generateSurface(World world, Random random, int x, int z) {
 if (world.provider.terrainType == WorldType.FLAT) {
 return;
 }
 int ranZ1 = random.nextInt(7);
 int ranX1 = random.nextInt(7);
 int ranZ2 = random.nextInt(3);
 int ranX2 = random.nextInt(3);
 int ranY1 = random.nextInt(1);
 if (ranZ1 != 0 && ranX1 != 0){
 for (int y = ranY1; y < world.getHeight(); ++y) {
 for (int x1 = x; x1 < x + 12; ++x1) {
 for (int z1 = z; z1 < z + 12; ++z1) {


 if (world.getBlock(x1, y - 1, z1) == Blocks.grass && world.getBlock(x1, y - 1, z1) != Blocks.air && world.getBlock(x1 + ranX1, y, z1 - ranZ1) == Blocks.log && world.getBlockMetadata(x1  + ranX1, y, z1- ranZ1) == 0 ) {
 world.setBlock(x1 + ranX2, y, z1 + ranZ2, MyBlocks.underOakMushroom);
 }
 if (world.getBlock(x1, y - 1, z1) == Blocks.grass && world.getBlock(x1, y - 1, z1) != Blocks.air && world.getBlock(x1+ ranX1, y, z1 - ranZ1) == Blocks.log && world.getBlockMetadata(x1+ ranX1, y, z1 - ranZ1) == 2 ) {
 world.setBlock(x1 + ranX2, y, z1 + ranZ2, MyBlocks.mushroomBirchMushroom);
 }



 }
 }
 }
 }
 }
}
 
4,045
63
645
В методе популейт 2-й и 3-й параметры...
Это как бы координаты чанков. Их нужно умножать на 16...
При выяснении биома ты это делаешь, но в генератор передаёшь всё равно не умноженные.
 
Сверху