Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
Можно ссылку на актуальный тутор., либо кусочек кода, для генерации небольших структур (деревьев, валунов) и отдельных блоков (ягодных кустов) в мире. Возможно ли добавлять подобное не отдельными циклами, а добавив правила в ванильный генератор?
Можно и ванильный генератор изменить, конечно, но это задача на порядок сложнее. Придется либо ядро патчить, либо использовать asm/миксины.
Сам алгоритм генерации достаточно просто и самому воспроизвести просто "в лоб". При желании можно даже заранее нагенерить "шематиков" и расставлять по миру. Ну, либо же грузить их как структуры, но сам так делать не пробовал
Можно и ванильный генератор изменить, конечно, но это задача на порядок сложнее. Придется либо ядро патчить, либо использовать asm/миксины.
Сам алгоритм генерации достаточно просто и самому воспроизвести просто "в лоб". При желании можно даже заранее нагенерить "шематиков" и расставлять по миру. Ну, либо же грузить их как структуры, но сам так делать не пробовал
Хм.. ну допустим) А как к примеру сгенерировать факел в пещере? Заменить блок воздуха под которым имеется камень? Но в таком случае он будет генерировать и на скалах, а если ставить проверку на высоту, то бывают шахты и на 100+ координатах)
Хм.. ну допустим) А как к примеру сгенерировать факел в пещере? Заменить блок воздуха под которым имеется камень? Но в таком случае он будет генерировать и на скалах, а если ставить проверку на высоту, то бывают шахты и на 100+ координатах)
Получить Y-координату высочайшего блока в столбе X;Z и сравнить с высотой блока камня. Если камень ниже верхней точки мира, то это шахта, в ином случае это поверхность земли (скала).
Но, естественно, при таком подходе решения своих задач ты рано или поздно упрёшься в сложность реализации или производительность. Если это произойдёт, то останется только модифицировать ванильный генератор. Выше расписал, как это можно реализовать
Получить Y-координату высочайшего блока в столбе X;Z и сравнить с высотой блока камня. Если камень ниже верхней точки мира, то это шахта, в ином случае это поверхность земли (скала).
Но, естественно, при таком подходе решения своих задач ты рано или поздно упрёшься в сложность реализации или производительность. Если это произойдёт, то останется только модифицировать ванильный генератор. Выше расписал, как это можно реализовать
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 с кастомным. Скорее всего, один просто заменит другой.
В любом случае, тебе ничего не мешает читать доки и экспериментировать.
Возможно я ошибаюсь по поводу ChunkGenerator. Изучай вопрос.
А по поводу ошибки - похоже, что на момент вызова события чанк ещё не загружен, и попытка установить в нём блок приводит к новой загрузке чанка. Как это решать по-человечески - не знаю. Теоретически можно использовать шедулер с задержкой в один тик, на как будет по производительности - вопрос интересный
Возможно я ошибаюсь по поводу ChunkGenerator. Изучай вопрос.
А по поводу ошибки - похоже, что на момент вызова события чанк ещё не загружен, и попытка установить в нём блок приводит к новой загрузке чанка. Как это решать по-человечески - не знаю. Теоретически можно использовать шедулер с задержкой в один тик, на как будет по производительности - вопрос интересный
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!