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

Статус
Закрыто для дальнейших ответов.

ekbasiaa

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

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

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

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

Сам алгоритм генерации достаточно просто и самому воспроизвести просто "в лоб". При желании можно даже заранее нагенерить "шематиков" и расставлять по миру. Ну, либо же грузить их как структуры, но сам так делать не пробовал
Хм.. ну допустим) А как к примеру сгенерировать факел в пещере? Заменить блок воздуха под которым имеется камень? Но в таком случае он будет генерировать и на скалах, а если ставить проверку на высоту, то бывают шахты и на 100+ координатах)
 
Хм.. ну допустим) А как к примеру сгенерировать факел в пещере? Заменить блок воздуха под которым имеется камень? Но в таком случае он будет генерировать и на скалах, а если ставить проверку на высоту, то бывают шахты и на 100+ координатах)
Получить Y-координату высочайшего блока в столбе X;Z и сравнить с высотой блока камня. Если камень ниже верхней точки мира, то это шахта, в ином случае это поверхность земли (скала).

Но, естественно, при таком подходе решения своих задач ты рано или поздно упрёшься в сложность реализации или производительность. Если это произойдёт, то останется только модифицировать ванильный генератор. Выше расписал, как это можно реализовать
 
Получить Y-координату высочайшего блока в столбе X;Z и сравнить с высотой блока камня. Если камень ниже верхней точки мира, то это шахта, в ином случае это поверхность земли (скала).

Но, естественно, при таком подходе решения своих задач ты рано или поздно упрёшься в сложность реализации или производительность. Если это произойдёт, то останется только модифицировать ванильный генератор. Выше расписал, как это можно реализовать
Производительность навряд ли (карта все равно заранее погружается), а со вторым возможно, но пока мне только 2 блока необходимы) Еще раз спасибо.
 
Кхе. Вернулся к генерации и написал вот ето:
Код:
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 (те самые правила генерации) с методами генерации шумов, может предпочтительнее юзать его? Если да, то можно код генерации рандомных кустов по миру, а то примеров не особо много, а сам разобраться так и не смог)
 
Кхе. Вернулся к генерации и написал вот ето:
Код:
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 (те самые правила генерации) с методами генерации шумов, может предпочтительнее юзать его? Если да, то можно код генерации рандомных кустов по миру, а то примеров не особо много, а сам разобраться так и не смог)
При зависании сервера должно выводить стек вызовов потоков. По нему будет понятно, что и почему у тебя зацикливается или долго выполняется. Визуально проблему в коде не вижу.

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

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

А на счет ошибки, то вот файлик лога:
https://drive.google.com/file/d/1Spp3VN1z5lfkX4x0lMdeSQfJyyKntX-C/view?usp=sharing
 
Так он и структуры расставляет, а структуры это практически самый последний этап генерации (я к тому что у меня примерно похожее необходимо реализовать)) + Там не объединение, а модификация, не?
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/generator/ChunkGenerator.ChunkData.html

А на счет ошибки, то вот файлик лога:
https://drive.google.com/file/d/1Spp3VN1z5lfkX4x0lMdeSQfJyyKntX-C/view?usp=sharing
Возможно я ошибаюсь по поводу ChunkGenerator. Изучай вопрос.
А по поводу ошибки - похоже, что на момент вызова события чанк ещё не загружен, и попытка установить в нём блок приводит к новой загрузке чанка. Как это решать по-человечески - не знаю. Теоретически можно использовать шедулер с задержкой в один тик, на как будет по производительности - вопрос интересный
 
Возможно я ошибаюсь по поводу ChunkGenerator. Изучай вопрос.
А по поводу ошибки - похоже, что на момент вызова события чанк ещё не загружен, и попытка установить в нём блок приводит к новой загрузке чанка. Как это решать по-человечески - не знаю. Теоретически можно использовать шедулер с задержкой в один тик, на как будет по производительности - вопрос интересный
Да уж.. кажеца начинаю понимать, почему так мало уникальных серверов)) Пошел гуглить
Upd: Вопрос решен. Все что нужно:
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/generator/package-summary.html
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх