Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Где получить стандартные генераторы мира?

Метки:
Теги Теги
bukkit chunkgenerator world

aloyen

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
aloyen
Всех приветствую.

Как известно, в игре есть три измерения: Верхнее, Нижнее и Энд.
И тут у меня возник вопрос: как из этих самых измерений вытащить ChunkGenerator? Именно стандартный генератор измерения, а не какой-то там изменённый.

Версия: Bukkit 1.16.5
 
Где-то в дебрях NMS, очевидно. На 1.16.5 есть крайне удобный ремаппер, с которым можно легко работать с маджонговским кодом.
 
Для чего генераторы? Какая конечная задача?
Создать мир нужного типа можно просто указав Environment в параметрах генератора.

И на всякий случай уточни, что за ядро
 
Для чего генераторы? Какая конечная задача?
Создать мир нужного типа можно просто указав Environment в параметрах генератора.

И на всякий случай уточни, что за ядро
Ну, мне конкретно надо унаследоваться от класса генератора, переписать BlockPopulator и плюсом надо расширить этот класс.

Ядро Magma. Но от Bukkit оно мало чем отличается (проверял по исходникам).
 
Итак, я узнал где генератор мира находится.
Его можно получить так:
Код:
DimensionGeneratorSettings dimensiongeneratorsettings = MinecraftServer.getServerInstance().getWorldData().worldGenSettings();
SimpleRegistry<Dimension> simpleregistry = dimensiongeneratorsettings.dimensions();
Dimension dimension = simpleregistry.get(Dimension.OVERWORLD);
net.minecraft.world.gen.ChunkGenerator gen = dimension.generator();

Но на выходе получается net.minecraft.world.gen.ChunkGenerator, а не org.bukkit.generator.ChunkGenerator.
Закастовать их невозможно.
Как можно превратить NMS-генератор в Bukkit-генератор?
 
Как можно превратить NMS-генератор в Bukkit-генератор?
Никак, только в обратную сторону, причем только для конкретного мира при создании:
PHP:
net.minecraft.server.level.ServerLevel level = ((CraftWorld) bukkitWorld).getHandle();
org.bukkit.generator.ChunkGenerator bukkitGen = ...;
net.minecraft.world.level.chunk.ChunkGenerator delegate = ...; // Получить можно из типа мира так, как ты и писал выше
net.minecraft.world.level.chunk.ChunkGenerator nmsGen = new org.bukkit.craftbukkit.v1_20_R1.generator.CustomChunkGenerator(level, delegate, bukkitGen);

Ну, мне конкретно надо унаследоваться от класса генератора, переписать BlockPopulator и плюсом надо расширить этот класс.
Если ты хочешь переписать логику ванильного генератора, то, скорее всего, придётся наследоваться уже от NMS-генератора, а не от баккитовского. И создавать мир при помощи этого самого NMS/рефлексии/ASM и прочих танцев с бубном.

Либо же действовать иначе, и просто модифицировать чанк используя ChunkGenerationEvent/ChunkPopulateEvent.

Либо же вовсе менять стандартные параметры генератора датапаком.

Если у тебя на примете есть плагины, решающие твою задачу - кидай, посмотрим код
 

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

Назад
Верх