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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Dereku, 6 окт 2015.

  1. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Это он.

    Непонятно.

    Понятно.

    Согласен, это - геморрой. Как-то мне понадобилось метить чанки - так я замуровывал в админиуме в первом слое сундук, в него клал книгу, а в нее писал нужную мне информацию о чанке. Это было занятно. И дебильно.[DOUBLEPOST=1444639877,1444639421][/DOUBLEPOST]
    Между прочим, решил попробовать. Два часа потратил. Я манал этот плагин. После генерации по инструкции дефолтных конфигов он мне выдал верхний мир в виде безбрежного океана. Пролетев с полкилометра, наткнулся на замерзший океан. Ковырнул вниз - руды вроде хоть на месте. Однако сгенерировавшийся по моему старому сиду мир совсем не похож на мой старый мир. Там явно был не безбрежный океан.
    А что касается ада без верхнего слоя админиума, сколько ни штудировал конфиги, так и не нашел, где он там "убирается легко". Я даже не понял, как мне настроить отдельно генерацию карты ада - вроде как там есть WorldConfig.ini только для верхнего мира. Папок других миров так и не появилось.
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    http://pastebin.com/gGa3Rjn8
    Ну вот тебе генератор ада, что использую я. Разумеется, без основного класса. Паста снова живёт лишь месяц.
    Прокомментировал кое что для ясности. Популятор башенки немного редактируешь, и ставишь в популяторы этому генератору.
     
  4. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Спасибо большое. Скопировал код, только не понимаю, как им воспользоваться.
     
  5. Автор темы
    Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Создаёшь main класс плагина, в него
    Код:
        @Override
        public ChunkGenerator getDefaultWorldGenerator(String worldName, String genId) {
            return new NetherChunkGenerator(genId);
        }
    И плагин в load: STARTUP .
    После в bukkit.yml добавляешь генератор мира.
    http://wiki.bukkit.org/Bukkit.yml#.2AOPTIONAL.2A_worlds
     
  6. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Только хотел в очередной раз написать, что у меня ни хрена не получается это запустить, как у меня, наконец, получилось!

    Круто, правда. Вот:

    [​IMG]
    Снизу, как и обещано <производителем>, слой админиума, а сверху - открытое небо.

    Просмотрел код, но так и не понял, каким образом генератор привязывается к биому Hell?

    Продолжаешь ли ты исследования в этом направлении? В этом аду нет крепостей, сгустков светокамня, вкраплений кварцевой руды и почему-то спавнятся все адские существа, кроме гастов. И если светокамень и руду можно распылить рандомно среди адского камня (хотя смотреться будет некрасиво, наверное), то что делать с гастами и крепостями?[DOUBLEPOST=1444648744,1444647972][/DOUBLEPOST]Добавил 10% кварцевой руды:

    [​IMG][DOUBLEPOST=1444649729][/DOUBLEPOST]Судя по тому, что написано в вики, гасты спавнятся на твердых площадках, минимум 5х5. Надо настроить генератор шума так, чтобы эти "островки" были большего размера и пологости.[DOUBLEPOST=1444649863][/DOUBLEPOST]Кварцевую руду нужно спавнить скоплениями, как в оригинале. Думаю, тут есть смысл сделать блок, проверяющий наличие по соседству от целевого блока уже сгенерированной кварцевой руды. Но в имеющийся код внести эту процедуру для меня затруднительно, так как я привык работать с абсолютными координатами, а не с внутричанковыми.
     
  7. Автор темы
    Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    https://github.com/adventurerok/WGenUtils . Конечно, там не через баккитовские популяторы, но портировать можно спокойно.
    Никак. Генератор просто ставит блоки. Сервер уже ставит биомы.
    Всё это делается популяторами.
    Туфта. Гасты спокойно спаунятся и в таком мире.

    Кстати, я таки родил идею с данжами в аду. Конечно, игроки буду против, типа фарм, все дела, но портировать нотчевские крепости я офигею.
     
  8. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Но генератор этот влияет на все миры или только на ад?

    Я не знаю, что это такое.

    За 15 минут ни один не заспавнился.

    А нельзя заставить родной и самопальный генератор как-то сообща работать?
     
  9. Автор темы
    Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Генератор может ставить блоки в любом биоме. Даже не так, генератору плевать, какой биом на данном чанке, если написавший биом не уточняет, что за биом на данном чанке. Проще говоря, на какой мир ты поставишь генератор, в том мире он и будет работать.
    Чуть раньше я тебе кидал пасту с CrystalTowerPopulator. Вот это он и есть.
    Жаль.
    Адовыми костылями с велосипедами если только. И вызывать из NMS, что создаёт ещё неудобства.
     
  10. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Начал знакомиться с модами. Сегодня дошёл до генераторов. Чтобы добавить в мир свои руды, нагуглил схему генератора и сделал. Мне показалось, что модом генератор пишется как-то проще, что ли. Кстати, вообще моды писать мне понравилось больше, чем плагины. Несмотря на то, что мои разработки - детские шалости, я реально ощутил степень свободы, которой у плагинописцев нет (и не будет, наверное).

    Получилось так (не судите за синтаксис - мне так нагляднее - и за китайский код - я по-другому не умею):
    Код:
    public class OreGenerator implements IWorldGenerator {
    
        private int x = 0, y = 0, z = 0;
    
        @Override
        public void generate(Random rnd, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
            String biome = world.getBiomeGenForCoords(chunkX, chunkZ).biomeName.toLowerCase(); // biome name
            List<Block> denied = new ArrayList<Block>();
            denied.add(Blocks.diamond_ore);
            denied.add(Blocks.emerald_ore);
            denied.add(Blocks.gold_ore);
            denied.add(Blocks.iron_ore);
            denied.add(Blocks.lapis_ore);
            denied.add(Blocks.lava);
            denied.add(Blocks.water);
            denied.add(Blocks.air);
            denied.add(Blocks.end_portal_frame);
            denied.add(Blocks.chest);
    
            // biomes: -Ocean -Plains -Desert -Extreme Hills -Forest -Taiga -Swampland -River -Hell -Sky -FrozenOcean -FrozenRiver -Jungle -JungleHills
            // -Ice Plains -Ice Mountains -MushroomIsland -MushroomIslandShore -Beach -DesertHills -ForestHills -TaigaHills -Extreme Hills -Edge
            Block[] ores = {ModBlocks.silverOre, ModBlocks.rubyOre, ModBlocks.malachiteOre, ModBlocks.copperOre, ModBlocks.prismarineOre, ModBlocks.saltOre};
            int[] spawnchance = {     50,                  45,                60,                     70,                  60,                      85}; // spawn chance, %
            int[] maxamount = {       12,                   5,                 8,                     12,                  12,                      18}; // max amount in place
            int[] min = {             10,                   6,                12,                     10,                   6,                      36}; // minimum altitude
            int[] max = {             30,                  16,                24,                     30,                  24,                      58}; // maximum altitude
      
            for(int i = 0; i < 6; i++){// generation cycle-------------------- i = ore
      
                if(biome.equalsIgnoreCase("hell")){continue;}                                      // no ores in hell
                if(rnd.nextInt(100) > spawnchance[i]){continue;}                                   // to spawn or not to spawn?
                x = coord(rnd, chunkX); y = alt(rnd, min[i], max[i]); z = coord(rnd, chunkZ);      // gets coordinates of the center of ore spawn
          
                int amount = (rnd.nextInt(maxamount[i]) + 1) * 2;                                            // generating amount
                // placing ores -------------
                int j = 0;
                for (int addY = 0; addY < 3; addY++){
                    for (int addZ = 0; addZ < 3; addZ++){
                        for (int addX = 0; addX < 3; addX++){
                            int divider = rnd.nextInt(100);
                            if(!denied.contains(world.getBlock(x+addX, y+addY, z+addZ))){
                                if(divider <= 50){world.setBlock(x+addX, y+addY, z+addZ, ores[i], 0, 0); j++;}
                                }
                            if(j >= amount){break;}
                        }
                        if(j >= amount){break;}
                    }
                    if(j >= amount){break;}
                }
                // placing ores --------------
            }// generation cycle --------------------
        }
        // getting random coordinates
        private int coord(Random random, int chunk){
            return chunk*16 + random.nextInt(16);
        }
    
        // getting random altitude
        private int alt(Random random, int minimumAltitude, int maximumAltitude){
            return minimumAltitude + random.nextInt(maximumAltitude - minimumAltitude);
        }
    }
    
    Этот код работает без прописывания во всякие server.properties и прочие *.yml - совместно с родным генератором.

    Результат (камни, земля, вода, лава удалены WorldEdit'ом):
    [​IMG]
    Еще ракурс (на переднем плане пресловутая рубиновая руда, хе-хе):
    [​IMG]
    Доволен. Сейчас думаю о структурах.
     
    Последнее редактирование: 1 ноя 2015
  11. Agravaine

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

    Баллы:
    88
    Имя в Minecraft:
    Agravaine25
    Вместо твоего велосипеда нужно использовать WorldGenMinable.
     
  12. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Согласен. Но так тоже работает.
     

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