Войти или зарегистрироваться

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

  • Автор темы Автор темы Dereku
  • Дата начала Дата начала
Сочту за комплимент.
Это он.

Т.е. тебе нужно сгенерировать чанк, чтобы использовать его.
Непонятно.

сам API их использует
Понятно.

нужно хранить координаты башни где ниб, или же искать их по Entity EnderCrystal
Согласен, это - геморрой. Как-то мне понадобилось метить чанки - так я замуровывал в админиуме в первом слое сундук, в него клал книгу, а в нее писал нужную мне информацию о чанке. Это было занятно. И дебильно.
Почему бы не заюзать для конкретного мира Ада TerrainControl? Там есть такая "галочка", слой админиума сверху (eg.), убирается легко. За-wb fill-ить его нужного размера, унеси плагин в закрома.
Между прочим, решил попробовать. Два часа потратил. Я манал этот плагин. После генерации по инструкции дефолтных конфигов он мне выдал верхний мир в виде безбрежного океана. Пролетев с полкилометра, наткнулся на замерзший океан. Ковырнул вниз - руды вроде хоть на месте. Однако сгенерировавшийся по моему старому сиду мир совсем не похож на мой старый мир. Там явно был не безбрежный океан.
А что касается ада без верхнего слоя админиума, сколько ни штудировал конфиги, так и не нашел, где он там "убирается легко". Я даже не понял, как мне настроить отдельно генерацию карты ада - вроде как там есть WorldConfig.ini только для верхнего мира. Папок других миров так и не появилось.
 
http://pastebin.com/gGa3Rjn8
Ну вот тебе генератор ада, что использую я. Разумеется, без основного класса. Паста снова живёт лишь месяц.
Прокомментировал кое что для ясности. Популятор башенки немного редактируешь, и ставишь в популяторы этому генератору.
 
Спасибо большое. Скопировал код, только не понимаю, как им воспользоваться.
Создаёшь main класс плагина, в него
Java:
    @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
 
Только хотел в очередной раз написать, что у меня ни хрена не получается это запустить, как у меня, наконец, получилось!

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

5B12PyStjJ.png

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

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

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

CaE2gDkNfs.png

Судя по тому, что написано в вики, гасты спавнятся на твердых площадках, минимум 5х5. Надо настроить генератор шума так, чтобы эти "островки" были большего размера и пологости.
Кварцевую руду нужно спавнить скоплениями, как в оригинале. Думаю, тут есть смысл сделать блок, проверяющий наличие по соседству от целевого блока уже сгенерированной кварцевой руды. Но в имеющийся код внести эту процедуру для меня затруднительно, так как я привык работать с абсолютными координатами, а не с внутричанковыми.
 
Кварцевую руду нужно спавнить скоплениями, как в оригинале. Думаю, тут есть смысл сделать блок, проверяющий наличие по соседству от целевого блока уже сгенерированной кварцевой руды. Но в имеющийся код внести эту процедуру для меня затруднительно, так как я привык работать с абсолютными координатами, а не с внутричанковыми.
https://github.com/adventurerok/WGenUtils . Конечно, там не через баккитовские популяторы, но портировать можно спокойно.
Просмотрел код, но так и не понял, каким образом генератор привязывается к биому Hell?
Никак. Генератор просто ставит блоки. Сервер уже ставит биомы.
Продолжаешь ли ты исследования в этом направлении? В этом аду нет крепостей, сгустков светокамня, вкраплений кварцевой руды и почему-то спавнятся все адские существа, кроме гастов. И если светокамень и руду можно распылить рандомно среди адского камня (хотя смотреться будет некрасиво, наверное), то что делать с гастами и крепостями?
Всё это делается популяторами.
Судя по тому, что написано в вики, гасты спавнятся на твердых площадках, минимум 5х5.
Туфта. Гасты спокойно спаунятся и в таком мире.

Кстати, я таки родил идею с данжами в аду. Конечно, игроки буду против, типа фарм, все дела, но портировать нотчевские крепости я офигею.
 
Генератор просто ставит блоки. Сервер уже ставит биомы.
Но генератор этот влияет на все миры или только на ад?

Всё это делается популяторами.
Я не знаю, что это такое.

Гасты спокойно спаунятся и в таком мире.
За 15 минут ни один не заспавнился.

портировать нотчевские крепости я офигею
А нельзя заставить родной и самопальный генератор как-то сообща работать?
 
Но генератор этот влияет на все миры или только на ад?
Генератор может ставить блоки в любом биоме. Даже не так, генератору плевать, какой биом на данном чанке, если написавший биом не уточняет, что за биом на данном чанке. Проще говоря, на какой мир ты поставишь генератор, в том мире он и будет работать.
Я не знаю, что это такое.
Чуть раньше я тебе кидал пасту с CrystalTowerPopulator. Вот это он и есть.
За 15 минут ни один не заспавнился.
Жаль.
А нельзя заставить родной и самопальный генератор как-то сообща работать?
Адовыми костылями с велосипедами если только. И вызывать из NMS, что создаёт ещё неудобства.
 
Начал знакомиться с модами. Сегодня дошёл до генераторов. Чтобы добавить в мир свои руды, нагуглил схему генератора и сделал. Мне показалось, что модом генератор пишется как-то проще, что ли. Кстати, вообще моды писать мне понравилось больше, чем плагины. Несмотря на то, что мои разработки - детские шалости, я реально ощутил степень свободы, которой у плагинописцев нет (и не будет, наверное).

Получилось так (не судите за синтаксис - мне так нагляднее - и за китайский код - я по-другому не умею):
Java:
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'ом):
wMq8Y9QNFa.png
Еще ракурс (на переднем плане пресловутая рубиновая руда, хе-хе):
HfiSNxROhH.png
Доволен. Сейчас думаю о структурах.
 
Последнее редактирование:
Вместо твоего велосипеда нужно использовать WorldGenMinable.
 
Назад
Верх