Как использовать Forge BiomeDictionary

Перевод Как использовать Forge BiomeDictionary

Требуется Minecraft Forge версии 7.7.1.632+ и выше!

Forge BiomeDictionary содержит набор инструментов, которые облегчают поддержку модифицированных биомов в модах. Он делает это, присваивая теги биомам (например, лес) на основе их свойств (температура, высота, количество деревьев и т. д.). В этом уроке мы рассмотрим, как зарегистрировать созданные вами биомы вручную, как проверить, есть ли у биома определенные теги (для генераций мира), или получить список всех биомов с определенным тегом (для мобов). Я предполагаю, что вы уже знаете, как создать биом(если не знаете то можете прочитать в этом гайде тык*), генератор мира или мобов, по этому в этом туториале мы не будет затрагивать эту тему.


Импорты

Чтобы использовать BiomeDictionary, вы должны импортировать следующее:

Java:
import net.minecraftforge.common.BiomeDictionary; //Альтернативно: import net.minecraftforge.common. *;
import static net.minecraftforge.common.BiomeDictionary.Type;

Вы уже должны понять, что делает первая строка, если вы вообще знакомы с Java, однако второй строке может потребоваться некоторое объяснение. import static позволяет импортировать определенное публичное поле в классе таким образом, чтобы вы могли ссылаться на него напрямую, не обращаясь к классу, который его содержит. В этом случае мы используем import static для перечисления, который содержит различные теги, созданные BiomeDictionary. Это заставит ваш код выглядеть намного чище, так как это позволит нам сказать что-то вроде Type.FOREST, а не BiomeDictionary.Type.FOREST. Я не буду вдаваться в подробности того, как Java перечисления работают в этом туториале, так как оно не должно быть необходимым для вас, чтобы полностью понять то, как использовать BiomeDictionary. Если вам интересно узнать больше о них, быстрый поиск в Google должен предоставить соответствующую информацию.


Как зарегистрировать биом вручную

Прежде всего следует отметить, что BiomeDictionary может автоматически регистрировать биом, когда мода запрашивает информацию об этом с использованием заранее определенной системы правил (подробнее см. BiomeDictionary.makeBestGuess ()). Однако в некоторых случаях особенно необычные биомы не будут классифицироваться правильно, и вы должны зарегистрировать их вручную. Это очень просто сделать:

Java:
BiomeGenBase theBiome = new BiomeGenSpecial(theBiomeID);
GameRegistry.addBiome(theBiome);
BiomeDictionary.registerBiomeType(theBiome, Type.MOUNTAIN, Type.WASTELAND);

Вы уже должны быть знакомы с первыми двумя строками, которые просто создают и регистрируют биом с помощью FML. В третьей строке регистрируется биом в BiomeDictionary с двумя тегами, горы и пустоши. Первый параметр BiomeDictionary.registerBiomeType экземпляр BiomeGenBase, представляющий биом, который вы хотите зарегистрировать, и все последующие параметры (вы можете дать столько, сколько хотите) имеют BiomeDictionary.Type, и это типы, которые вы хотите зарегистрировать в качестве биома. Для максимальной совместимости с модами на мобов, вы должны сделать это в рамках метода load() вашего мода.

Для справки, вот перечисление, которое определяет все типы биомов:

Java:
public enum Type {
 
     FOREST,
     PLAINS,
     MOUNTAIN,
     HILLS,
     SWAMP,
     WATER,
     DESERT,
     FROZEN,
     JUNGLE,
     WASTELAND,
     BEACH,
     NETHER,
     END,
     MUSHROOM,
     MAGICAL;
 
}

Из этих тегов, HILLS, WASTELAND, BEACH, NETHER, END, MUSHROOM и MAGICAL, никогда не будут автоматически назначены на биоме, поэтому, если одно из них относится к вашему биому, вы должны его вручную зарегистрировать. Следует также отметить, что если биом зарегистрирован вручную с любым тегом, автоматическая регистрация не будет предпринята, поэтому, если вы зарегистрируетесь вручную, вы должны зарегистрировать все соответствующие теги. Наконец, вы никогда не должны регистрировать биомы ванили, так как BiomeDictionary имеет автоматическую регистрацию вручную для всех из них.


Как использовать BiomeDictionary для генерации мира

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

У вас должен быть метод, который выглядит примерно так:

Java:
@Override
public void generate(Random random, int chunkX, int chunkZ, World world,
IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
{
    //Код генераций мира
}

Первое, что вам нужно сделать, это получить координаты x и z некоторого блока в чанке, в котором вы генерируете. Самый простой способ сделать это:

Java:
int x = chunkX * 16;
int z = chunkZ * 16;

Это даст вам координаты блока в x = 0, z = 0, относительно чанка.
(Но я не советую выставлять в качестве генерируемой области случайные размеры 16 на 16, так как это может вызывать критические лаги, и ваш мир будет "тормозить". Более подробно об этом можно почитать тут: Каскадная генерация.)

Теперь вам нужно получить биом в этой позиции:

Java:
BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(x, z);

И, наконец, вам нужно проверить, соответствует ли биом типу, который вы хотите создать:

Java:
if(BiomeDictionary.isBiomeOfType(biome, Type.FOREST))
{
    //Код генераций мира
}

Код в true ветви этого оператора if будет выполняться только в том случае, если этот биом имеет тип FOREST. Имейте в виду, что биомы могут иметь несколько типов, поэтому, если вы хотите, вы можете использовать &&, || и ! для проверки любой комбинации, которую вы хотите. Например, вы можете проверить, не является ли биома не ЗАМОРОЖЕННЫМ, как ЛЕСОМ, так и ГОРНЫМ, или является либо БОЛОТОМ, либо ПУСТОШЬЮ. Полный список доступных тегов см. В предыдущем разделе или в BiomeDictionary.Type.

Подводя итог, вот окончательный код для этого метода:

Java:
@Override
public void generate(Random random, int chunkX, int chunkZ, World world,
IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
{
    int x = chunkX * 16;
    int z = chunkZ * 16;

    BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(x, z);

    if(BiomeDictionary.isBiomeOfType(biome, Type.FOREST))
    {
        //Код генераций мира
    }
}

И это все, что вам нужно. Это так же просто, как ограничение вашей генераций в мире на основе ванильного биома, но использование BiomeDictionary сделает вашу генерацию в мире совместимой с любым модом на биом, который смогут установить ваши игроки. Кроме того, вы обнаружите, что доступные теги очень похожи на биомы ванили.

Спавн мобов с использованием BiomeDictionary

Прежде всего, я хочу извиниться, если что-то, что я говорю в этом разделе, не совсем корректно. Я не так хорошо знаком с тем, как работает спавн мобов, поэтому, пожалуйста, не стесняйтесь исправить меня, если я ошибаюсь.

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

Прежде всего, хотя вы можете сделать любую инициализацию своих мобов в методе load () вашего мода, на самом деле использование BiomeDictionary для регистрации их для биомов, имеющих к ним определенный тег, должно быть выполнено в методе postInit () вашего мода. Это делается для того, чтобы все биомы уже были зарегистрированы в списке основных биомов с использованием FML.

Первое, что вам нужно сделать в postInit (), - добавить следующую строку кода:

Java:
BiomeDictionary.registerAllBiomes();

Этот метод нужно вызывать только один раз в postInit () (и его не следует вызывать нигде в вашем коде). Все, что он делает, - это цикл через список основных биомов в BiomeGenBase и он автоматически регистрирует любые биомы, которые не были зарегистрированы вручную в BiomeDictionary их создателями. Даже если ваши моды не первые, чтобы вызвать это, вам не нужно беспокоиться, так как этот метод будет просто перебирать все биомы, и ничего не делать, если этот метод уже был вызван. Поскольку существует максимум 256 биомов, это не будет, так дорого во времени пока игра загружается.

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

Java:
BiomeGenBase[] biomes = BiomeDictionary.getBiomesForType(Type.FROZEN);

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

Java:
SpawnListEntry ocelotSpawn = new SpawnListEntry(EntityOcelot.class, 2, 1, 1);

for(int i = 0; i < biomes.length; i++)
{
    biomes[i].getSpawnableList(EnumCreatureType.monster).add(ocelotSpawn);
}

Этот пример добавляет ванильные оцелоты ко всем биомам, зарегистрированным как FROZEN. Однако есть несколько проблем. Прежде всего, что, если вы хотите, чтобы породило мобов только в биомах, которые являются ЗАМОРОЖЕННЫМИ и ЛЕСОМ. Для этого можно использовать следующий код:

Java:
for(int i = 0; i < biomes.length; i++)
{
    if(BiomeDictionary.isBiomeOfType(biomes[i], Type.FOREST))
    {
        biomes[i].getSpawnableList(EnumCreatureType.monster).add(ocelotSpawn);
    }
}

for (BiomeGenBase biome : biomes)
{
    if (BiomeDictionary.isBiomeOfType(biome, Type.FOREST))
    {
        biome.getSpawnableList(EnumCreatureType.monster).add(ocelotSpawn);
    }
}

Как я объяснил в разделе про генерацию в мире, вы можете использовать BiomeDictionary.isBiomeOfType (), чтобы проверить, имеет ли отдельный биом определенный тег, примененный к нему. Вы можете, конечно, использовать &&, || и ! для создания любой комбинации. Если вы хотите добавить его в biomes из одного тега или другого, вы должны проверить перед добавлением ко второму тегу (и любым последующим тегам), чтобы убедиться, что он также не имеет первого тега, применяемого к нему, чтобы избежать дублирования записей.

Чтобы просмотреть полный список доступных тегов, просмотрите раздел по ручной регистрации биома или посмотрите на BiomeDictionary.Type.

Не стесняйтесь задавать любые вопросы или указывать на любые ошибки, которые я сделал.
Автор
Garik
Просмотры
1,114
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

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

Сверху