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

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

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

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
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх