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

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

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

?

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

  1. Да

    81,1%
  2. Нет

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

    16,7%
  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. Хостинг MineCraft
    <
  3. DmitriyMX

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    88
    Skype:
    Baksovic2
    Имя в Minecraft:
    Baksovic
    Хочу поднять очень древнюю тему)
    Автор темы.
    Пожалуйста продолжи туториал по данной теме)
    Я буду очень признателен[DOUBLEPOST=1434286053,1434285052][/DOUBLEPOST]В генерации чанков у меня грубо говоря 0 опыт.
    Помогите кто-то сделать генерацию чанков которая будет создавать мир в воде и острова
     
  12. chief

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

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

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

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

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

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

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

    Баллы:
    88
    Skype:
    Baksovic2
    Имя в Minecraft:
    Baksovic
    Спасибо)
    Жду)
     

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