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