11日目 バイオームの追加
今回はバイオームを追加しようと思います。
まず、Biomeを継承したクラスを作成します。
public class TestBiome extends Biome { protected TestBiome() { super(new Biome.Builder() .surfaceBuilder(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(Blocks.END_STONE.getDefaultState(), Blocks.NETHERRACK.getDefaultState(), Blocks.LAVA.getDefaultState())) .precipitation(RainType.SNOW) .depth(0.0f) .scale(0.0f) .category(Category.DESERT) .downfall(1.0f) .temperature(1.2f)) .waterColor(0xffffff) .waterFogColor(0x000000); DefaultBiomeFeatures.addLakes(this); this.addSpawn(EntityClassification.MONSTER, new SpawnListEntry(EntityType.field_226289_e_, 5, 1, 2)); setRegistryName(Location.create("test_biome")); } }
コンストラクターで、super()にBiome.Builderを渡します。
newでBuilderのインスタンスを生成してから、各メソッドで設定を行ないます。
わからない部分も結構あるのですが、すべて設定しておかないとエラーがでます。
surfaceBuilderはバイオームを構成するブロックを設定します。第一引数はSurfaceBuilderのタイプ、第二引数にSurfaceBuilderConfigに、表面のブロック (平原バイオームの草ブロック)、表面下のブロック (平原バイオームの土ブロック)、第三引数が水の下のブロックを設定して渡します。
precipitationでは、雨のタイプを設定します。
depthはバイオームの起伏の大きさだと思います。
scaleも大きくすると、バイオームの高さが高くなります。depthとの違いがよくわかりません。
バイオームのサイズではないようです。
categoryも設定する必要がありますが、どのように反映されるのかいまいち分かりません。
downfallは降水量らしいですが、0にしても雨が降っていたりしてよくわかりません。
また草ブロックの色等にも関係しているみたいです。
temperatureはバニラでは0から2くらいの間に設定されていて、この値が0.15未満なら雪が降り、0.15から0.95であれば雨が降り、それ以上高ければ雪も雨も降らないみたいです。
waterColorとwaterFogColorは水の色と霧の色で、16進数のカラーコードで設定します。
またDefaultBiomeFeatures.addXXX(this)で、このバイオームにデフォルトの構造物を追加できます。
addSpawnで、このバイオームに出現するMobを設定します。
registryNameも設定しておきます。
このあたりを設定したら、続いてバイオームの登録を行ないます。
これも、ブロック等と同様に@SubscribeEventで登録するので、どこのクラスでも登録出来ます。
今回は、ModBiomesというクラスを作成しました。
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class ModBiomes { public static final Biome TEST_BIOME = new TestBiome(); @SubscribeEvent public static void registerBiome(final RegistryEvent.Register<Biome> event) { event.getRegistry().register(TEST_BIOME); BiomeDictionary.addTypes(TEST_BIOME, BiomeDictionary.Type.DRY, BiomeDictionary.Type.HOT); BiomeManager.addBiome(BiomeType.WARM, new BiomeEntry(TEST_BIOME, 100)); BiomeManager.addSpawnBiome(TEST_BIOME); } }
宣言と RegistryEventでの登録はアイテムやブロック等と同様です。
バイオームの場合は、それだけだと自然にスポーンしないのでBiomeDictionaryとBiomeManagerに登録します。
BiomeDictionaryでは、バイオームのタイプを登録します。
おそらく、タイプが近いと、近いタイプのバイオーム同士が隣接して生成されるんだと思います。
BiomeManagerのaddBiomeでBiomeTypeとBiomeEntryを登録します。
ここでのBiomeTypeは、BiomeDictionaryのTypeとは別でもっと大きく分類されたタイプです。
BiomeEntryの第二引数はweightで大きいほど生成されやすくなります。
何回かテストしてみた感覚では、10で普通のバイオームくらい、100にするとそのBiomeTypeではほとんど登録したバイオームしか見かけないような印象でした。
BiomeManagerのaddSpawnBiomeは初期スポーン地点になる可能性のあるバイオームとして登録します。
これらを登録して、新たな世界を作成すれば登録したバイオームが生成されるはずです。