[1.7.10]Генерация Одной Руды

586
1
2
Здравствуйте,нужна помочь: у меня есть руда и мне нужно что бы она спаунилась одна,а не кучкой(от 2 и в гору).
Использую этот код:
Код:
public class Kryptonite implements IWorldGenerator  {
    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world,
            IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
        
        
        switch(world.provider.dimensionId) {
        
        case -1:
            generateNether(random, chunkX * 16, chunkZ * 16, world);
            break;
        case 0:
            generateOverWorld(random, chunkX * 16, chunkZ * 16, world);
            break;
        case 1:
            generateEnd(random, chunkX * 16, chunkZ * 16, world);
            break;

        }
    }
        private void addOre(Block block, Block blockspawn, Random random, World world, int posX, int posZ, int minY, int maxY, int minVien, int maxVien, int spawnChance){
            for(int i = 0; i < spawnChance; i++){
                int defaultChunkSize = 16;
                
                int xPos = posX + random.nextInt(defaultChunkSize);
                int yPos = minY + random.nextInt(maxY - minY);
                int zPos = posZ + random.nextInt(defaultChunkSize);
                
                new WorldGenMinable(block, (minVien + random.nextInt(maxVien - minVien)), blockspawn).generate(world, random, xPos, yPos, zPos);
                
            }
        }
    private void generateEnd(Random random, int chunkX, int chunkZ, World world) {
        // TODO Auto-generated method stub
        
    }

    private void generateOverWorld(Random random, int chunkX, int chunkZ, World world) {
        addOre(MyBlocks.Kryptonite , Blocks.stone, random, world, chunkX, chunkZ, 10, 80, 1, 4, 5 );
    
    }

    private void generateNether(Random random, int chunkX, int chunkZ, World world) {
        
        
    }
P.S.меня значение и так и сяк , но в итоге или мир лагал(Вообще не загружался) или ничего :pinch:.
 
nickita45 написал(а):
Код:
                new WorldGenMinable(block, (minVien + random.nextInt(maxVien - minVien)), blockspawn).generate(world, random, xPos, yPos, zPos);P.S.меня значение и так и сяк , но в итоге или мир лаг
Это маленький пушной зверек. А на кой черт ты каждый раз для генерации одного блока создаешь экземпляр класса WorldGenMinable? Просто замени один блок камня на свою руду и все.
 
586
1
2
Foghrye4 написал(а):
nickita45 написал(а):
Код:
                new WorldGenMinable(block, (minVien + random.nextInt(maxVien - minVien)), blockspawn).generate(world, random, xPos, yPos, zPos);P.S.меня значение и так и сяк , но в итоге или мир лаг
Это маленький пушной зверек. А на кой черт ты каждый раз для генерации одного блока создаешь экземпляр класса WorldGenMinable? Просто замени один блок камня на свою руду и все.
Ты наверное меня не понял,мне нужно что бы руда Генерировалась не кучкой , как уголь , а сама по себе(менял значение и т.д., в итоге спаунилось или 1 или 2).
P.S.Код нашёл на просторах интернета уже как год :) .
 
Функция generate(...) вызывается один раз на один чанк. Если тебе достаточно 1 куска руды на чанк, просто вызови функцию world.setBlock(...) внутри этой функции. Условием поставь что хочешь - или чтобы на данных координатах был блок камня или же любой блок, кроме воздуха.
chunkX и chunkZ - это координаты чанка. Чтобы преобразовать их в мировые координаты для фунции world.setBlock(...) достаточно сместить разряд вправо на 4: x = chunkX << 4;
 
586
1
2
Foghrye4 написал(а):
Функция generate(...) вызывается один раз на один чанк. Если тебе достаточно 1 куска руды на чанк, просто вызови функцию world.setBlock(...) внутри этой функции. Условием поставь что хочешь - или чтобы на данных координатах был блок камня или же любой блок, кроме воздуха.
chunkX и chunkZ - это координаты чанка. Чтобы преобразовать их в мировые координаты для фунции world.setBlock(...) достаточно сместить разряд вправо на 4: x = chunkX << 4;
Пробовал по твоему способу:
Код:
private void generateOverWorld(Random random, int chunkX, int chunkZ,  World world) {
        if(условие) {  
        world.setBlock(chunkX, Не понял что тут вставлять , chunkZ, MyBlocks.BLOCK);
                   }
    }
Ведь так?
 
nickita45 написал(а):
Код:
        if(условие) {  
        world.setBlock(chunkX, Не понял что тут вставлять , chunkZ, MyBlocks.BLOCK);
                   }
    }
Ведь так?


Не совсем. Во первых забыл преобразовать координаты чанка в мировые - см. мой предыдущий пост. Во вторых даже если ты так сделаешь, блок будет генерироваться в нижнем юго-западном (или северо-восточном?) углу чанка. Добавь random.nextInt(16) для x и z и random.nextInt(128) для оси y. Эти функции генерируют произвольные числа в пределах от 0 до указанного в скобках числа не включительно.
 
586
1
2
Foghrye4 написал(а):
nickita45 написал(а):
Код:
        if(условие) {  
        world.setBlock(chunkX, Не понял что тут вставлять , chunkZ, MyBlocks.BLOCK);
                   }
    }
Ведь так?


Не совсем. Во первых забыл преобразовать координаты чанка в мировые - см. мой предыдущий пост. Во вторых даже если ты так сделаешь, блок будет генерироваться в нижнем юго-западном (или северо-восточном?) углу чанка. Добавь random.nextInt(16) для x и z и random.nextInt(128) для оси y. Эти функции генерируют произвольные числа в пределах от 0 до указанного в скобках числа не включительно.
Понял,а в world.setBlock(),что в вставлять(Извини за глупые вопросы) ?
 
Понял,а в world.setBlock(),что в вставлять(Извини за глупые вопросы) ?
Я все-таки хотел, чтобы ты сам это понял. Ну ладно.
Код:
world.setBlock((chunkX<<4)+random.nextInt(16),random.nextInt(128),(chunkZ<<4)+random.nextInt(16), MyBlocks.Kryptonite, metadata, 2)

Последние два параметра:
  • метаданные (если не используешь - ставь 0).
  • "2" - уведомить сервер об изменении блока.
 
586
1
2
Foghrye4 написал(а):
Понял,а в world.setBlock(),что в вставлять(Извини за глупые вопросы) ?
Я все-таки хотел, чтобы ты сам это понял. Ну ладно.
Код:
world.setBlock((chunkX<<4)+random.nextInt(16),random.nextInt(128),(chunkZ<<4)+random.nextInt(16), MyBlocks.Kryptonite, metadata, 2)

Последние два параметра:
  • метаданные (если не используешь - ставь 0).
  • "2" - уведомить сервер об изменении блока.
Свой пост я писал потому что я уже это вставлял,только вот так(ожидал что сделал ошибку какую-то и решил переспросить):
Код:
private void generateOverWorld(Random random, int chunkX, int chunkZ, World world) {
        world.setBlock((chunkX<<4)+random.nextInt(16), random.nextInt(128), (chunkZ<<4)+random.nextInt(16),MBlocks.Kryptonite);
    
    }
Всё спаунилось,только очень редко.С вашим кодом вообще не спауниться .
Как можно увеличить шанс спауна?
 
586
1
2
Всем спасибо,проблему решил(Залез в горы и выкопал изумруды:pinch:).
 
Сверху