Помогите Генераторы мира - как писать?

  • Автор темы Автор темы Dereku
  • Дата начала Дата начала

Dereku

Старожил
Пользователь
Баллы
173
Имя в Minecraft
_Dereku
Из далека - держу skylands сервер. Без ада и края. Игроки хотят ад, а я не хочу его таким, каким его придумал нотч.
А хочу я его без верхнего слоя. Как overworld, только nether. Поскольку сетить верхушку дело неблагодарное и не красивое, хочу жахнуть генератор мира.
Но на форумах баккита инфа расплывчата, а мне лень экспериментировать.
У кого есть примеры вменяемой логики генератора мира?
 
Гугли BlockPopulator, ChunkGenerator.
ChunkGenerator отвечает за начальную генерцию чанков, поэтому его стоит использовать если хочешь написать генератор с нуля.
BlockPopulator отрабатывет сразу после генерации чанка, что как раз подходит в твоём случае.
 
Гугли BlockPopulator, ChunkGenerator.
ChunkGenerator отвечает за начальную генерцию чанков, поэтому его стоит использовать если хочешь написать генератор с нуля.
BlockPopulator отрабатывет сразу после генерации чанка, что как раз подходит в твоём случае.
Как я понял, BlockPopulator что то вроде ванильного BiomeDecorator. Если так, то он мне не подходит для генерации чанков (именно с нуля надо, ибо резать nether пополам смысла нет).
Пока гуглю за ChunkGenerator.
 
А писать генератор всё-таки весело.
Жаль populator'ы ванильные нельзя использовать. Эх.
 
2015-10-07_02.05.39.png

Вроде генератор получился, но слишком медленный из-за PerlinOctaveGenerator.
Плюс надо возиться с BlockPopulator для генерации глоустоуна/песка/данжей. Нудно :(
 
Я тоже заинтересовался этим вопросом. Но так как генератор для меня - что-то непонятное, я решил вручную редактировать чанки при их генерации. И застрял на удалении верхнего слоя админиума. Почему-то зависает мой плагин.
Вот код:
Java:
private void clearSky(Chunk chunk) {   
        Bukkit.getScheduler().runTask(this, new oreTask(chunk, log));
    }
   
   
    @EventHandler
    public void MapInit(ChunkLoadEvent e){
       
        if(!e.isNewChunk()){return;}
        if(!e.getWorld().getEnvironment().equals(Environment.NETHER)){return;}
        Chunk c = e.getChunk();
        // срезаем весь админиум сверху (три слоя превращаем в воздух)
        clearSky(c);
    }
   
}

А это класс-обработчик:
Java:
public class oreTask implements Runnable {

    private Chunk chunk;
    private Logger log;

    public oreTask(Chunk chunk, Logger log) {
        // TODO Auto-generated constructor stub
        this.chunk = chunk;
        this.log = log;
    }

    @Override
    public void run() {
        for(int x = 0; x < 16; x++){
            for(int y = 125; y < 128; y++){
                for(int z = 0; z <  16; z++){
                    Block b = chunk.getBlock(x, y, z);
                    b.setType(Material.AIR);
                    }
                }
            }
        log.info("Chunk " + chunk.getX() + "/" + chunk.getZ() + " in world " + chunk.getWorld().getName() + " done.");
        }
}

В результате на входе в ад сервер зависает, а в логе спамит, что обрабатывает чанки (тысячи их).
 
Я тоже заинтересовался этим вопросом. Но так как генератор для меня - что-то непонятное, я решил вручную редактировать чанки при их генерации. И застрял на удалении верхнего слоя админиума. Почему-то зависает мой плагин.
Вот код:
Java:
private void clearSky(Chunk chunk) {  
        Bukkit.getScheduler().runTask(this, new oreTask(chunk, log));
    }
  
  
    @EventHandler
    public void MapInit(ChunkLoadEvent e){
      
        if(!e.isNewChunk()){return;}
        if(!e.getWorld().getEnvironment().equals(Environment.NETHER)){return;}
        Chunk c = e.getChunk();
        // срезаем весь админиум сверху (три слоя превращаем в воздух)
        clearSky(c);
    }
  
}

А это класс-обработчик:
Java:
public class oreTask implements Runnable {

    private Chunk chunk;
    private Logger log;

    public oreTask(Chunk chunk, Logger log) {
        // TODO Auto-generated constructor stub
        this.chunk = chunk;
        this.log = log;
    }

    @Override
    public void run() {
        for(int x = 0; x < 16; x++){
            for(int y = 125; y < 128; y++){
                for(int z = 0; z <  16; z++){
                    Block b = chunk.getBlock(x, y, z);
                    b.setType(Material.AIR);
                    }
                }
            }
        log.info("Chunk " + chunk.getX() + "/" + chunk.getZ() + " in world " + chunk.getWorld().getName() + " done.");
        }
}

В результате на входе в ад сервер зависает, а в логе спамит, что обрабатывает чанки (тысячи их).
Вот именно поэтому лучше писать генератор. И выхлоп в лог лучше выводить ежесекундно - вывод в консоль занимает слишком много времени.
 
Вот именно поэтому лучше писать генератор.
Покажи мне на коротком примере, как выглядит готовый генератор. И я буду писать генератор.

Попробовал ограничить количество обработанных чанков до 200, он обработал, остановился. Я зашел и увидел это:
VrxgQN6GAX.png

Оно было очень длинным. А консоль выглядела так:
sbxipoyv1F.png
Почему-то он обрабатывает чанки наискосок и очень далеко от игрока и не останавливается. А по задумке должен был обрабатывать все вновь генерируемые чанки. Или я неправильно понимаю, что означат ChunkPopulateEvent? (я пробовал ChunkPopulateEvent и ChunkLoadEvent)
 
Последнее редактирование:
Покажи мне на коротком примере, как выглядит готовый генератор. И я буду писать генератор.
http://bukkit.org/threads/93982/
Почему-то он обрабатывает чанки наискосок и очень далеко от игрока и не останавливается. А по задумке должен был обрабатывать все вновь генерируемые чанки. Или я неправильно понимаю, что означат ChunkPopulateEvent? (я пробовал ChunkPopulateEvent и ChunkLoadEvent)
ChunkPopulateEvent использовать лучше для обработки. Вот только надо просто брать один чанк из эвента и работать с ним. Да и лучше этим заниматься на пустой мир.
 
Почему бы не заюзать для конкретного мира Ада TerrainControl? Там есть такая "галочка", слой админиума сверху (eg.), убирается легко. За-wb fill-ить его нужного размера, унеси плагин в закрома.
 
Почему бы не заюзать для конкретного мира Ада TerrainControl? Там есть такая "галочка", слой админиума сверху (eg.), убирается легко. За-wb fill-ить его нужного размера, унеси плагин в закрома.
Алло, я в треде спрашивал как генератор написать.
2015-10-11_22.49.32.png

Весело это. Правда, рандом любит гнать. эх.
 
Но довольно-таки скрупулезен. Тебе бы подошел ник TowerlessBee. :good:

И, в целом, познавателен.

Непонятно только, как этот код подключить.
Скомпилировать с load: STARTUP в конфиге, как плагин, а в server.properties прописать level-type=CrystalTowerPopulator ?

(далее - скорее для себя, но и тебе пусть будет приятно, что я прочитал весь твой код)
Зачем использовать deprecated getTypeId?
Своеобразный алгоритм вычисления удобного расположения - по листве и древесине?
А если дерево высокое? Выше y+21 останется торчать вершина?
Смысл спавнить зомби и скелетов, если они все равно пропадут? Можно пометить чанк и добавить их спавн в какой-нибудь onLoadChunk.

В любом случае, этот ужасный код лучше, чем мои портянки.
 
Но довольно-таки скрупулезен. Тебе бы подошел ник TowerlessBee. :good:
Сочту за комплимент.
Непонятно только, как этот код подключить.
Скомпилировать с load: STARTUP в конфиге, как плагин, а в server.properties прописать level-type=CrystalTowerPopulator ?
Нет. Популяторы используются для декорирования уже сгенерированного чанка. Т.е. тебе нужно сгенерировать чанк, чтобы использовать его.
Зачем использовать deprecated getTypeId?
Во-первых, это короче. Во-вторых, сам API их использует.
Своеобразный алгоритм вычисления удобного расположения - по листве и древесине?
Это что то вроде фильтрации, чтобы башня на располагалась на ветвях дерева.
А если дерево высокое? Выше y+21 останется торчать вершина?
К сожалению да. Но в моём мире такие деревья появляются с шансом 0.
Смысл спавнить зомби и скелетов, если они все равно пропадут? Можно пометить чанк и добавить их спавн в какой-нибудь onLoadChunk.
Я не хочу слушать этот эвент. Тем более, нужно хранить координаты башни где ниб, или же искать их по Entity EnderCrystal. В конце концов, и без зомбей со скелетами данная башня представляет опасность в виде блоков с чешуйницами.
 
Назад
Верх