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

Помогите Генерация блоков

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

Статус темы:
Закрыта.
  1. Автор темы
    ekbasiaa

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

    Баллы:
    66
    Можно ссылку на актуальный тутор., либо кусочек кода, для генерации небольших структур (деревьев, валунов) и отдельных блоков (ягодных кустов) в мире. Возможно ли добавлять подобное не отдельными циклами, а добавив правила в ванильный генератор?
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Можно делать это в ChunkLoadEvent.

    Можно и ванильный генератор изменить, конечно, но это задача на порядок сложнее. Придется либо ядро патчить, либо использовать asm/миксины.

    Сам алгоритм генерации достаточно просто и самому воспроизвести просто "в лоб". При желании можно даже заранее нагенерить "шематиков" и расставлять по миру. Ну, либо же грузить их как структуры, но сам так делать не пробовал
     
  3. Автор темы
    ekbasiaa

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

    Баллы:
    66
    Хм.. ну допустим) А как к примеру сгенерировать факел в пещере? Заменить блок воздуха под которым имеется камень? Но в таком случае он будет генерировать и на скалах, а если ставить проверку на высоту, то бывают шахты и на 100+ координатах)
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Получить Y-координату высочайшего блока в столбе X;Z и сравнить с высотой блока камня. Если камень ниже верхней точки мира, то это шахта, в ином случае это поверхность земли (скала).

    Но, естественно, при таком подходе решения своих задач ты рано или поздно упрёшься в сложность реализации или производительность. Если это произойдёт, то останется только модифицировать ванильный генератор. Выше расписал, как это можно реализовать
     
  5. Автор темы
    ekbasiaa

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

    Баллы:
    66
    Производительность навряд ли (карта все равно заранее погружается), а со вторым возможно, но пока мне только 2 блока необходимы) Еще раз спасибо.
     
  6. Автор темы
    ekbasiaa

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

    Баллы:
    66
    Кхе. Вернулся к генерации и написал вот ето:
    Код:
    World world = event.getWorld();
    
    Chunk chunk = event.getChunk();
    int blockX = chunk.getX() << 4;
    int blockZ = chunk.getZ() << 4;
    
    for (int x = blockX; x < blockX + 16; x++) {
        for (int z = blockZ; z < blockZ + 16; z++) {
            Bukkit.broadcastMessage("Checking chunk at: " + x + ", " + z);
            Block highestBlock = world.getHighestBlockAt(x, z);
    
            if (highestBlock.getType() == Material.GRASS_BLOCK) {
                Block block = highestBlock.getRelative(x, highestBlock.getY(), z);
                block.setType(Material.STONE);
            }
        }
    }
    Возможно я что-то делаю не так, но глянул похожий код и у людей вроде как работает, а у меня проста крашит сервер после секунд 20, а до этого висит в ступоре... Что не так?)
    + У крана нашел класс ChunkGenerator (те самые правила генерации) с методами генерации шумов, может предпочтительнее юзать его? Если да, то можно код генерации рандомных кустов по миру, а то примеров не особо много, а сам разобраться так и не смог)
     
  7. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    При зависании сервера должно выводить стек вызовов потоков. По нему будет понятно, что и почему у тебя зацикливается или долго выполняется. Визуально проблему в коде не вижу.

    По поводу ChunkGenerator'а - это предназначено для реализации собственных генераторов. Я сомневаюсь, что есть возможность объединить ванильный ChunkGenerator с кастомным. Скорее всего, один просто заменит другой.
    В любом случае, тебе ничего не мешает читать доки и экспериментировать.

    По поводу примеров генерации тебе надо либо смотреть исходники опенсорсных кастомных генераторов, либо читать теорию про генератор ванильного мира игры, либо вообще читать теорию про шумы и прочие аспекты без привязки конкретно к майну. А лучше и первое, и второе, и третье. Тема сложная и требует глубокого и сосредоточенного изучения
     
  8. Автор темы
    ekbasiaa

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

    Баллы:
    66
    Так он и структуры расставляет, а структуры это практически самый последний этап генерации (я к тому что у меня примерно похожее необходимо реализовать)) + Там не объединение, а модификация, не?
    https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/generator/ChunkGenerator.ChunkData.html

    А на счет ошибки, то вот файлик лога:
    https://drive.google.com/file/d/1Spp3VN1z5lfkX4x0lMdeSQfJyyKntX-C/view?usp=sharing
     
  9. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Возможно я ошибаюсь по поводу ChunkGenerator. Изучай вопрос.
    А по поводу ошибки - похоже, что на момент вызова события чанк ещё не загружен, и попытка установить в нём блок приводит к новой загрузке чанка. Как это решать по-человечески - не знаю. Теоретически можно использовать шедулер с задержкой в один тик, на как будет по производительности - вопрос интересный
     
  10. Автор темы
    ekbasiaa

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

    Баллы:
    66
    Да уж.. кажеца начинаю понимать, почему так мало уникальных серверов)) Пошел гуглить
    Upd: Вопрос решен. Все что нужно:
    https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/generator/package-summary.html
     
    Последнее редактирование: 14 ноя 2022
Статус темы:
Закрыта.

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