Построение структуры

Перевод Построение структуры

Версия(и) Minecraft
1.9+
Источник
https://tutorials.darkhax.net/tutorials/structure_gen/
Построение структуры
Одним из менее известных особенностей, скрытых в обновлении 1.9 Minecraft является новый NBT формат для структур на основе схематического формата. Этот формат используется Mojang для генераций структур в мире, для таки структур как иглу, городов Края и ископаемые останки. С помощью структурного блока игроки могут создавать свои собственные схематические файлы, некоторые игроки воспользовались этим, чтобы создать новые подземелья через командные блоки! Моды также могут воспользоваться этим, чтобы создать достаточно эффективную структуру.

Первый шаг - открыть вашу игру и создать новый суперплоский творческий мир. В этом мире создайте структуру, которую вы хотите создать с помощью своего мод. Имейте в виду, что существует ограничение на этот метод. Каждый файл структуры может содержать только структуры размером 32x32x32 блоков. Хотя это, вероятно, не будет проблемой для большинства конструкций структуры, если вы планируете сделать что-то большое, как лесной особняк, вам нужно будет написать код, который может объединить несколько структур вместе. Когда вы построите структуру, вам нужно будет взять структурный блок, чтобы вы могли потом экспортировать вашу структуру в NBT файл для будущего использования. Команда для этого: /@p minecraft: structure_block. Когда у вас есть структурный блок, расположенный рядом с вашей структурой, нажмите кнопку D, чтобы переключить его в режим сохранения. Этот режим изменит графический интерфейс, чтобы иметь некоторые новые параметры, такие как размер структуры и положение относительно блока. Я бы рекомендовал включить Show invisible blocks. Когда вы настроили размер и положение, дайте вашей структуре имя что бы сохранить её. Это имя должно быть одинарным и использовать символы подчеркивания в качестве разделительного знака. После этого нажмите кнопку «Сохранить», и всё, вы создадите файл. Структуры сохраняются внутри мира, поэтому смотрите в world/structures там будет файл с расширением .nbt. После того, как у вас есть файл структуры, добавьте его в папку ресурсов вашего мода. Правильное расположение - assets/modid/structure/. Обратите внимание, что вы также можете добавлять дополнительные папки для группировки похожих структур.

Теперь самое интересное, нам надо расширить свой класс в котором будет проходить генерация, для этого надо реализовать IWorldGenerator, чтобы загрузить вашу структуру в мире. На самом деле это намного проще, чем кажется. Этот интерфейс дает вашему классу метод generate, который дает вам доступ к мировому "фону" и позволяет вносить изменения в мир. Первое, что нужно сделать в указанном методе, - это понять, где вы хотите разместить структуру. В этом уроке я просто собираюсь создать структуру в небе и добавить немного случайного смещения в положение X и Z. Следующим шагом будет создание настроек PlacementSettings. Просто создайте новый экземпляр этого класса, а затем используйте его, чтобы настроить, то как вы хотите разместить структуру. Есть много интересных настроек, с которыми вы можете столкнуться, например setRotation, которая позволяют поворачивать структуру вокруг ее места. Прямо сейчас ваш код должен выглядеть примерно так:
Java:
    public class WorldGenFlower implements IWorldGenerator {
       
        @Override
        public void generate (Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
           
            final BlockPos basePos = new BlockPos(chunkX * 16 + random.nextInt(16), 100, chunkZ * 16 + random.nextInt(16));
            final PlacementSettings settings = new PlacementSettings().setRotation(Rotation.NONE);
        }
    }

Далее мы будем загружать нашу структуру и создавать её с настройками созданные ранее. Для этого необходимо создать объект шаблона. Способ сделать это довольно прямолинейно спрятан. Первый шаг заключается в создании нового ResourceLocation, который указывает на структуру файла, который вы сделали ранее. После этого вы можете вызвать это, чтобы получить шаблон для него:
Java:
world.getSaveHandler().getStructureTemplateManager().getTemplate(world.getMinecraftServer(), RESOURCE_LOCATION_HERE);

Шаблон предлагает несколько методов для вычисления математики относительно структуры, однако то, что мы хотим сейчас сделать, сделает этот метод addBlocksToWorld. Просто передайте этот метод миру, например c такими параметрами как: положение и размещение установки, и шаблон будет сгенерирован в мире. Вот как это должно выглядеть сейчас:
Java:
public class WorldGenFlower implements IWorldGenerator {
       
        private static final ResourceLocation FLOWER = new ResourceLocation("libtest:flower");
       
        @Override
        public void generate (Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
           
            final BlockPos basePos = new BlockPos(chunkX * 16 + random.nextInt(16), 100, chunkZ * 16 + random.nextInt(16));
            final PlacementSettings settings = new PlacementSettings().setRotation(Rotation.NONE);
            final Template template = world.getSaveHandler().getStructureTemplateManager().getTemplate(world.getMinecraftServer(), FLOWER);
           
            template.addBlocksToWorld(world, basePos, settings);
        }
    }

И, наконец, мы должны зарегистрировать наш генератор для мира. Это можно сделать, вызвав GameRegistry.registerWorldGenerator(new YourGenerator(), WEIGHT); где WEIGHT используется для определения порядка формирования структур. Термин WEIGHT немного вводит в заблуждение в этой ситуации, поскольку он относится к порядку генерации, и не обязательно, насколько он распространен.

Итак, как насчет динамической или случайной генерации структуры, которая может вносить изменения в шаблон при его создании. Это возможно, но немного сложнее. Mojang предоставил интерфейс ITemplateProcessor, который позволит обрабатывать каждый блок в шаблоне. В настоящее время существует только один процессор, предоставляемый Mojang, и он называется BlockRotationProcessor. Несмотря на его название, он фактически выполняет структурную целостность. Это используется как процессор по умолчанию и позволяет получить некоторые интересные вещи. В принципе, вы даете ему процент в виде float, а затем каждый блок в шаблоне имея такой процентный шанс не удаляться из шаблона. Mojang использует это для случайного замещения блоков костей углем в их ископаемом генераторе, однако его можно также добавить, чтобы структуры выглядели старыми или сломанными. Вы можете поиграть с этим, добавив settings.setIntegrity(CHANCE); к приведенному выше коду. Обратите внимание, что изменение значения в настройках будет работать, только если вы используете метод addBlocksToWorld по умолчанию.

Таким образом, процессоры могут показаться простыми, однако есть подводный камень. Чтобы использовать настраиваемый процессор, вы должны изменить свой метод addBlocksToWorld на этот: template.addBlocksToWorld(world, basePos, YOUR_PROCESSOR, settings, 2);. Большая проблема заключается в том, что у вас может быть только один процессор за раз, а исправление этого требует немного больших усилий. Пока я сосредоточусь только на написании нового процессора. Эта часть довольно прямолинейна, как и все остальное. У вас есть метод processBlock, который вызывается для каждого непустого блока в структуре. Этот метод позволит вам изменить состояние блока или данные NBT для этого блока. Ниже приведен пример процессора, который будет случайным образом изменять цвет цветного блока:
Java:
public class TemplateProcessorColored implements ITemplateProcessor {

    private final BlockColored block;
    private final EnumDyeColor color;
   
    public TemplateProcessorColored(BlockColored block) {
       
        this.block = block;
        this.color = EnumDyeColor.values()[Constants.RANDOM.nextInt(EnumDyeColor.values().length)];
    }
   
    @Override
    public BlockInfo processBlock (World worldIn, BlockPos pos, BlockInfo blockInfoIn) {
       
        if (blockInfoIn.blockState.getBlock().equals(this.block))
            return new BlockInfo(blockInfoIn.pos, blockInfoIn.blockState.withProperty(BlockColored.COLOR, this.color), blockInfoIn.tileentityData);      
     
        return blockInfoIn;
    }
}

Последнее, что я расскажу в этом учебнике, это то, как другие моды используют эту структуру. В настоящее время существует только несколько модов, которые работали с ними, однако большинство из них сделали что-то уникальное и интересное. Первый пример, которым я хотел бы поделиться, - это RealFilingCabinet от bafomdad. Он использует формат структуры, чтобы связать небольшой учебный мир с его модом. Если вы создадите новый плоский мир с тем же именем, что и у его мода, вы будете появляться в небольшом мире, который объясняет, как работает мод.

Второй отличный пример, который я хочу воспитывать, - это мод Quark от Vazkii, и это пиратские корабли. Vazkii использует множество различных элементов для создания полноценной структуры, в комплекте с пиратскими мобами, сундуками для добычи и другими причудливыми вещами.
Автор
Garik
Просмотры
7,131
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Garik

Сверху