Разработка плагина World Generator — официальная BukkitWiki

В ПРОЦЕССЕ

Эта страница находится в стадии разработки. Регулярно проверяйте наличие дополнительного контента …

Введение

Из этого туториала Вы узнаете, как создать собственный генератор мира с помощью Bukkit. Следуя этому руководству, вы создадите простой, бесконечный мир равнин и океанов с некоторыми добавленными функциями.

ВАЖНО:

  • Перед чтением этого руководства вам необходимо знать основы языка программирования Java и основы создания надлежащего подключаемого модуля Bukkit. Если вы еще этого не сделали, щелкните здесь.
  • В этом руководстве Eclipse используется в качестве среды IDE и Bukkit 1.12+. Другие версии IDE и Bukkit могут иметь некоторые отличия.

Настройте проект

  • Создайте проект Maven в Eclipse, добавьте Bukkit зависимость от pom.xml и управление им:

  • Создайте plugin.yml в папке src/main/resources, введите информацию о вашем плагине. Наконец, добавьте
     load: startup 

    в файл .

  • Создайте основной класс в основном пакете вашего проекта. Помните, что путь к этому классу должен быть таким же , как и путь main в вашем plugin.yml . Замените onEnable () и onDisable () в классе своим кодом.

Теперь основной класс должен быть похож на этот:

 package {$ TopLevelDomain}. {$ Domain}. {$ PluginName}; import org.bukkit.plugin.java.JavaPlugin; общедоступный конечный класс {$ PluginName} расширяет JavaPlugin {@Override public void onEnable () {//TODO  Вставить логику, которая будет выполняться при включении плагина} @Override public void onDisable () {//TODO Вставить логику, которая будет выполняться, когда плагин отключен}} 

Создать собственный Генератор фрагментов

Мир Minecraft разделен на небольшие фрагменты. Каждый кусок имеет размер 16 × 256 × 16 блоков и создается ChunkGenerator . После этого мир встречает несколько BlockPopulator , которые нужно заполнить деталями.

  • Сначала создайте новый класс в основном пакете расширение класса ChunkGenerator. Мы назовем этот CustomChunkGenerator .
  • Создайте метод
     public ChunkData generateChunkData (World world, Random random, int chunkX,  int chunkZ, биом BiomeGrid) 

    с аннотацией @Override . Теперь это должно выглядеть так:

 публичный класс CustomChunkGenerator расширяет ChunkGenerator {@Override public ChunkData generateChunkData (World world, Random random, int chunkX, int chunkZ, BiomeGrid  biome) {//Код генерации блока TODO здесь.  }} 

Этот метод будет вызываться каждый раз, когда создается новый блок для получения сведений о блоке.

  • Добавить ChunkData для метода и назначьте ее с помощью createChunkData(world):
 ChunkData  chunk = createChunkData (world); 

Мы заполним блоки чанка этой переменной и вернем ее методу.

Добавление генератора высоты

Каждый биом в Minecraft имеет разную высоту, и в этом биоме высота тоже разная. Например, равнины имеют плоскую низменную местность, а биом Extreme Hills имеет супервысокие крутые скалистые утесы. Высота каждого места определяется октавным генератором . Он создаст случайный, но гладкий ландшафт, и вы сможете использовать его для создания различных видов биомов.

  • Создайте SimplexOctaveGenerator в методе , используйте указанное начальное число мира в качестве его случайного начального числа:
 SimplexOctaveGenerator generator = new SimplexOctaveGenerator (new Random (world.getSeed ()), 8); 

Второй аргумент — это количество октав. Помните, что нельзя размещать генератор октав где-либо еще.

  • Установите масштаб generator на 0.005D.
 generator.setScale (0.005D); 

Вы можете изменить масштаб, если хотите. Чем больше масштаб, тем круче ландшафт.

Генерировать высоту и блоки блока

Размер каждого блока x × z всегда составляет 16 × 16. Мы будем использовать SimplexOctaveGenerator выше, чтобы определить высоту каждой координаты (x, z), а затем сгенерировать блоки вертикально по этой координате.

  • Создайте цикл for для целого числа z внутри цикла a for для целого числа x я>. Они будут работать от (0, 0) до (15, 15), что указывает текущую координату (x, z), с которой мы работаем:
 for (  int x = 0; x  
  • Сделайте целое число currentHeight внутри класса. Как следует из названия, эта переменная сохраняет текущую высоту, полученную от SimplexOctaveGenerator каждый раз, когда мы работаем с координатами (X, Z) блока.
  • В цикле for присвойте шум генератора октавы текущей (X, Z) координаты мира currentHeight после добавления результата к 1, умножения его на 15, добавления его на 50 и преобразования его в целое число.

Текущую (X, Z) координату мира можно получить, умножив chunkX , chunkZ и добавив к каждому из них 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--) чанк  .setBlock (x, i, z, Material.STONE); 

  • Наконец, установите самый нижний блок как основу:
 chunk.setBlock (  x, 0, z, Material.BEDROCK); 

  • В последней строке m ethod, верните chunk:
 return chunk; 

Теперь CustomChunkGenerator должен выглядеть так:

 открытый класс 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 (мир);  generator.setScale (0.005D);  for (int X = 0; X  0; i--) chunk.setBlock (X, i, Z, Material.STONE);  chunk.setBlock (X, 0, Z, Материал.BEDROCK);  } вернуть кусок;  }} 

Протестируйте генератор

  • Добавьте эти строки в свой основной класс:
 @Overridepublic ChunkGenerator getDefaultWorldGenerator (String worldName, String id) {return new CustomChunkGenerator ();} 

Это заставит наш генератор фрагментов в действии, когда появится новый chunks.

  • Создайте плагин с помощью Maven Build → package target. Он должен был успешно построить .jar.
  • Подготовить сервер Bukkit. Поместите скомпилированный плагин в папку plugins . Удалите основную папку сохранения мира. Добавьте эти строки в bukkit.yml:
 worlds: world: generator: plugin # Замените "world" на имя основного мирового имени сервера. # Замените  "плагин" с именем вашего плагина. 

  • Запустить сервер. Войдите на сервер. Вы увидите что-то вроде этого:

Это довольно плоский и скучный мир, очень похожий на начало Minecraft (самая первая версия Minecraft представляла собой плоский куб из блоков), но не волнуйтесь, мы собираемся добавить в этот мир больше вещей позже.

Создание популяторов блоков

Как объяснялось выше, после того, как новый блок заполнен базовым ландшафтом, он встретится с некоторыми заполнителями блоков , чтобы быть заполненным деталями и структурами, такими как: деревья, руды, подземелья, шахты и т.д …

В этом разделе мы собираемся создать несколько популяторов блоков, чтобы порождать деревья, высокая трава, немного воды и озер с лавой, а также жилы с рудой.

Создайте заселение деревьев

Это повысит вероятность создания от 1 до 5 с вероятностью 50-50 деревьев на блок.

  • Сначала создайте класс с именем TreePopulator , расширяющий класс BlockPopulator .

Если среда IDE предупреждает вас о создании class abstract, игнорируйте его и продолжайте работу.

  • Переопределите метод суперкласса populate:
 @Overridepublic void populate (World world, Random random, Chunk chunk) {//здесь код популятора TODO Tree} 

Опять же, не создавайте абстрактный метод, даже если среда IDE предупреждает вас. Все будет в порядке.

  • Используйте предоставленный random внутри метода, чтобы увеличить вероятность появления деревьев:
 if (random.nextBoolean ()) {//Здесь код генерации TODO Tree} 

  • Внутри if , создайте цикл for для целого числа i от 1 до случайного целого числа от 1 до 5.
  • Внутри цикла for сгенерируйте дерево в случайном месте. К счастью, нам не нужно строить дерево поблочно. Вместо этого мы получаем самый высокий блок по случайно выбранной координате (X, Z) фрагмента и генерируем дерево поверх блока с помощью доступного метода генерации дерева из Bukkit:
 if (random.nextBoolean ()) {int amount = random.nextInt (4) +1; //Количество деревьев для (int i = 1; i  

Регистрация заполнителей блоков

Как и в случае с генератором фрагментов, все заполнители блоков должны быть зарегистрированы, прежде чем они смогут работать.

Внутри класса CustomChunkGenerator вставьте этот метод:

 @Overridepublic List  getDefaultPopulators (World world) {return Arrays.asList  ((BlockPopulator) new TreePopulator ());} 

Теперь вы можете перекомпилировать плагин и посмотреть, как он работает на сервере. Это будет примерно так:

Создание травы

  • Создайте новый класс, аналогичный TreePopulator , но теперь мы назовем его GrassPopulator .

Это поколение достаточно легко сделать самому. Вот подсказки:

  • Выберите случайную координату (X, Z).
  • Найдите самую высокую блок этой координаты.
  • Наверху этого блока поместите траву следующим способом:
 chunk.getBlock (X, Y + 1, Z) .setType (Material.GRASS); 

Создание небольших озер

В на следующих шагах мы сделаем шанс создать озеро воды или лавы для каждого фрагмента.

Создайте новый класс BlockPopulator , назовите его как-нибудь вроде LakePopulator .

На этот раз мы не используем логический генератор. Вместо этого мы рандомизируем целое число от 1 до 100 и проверяем, меньше ли оно, чем цетановое число. Если это правда, он определит, вода это или озеро лавы. Затем определяется местоположение озера, и, наконец, мы начинаем генерацию.

Не так повезло, как деревья, на этот раз мы должны сами построить озеро.

Ниже показано код для генерации озер. Он был преобразован из генератора озер vannila Minecraft.

 if (random.nextInt (100)  4? Material.AIR: block.getType ()  );  }}}} for (j = 0; j  

Создание жил из руды

Ниже приведен код для создания некоторых жил угля

 int X, Y, Z; boolean isStone;  for (int i = 1; i  

Вы можете использовать это для создания других типов вен.

Язык Английский • беларуская • Deutsch • español • suomi • français • italiano • 한국어 • Nederlands • norsk • polski • português • русский • lietuvių • čeština
Оцените статью
Gamicon.ru
Добавить комментарий