初心者modderの備忘録

マイクラのmodを作りたくて、初めて見たのですが難しくて忘れそうなので自分用の備忘録も兼ねてブログにしようと思います

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は初期スポーン地点になる可能性のあるバイオームとして登録します。


これらを登録して、新たな世界を作成すれば登録したバイオームが生成されるはずです。