Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Туториал Разработка генератора мира

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем BimPsinka, 3 фев 2019.

?

Понравилась ли вам тема?

  1. Да

    1 голосов
    100,0%
  2. Нет

    0 голосов
    0,0%
  1. Автор темы
    BimPsinka

    BimPsinka Активный участник

    Баллы:
    63
    Имя в Minecraft:
    BimPsinka
    Внимание! Эта тема является переводом следующей страницы https://bukkit.gamepedia.com/Developing_a_World_Generator_Plugin

    ЧАСТЬ 1. ВВЕДЕНИЕ.

    Этот туториал даст вам базовые знания о создании своего генератора мира с использованием Bukkit.
    После этого урока вы сможете сделать простой, бесконечный мир равнин и океанов с некоторыми особенностями.
    ВАЖНО:
    До прочтения этого туториала вы должны иметь базовые знания о программировании на Java и написании Bukkit плагинов.
    В данном уроке будет использоваться Eclipse в качестве среды разработки и Bukkit сервер версии 1.12.+. Другие IDE и версия Bukkit сервера могут иметь отличия.

    ЧАСТЬ 2. НАСТРОЙКА ПРОЕКТА.
    Создайте Maven проект в Eclipse и добавьте Bukkit зависимость в pom.xml
    [​IMG]
    • Создайте файл plugin.yml в папке src/main/resources и введите информацию о плагине. Наконец, добавьте load: startup в файл.
    • Создайте главный класс. Помните, что путь к этому классу должен совпадать с путем, написанным в plugin.yml.
    • Переопределите onEnable() и onDisable() в классе с вашим кодом.
    Основной класс теперь должен быть похож на этот:
    package {$TopLevelDomain}.{$Domain}.{$PluginName};

    import org.bukkit.plugin.java.JavaPlugin;

    public final class {$PluginName} extends JavaPlugin {
    @Override
    public void onEnable() {
    // TODO Insert logic to be performed when the plugin is enabled
    }

    @Override
    public void onDisable() {
    // TODO Insert logic to be performed when the plugin is disabled
    }
    }
    ЧАСТЬ 3. СОЗДАНИЕ СВОЕГО ГЕНЕРАТОРА ЧАНКОВ.
    Мир Minecraft делится на небольшие куски(чанки). Каждый чанк состоит из 16×256×16 блоков и создается генератором.
    • Сначала создайте новый класс в главном пакете с наследованием класса ChunkGenerator. Мы назвали его CustomChunkGenerator.
    • Создайте метод с аннотацией @Override. Это должно выглядеть так:
      public class CustomChunkGenerator extends ChunkGenerator {
      @Override
      public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
      // TODO Chunk generation code here.
      }
      }
      Этот метод будет вызываться каждый раз, когда создается новый блок.
    • Создайте переменную ChunkData и присвойте ей значение createChunkData(world)
      ChunkData chunk = createChunkData(world);
      Мы будем заполнять переменную данными о блоках и передавать её значение методу.
    Каждый биом в Minecraft имеет разную высоту. Например, равнины имеют равнинный, низкий рельеф, а экстремальные холмы имеют супер высокие, крутые, скалистые скалы. Высота каждого положения определяется с помощью SimplexOctaveGenerator. Это сделает рандомизированную, но гладкую местность, и вы можете использовать ее для создания различных видов биомов.
    • Создайте метод SimplexOctaveGenerator.
      SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8);
    • Установите масштаб генератора на 0.005D.
      generator.setScale(0.005D);
      Вы можете изменить масштаб, если хотите. Чем больше масштаб, тем круче местность.
    Размер каждого куска X×Z всегда равен 16×16. Мы будем использовать SimplexOctaveGenerator выше, чтобы определить высоту каждой (X, Z) координаты, а затем генерировать блоки вертикально на эту координату.
    • Создайте цикл for для переменной Z внутри цикла для переменной X.
      for (int X = 0; X < 16; X++)
      for (int Z = 0; Z < 16; Z++) {
      // TODO Heights and blocks generation code here.
      }
    • Создайте переменную currentHeight в классе. Как объясняет имя, эта переменная хранит текущую высоту, полученную от SimplexOctaveGenerator каждый раз, когда мы работаем с координатой (X,Z) блока.
      currentHeight = (int) ((generator.noise(chunkX*16+X, chunkZ*16+Z, 0.5D, 0.5D, true)+1)*15D+50D);
      Почему 15 и 50? 15 - множитель - это величина разности между самыми высокими и самыми низкими высотами мира, а 50 - это минимальная высота всего мира. Вы можете изменить их, если хотите.
    • После получения высоты мы установим блоки для текущей координаты (X,Z).
      chunk.setBlock(X, currentHeight, Z, Material.GRASS);
      chunk.setBlock(X, currentHeight-1, Z, Material.DIRT);
      for (int i = currentHeight-2; i > 0; i--)
      chunk.setBlock(X, i, Z, Material.STONE);
      chunk.setBlock(X, 0, Z, Material.BEDROCK);
      return chunk;
    Теперь класс CustomChunkGenerator выглядит так:
    public class CustomChunkGenerator extends ChunkGenerator {
    int currentHeight = 50;

    @Override
    public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
    SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8);
    ChunkData chunk = createChunkData(world);
    generator.setScale(0.005D);

    for (int X = 0; X < 16; X++)
    for (int Z = 0; Z < 16; Z++) {
    currentHeight = (int) (generator.noise(chunkX*16+X, chunkZ*16+Z, 0.5D, 0.5D)*15D+50D);
    chunk.setBlock(X, currentHeight, Z, Material.GRASS);
    chunk.setBlock(X, currentHeight-1, Z, Material.DIRT);
    for (int i = currentHeight-2; i > 0; i--)
    chunk.setBlock(X, i, Z, Material.STONE);
    chunk.setBlock(X, 0, Z, Material.BEDROCK);
    }
    return chunk;
    }
    }
    Тестируем генератор:
    • Добавьте эти строки в основной класс:
      @Override
      public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
      return new CustomChunkGenerator();
      }
    • Соберите плагин с помощью Maven Build. Это создаст jar файл.
    • Подготовьте сервер Bukkit. Поместить скомпилированный плагин в папку plugins. Удалите основную папку сохранения мира.
    • Добавьте эти строки в bukkit.yml
      worlds:
      world:
      generator: plugin
      # Replace "world" with the name of the server's main world name.
      # Replace "plugin" with your plugin's name.
    • Запустите сервер и зайдите. Вы должны увидеть это: [​IMG]
    Страница переведена не полностью. В ближайшее время закончу.
    Также хочу спросить, как сделать корректное отображение кода в спойлере?
     
    MishaNeYT нравится это.
  2. Хостинг MineCraft
    <

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