1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Туториал [Урок]Пишем простой генератор мира

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем Ission, 19 июл 2012.

?

Имеет ли мне смысл писать ещё туториалы?

  1. Да

    80,6%
  2. Нет

    2,0%
  3. Я олень, пойду поем сосну.

    17,3%
  1. Автор темы
    Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Данный урок предназначен для тех, кто уже умеет создавать плагины.
    Для началы мы должны создать заготовку под плагин.
    Далее в главном классе нашего плагина мы должны реализовать такой метод главного класса(extends JavaPlugin):
    Код:
        public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
        {
            return new testGenerator(id);
        }
    В этот метод при вызове генератора передаются 2 параметра: название мира и параметры вызова генератора в виде строк.
    Название генератора = названию плагина, параметры передаются в генератор так: название_плагина_генератора:параметры_генератора.
    Теперь мы должны реализовать класс генератора в котором собственно и будет происходить чудо-чудное, диво-дивное.
    Код:
    public class testGenerator extends ChunkGenerator
    {
        private final string data;
        testGenerator(Strind s)
        {
            this.data = s;
        }
    }
    Класс реализован, теперь мы можем перейти к переопределению некоторых методов, позиции спавна:
    Код:
        @Override
        public Location getFixedSpawnLocation(World world, Random random)
        {
            return new Location(world, 0, world.getHighestBlockYAt(0, 0), 0);
        }
    Сюда предаётся генерируемый мир и элемент класса типа Random, с уже установленным seed'ом.
    А теперь перейдём непосредственно к генерации:
    Код:
        @Override
        public byte[][] generateBlockSections (World world, Random random, int Chunkx, int Chunkz, BiomeGrid biomes)
    Данный метод принимает мир, элемент класса Random, с уже установленным seed'ом, позицию чанка по x и по z(будьте внимательны: координаты в мире(x,z), не равны координатам чанков, т.е. координата x=20, z=-17 будет равна Chunkx=1, Chunkz=-1) и сетку биомов.
    Сетка биомов - поле 16*16 с координатами от 0 до 15 по x и z. Задать в сетке тот или иной биом мы можем вызвав метод сетки setBiome(x, z, Biome.TAIGA), где x и z соответственно координаты внутри сетки, а Biome.TAIGA - тип биома.
    Данный метод возвращает сгенерированный чанк в виде 3-х мерной, сигментированной, байт-сетки.
    Давайте определим её:
    Код:
    byte[][] chunk = new byte[world.getMaxHeight() / 16][4096];
    Мы создали прообраз чанка - некоторое количество кубических сегментов 16*16*16, определённого максимальной высотой генерируемого мира.
    Теперь, чтобы нам было удобнее работать с блоками, давайте напишем такую процедуру:
    Код:
        private void setBlock(byte[][] result, int x, int y, int z, int id)
        {
            if (result[y >> 4] == null)
                result[y >> 4] = new byte[4096];//на тот случай, если сегмент не определён
            if(y>=0)
                result[y >> 4][(y & 15) << 8 | (Math.abs(z & 15)) << 4 | (Math.abs(x & 15))] = (byte) (id & 255);
        }
    В неё мы передаём нашу сетку, координаты блока (x,y,z) и id, который мы хотим установить(Например: setBlock(chunk, 8, 128, 8, 1); для установки блока камня в координатах 8,128,8(x,y,z)).
    Допишем в функцию generateBlockSections, после определения сетки, любой алгоритм генерирования, например вывод функции синуса, после этого нужно вернуть из функции готовый чанк:
    Код:
    return chunk;
    Наш генератор готов!
     
    Gentalion, Hephest, Xakep_SDK и 6 другим нравится это.
  2. DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    Вопрос: этот мир будет как "дополнительный" или как замена основного?
     
  3. Автор темы
    Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Это генератор, а не создание мира. Генератор вызывается при создании мира другими плагинами(MultiVerse вроде) или в файле bukkit.yml(worlds: world: generator: название_генератора:параметры, сохраняя синтаксис YAML).
     
  4. DmitriyMX

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

    Баллы:
    153
    Skype:
    dmn550
    ясно, не правильно понял статью
     
  5. SeoLive

    SeoLive Активный участник

    Баллы:
    68
    Имя в Minecraft:
    SeoLive
    Спасибо за гайд!
     
  6. Сирина

    Сирина Активный участник

    Баллы:
    63
    Имя в Minecraft:
    lina
    а какой стандартный генератор у сервера???
     
    I-Am-Black-Overlord нравится это.
  7. Автор темы
    Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Декомпилируй - узнаешь.
     
  8. Nightfear

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

    Баллы:
    103
    Имя в Minecraft:
    nightfear
    этот гениратор позволит понизить/повысить кол-во ресурсов в мире ( под землей)?
     
  9. Alexey123

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

    Баллы:
    153
    Это просто генератор мира без самой генерации блоков. Если напишешь нужный алгоритм генерации - пожалуйста.
     
  10. blood7564

    blood7564 Активный участник

    Баллы:
    88
    Skype:
    kybikr
    Имя в Minecraft:
    Jyree
    для генера всей карты...
     
  11. baksovic111

    baksovic111 Активный участник Пользователь

    Баллы:
    88
    Хочу поднять очень древнюю тему)
    Автор темы.
    Пожалуйста продолжи туториал по данной теме)
    Я буду очень признателен
    В генерации чанков у меня грубо говоря 0 опыт.
    Помогите кто-то сделать генерацию чанков которая будет создавать мир в воде и острова
     
  12. chief

    chief Активный участник Пользователь

    Баллы:
    76
    TerrainControl :good:
     
  13. baksovic111

    baksovic111 Активный участник Пользователь

    Баллы:
    88
    Хочется научиться делать свой велосипед)
     
  14. Автор темы
    Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Хорошо, как будут наработки более практического значения -- выпущу ещё одну часть.
     
  15. baksovic111

    baksovic111 Активный участник Пользователь

    Баллы:
    88
    Спасибо)
    Жду)
     
  16. TheFatCat

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

    Баллы:
    31
    Имя в Minecraft:
    TheFaatCat
    Дождался? Ахахаха
     
  17. Автор темы
    Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Наработки появились 2 недели назад. Может быть уже поздно публиковать?
     
  18. baksovic111

    baksovic111 Активный участник Пользователь

    Баллы:
    88
    Плагин уже давно не нужен)
    За 2 года столько своих плагинов написать успел, что пцц)
    Хотя плагинов с генерацией так и не делал)))
     
  19. Автор темы
    Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Генерация мира -- это алгоритмы и математика, а не логика и взаимодействия, тут другая специфика. Возможно на первый взгляд кажется что это просто, но как дело доходит до реализации, всё становится сложнее.
     
  20. baksovic111

    baksovic111 Активный участник Пользователь

    Баллы:
    88
    Да там сложнее по этому я побоялся браться за это.
    Как бы тут сказывается то что я не учился в колледже.
    Не стесняюсь это говорить.
    Хотя если сильно захотеть, не проблема и это сделать. Просто надобности небыло
     

Поделиться этой страницей