Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by Dereku, Oct 6, 2015.

  1. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Из далека - держу skylands сервер. Без ада и края. Игроки хотят ад, а я не хочу его таким, каким его придумал нотч.
    А хочу я его без верхнего слоя. Как overworld, только nether. Поскольку сетить верхушку дело неблагодарное и не красивое, хочу жахнуть генератор мира.
    Но на форумах баккита инфа расплывчата, а мне лень экспериментировать.
    У кого есть примеры вменяемой логики генератора мира?
     
  2. Хостинг MineCraft
    <
  3. AxmeD

    AxmeD Старожил Пользователь

    Trophy Points:
    103
    Skype:
    ahmed136323
    А стоило бы попробовать)
     
  4. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Слишком долго и нудно.
     
  5. Shevchik

    Shevchik Старожил Пользователь

    Trophy Points:
    173
    Имя в Minecraft:
    _Shevchik_
    Гугли BlockPopulator, ChunkGenerator.
    ChunkGenerator отвечает за начальную генерцию чанков, поэтому его стоит использовать если хочешь написать генератор с нуля.
    BlockPopulator отрабатывет сразу после генерации чанка, что как раз подходит в твоём случае.
     
  6. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Как я понял, BlockPopulator что то вроде ванильного BiomeDecorator. Если так, то он мне не подходит для генерации чанков (именно с нуля надо, ибо резать nether пополам смысла нет).
    Пока гуглю за ChunkGenerator.
     
  7. Qwertion

    Qwertion Участник Пользователь

    Trophy Points:
    36
    Имя в Minecraft:
    Qwertion
    Крашнулся сервер бы XD
     
  8. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А писать генератор всё-таки весело.
    Жаль populator'ы ванильные нельзя использовать. Эх.
     
  9. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Классная идея. Я бы тоже хотел ад с открытым небом.
     
  10. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    2015-10-07_02.05.39.png

    Вроде генератор получился, но слишком медленный из-за PerlinOctaveGenerator.
    Плюс надо возиться с BlockPopulator для генерации глоустоуна/песка/данжей. Нудно :(
     
  11. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Я тоже заинтересовался этим вопросом. Но так как генератор для меня - что-то непонятное, я решил вручную редактировать чанки при их генерации. И застрял на удалении верхнего слоя админиума. Почему-то зависает мой плагин.
    Вот код:
    Code:
    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);
        }
       
    }
    
    А это класс-обработчик:
    Code:
    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.");
            }
    }
    
    В результате на входе в ад сервер зависает, а в логе спамит, что обрабатывает чанки (тысячи их).
     
  12. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Вот именно поэтому лучше писать генератор. И выхлоп в лог лучше выводить ежесекундно - вывод в консоль занимает слишком много времени.
     
  13. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Покажи мне на коротком примере, как выглядит готовый генератор. И я буду писать генератор.

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

    Оно было очень длинным. А консоль выглядела так:
    [​IMG]
    Почему-то он обрабатывает чанки наискосок и очень далеко от игрока и не останавливается. А по задумке должен был обрабатывать все вновь генерируемые чанки. Или я неправильно понимаю, что означат ChunkPopulateEvent? (я пробовал ChunkPopulateEvent и ChunkLoadEvent)
     
    Last edited: Oct 7, 2015
  14. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    http://bukkit.org/threads/93982/
    ChunkPopulateEvent использовать лучше для обработки. Вот только надо просто брать один чанк из эвента и работать с ним. Да и лучше этим заниматься на пустой мир.
     
  15. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Спасибо, почитаю.
    Так я и создавал новый мир. И ад после каждой перезагрузки сервера удалял.
     
  16. Reality_SC

    Reality_SC Старожил Пользователь

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Почему бы не заюзать для конкретного мира Ада TerrainControl? Там есть такая "галочка", слой админиума сверху (eg.), убирается легко. За-wb fill-ить его нужного размера, унеси плагин в закрома.
     
  17. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Алло, я в треде спрашивал как генератор написать.[DOUBLEPOST=1444578853,1444569792][/DOUBLEPOST] 2015-10-11_22.49.32.png

    Весело это. Правда, рандом любит гнать. эх.
     
  18. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Выглядит забавно. А код?
     
  19. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Ужасен.
    http://pastebin.com/6cDQGiPG. Паста будет жить месяц.
     
  20. LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Но довольно-таки скрупулезен. Тебе бы подошел ник TowerlessBee. :good:

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

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

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

    В любом случае, этот ужасный код лучше, чем мои портянки.
     
  21. Автор темы
    Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Сочту за комплимент.
    Нет. Популяторы используются для декорирования уже сгенерированного чанка. Т.е. тебе нужно сгенерировать чанк, чтобы использовать его.
    Во-первых, это короче. Во-вторых, сам API их использует.
    Это что то вроде фильтрации, чтобы башня на располагалась на ветвях дерева.
    К сожалению да. Но в моём мире такие деревья появляются с шансом 0.
    Я не хочу слушать этот эвент. Тем более, нужно хранить координаты башни где ниб, или же искать их по Entity EnderCrystal. В конце концов, и без зомбей со скелетами данная башня представляет опасность в виде блоков с чешуйницами.
     

Share This Page