1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем aloyen, 2 авг 2023.

  1. Автор темы
    aloyen

    aloyen Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    aloyen
    Всех приветствую.

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

    Версия: Bukkit 1.16.5
     
  2. NoLogic

    NoLogic Активный участник Пользователь

    Баллы:
    66
    Где-то в дебрях NMS, очевидно. На 1.16.5 есть крайне удобный ремаппер, с которым можно легко работать с маджонговским кодом.
     
  3. Dymeth

    Dymeth Активный участник Пользователь

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

    И на всякий случай уточни, что за ядро
     
  4. Автор темы
    aloyen

    aloyen Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    aloyen
    Ну, мне конкретно надо унаследоваться от класса генератора, переписать BlockPopulator и плюсом надо расширить этот класс.

    Ядро Magma. Но от Bukkit оно мало чем отличается (проверял по исходникам).
     
  5. Автор темы
    aloyen

    aloyen Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    aloyen
    Эх, ещё бы знать в какие дебри лезть...
     
  6. Автор темы
    aloyen

    aloyen Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    aloyen
    Итак, я узнал где генератор мира находится.
    Его можно получить так:
    Код:
    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-генератор?
     
  7. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Никак, только в обратную сторону, причем только для конкретного мира при создании:
    PHP:
    net.minecraft.server.level.ServerLevel level = ((CraftWorldbukkitWorld).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(leveldelegatebukkitGen);
    Если ты хочешь переписать логику ванильного генератора, то, скорее всего, придётся наследоваться уже от NMS-генератора, а не от баккитовского. И создавать мир при помощи этого самого NMS/рефлексии/ASM и прочих танцев с бубном.

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

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

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

    just_lofe Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    just_l0fe

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