Ritz

普段は真面目で優しいFラン大学生

【Minecraft Mod 1.15.2】とっても簡単なバイオームのつくりかた

Minecraft のバージョンは 1.15.2 Forge のバージョンは forge-1.15.2-31.1.24-mdk 開発環境は IntelliJ IDEA Java のバージョンは10

Biome はテクスチャの用意もいらないし Json への書き込みもいらないのでやりやすいし変化が目に見えてわかりやすいので選びました。

まずは Biome のブロックやスポーンを決めるファイルを作ります。 ありえないバイオームも作れてしまうので楽しいです。

IronBiome.java

package your_package;

import net.minecraft.block.Blocks;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntitySpawnPlacementRegistry;
import net.minecraft.entity.EntityType;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.DefaultBiomeFeatures;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.IFeatureConfig;
import net.minecraft.world.gen.feature.NoFeatureConfig;
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder;
import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig;

public class IronBiome extends Biome {
    public IronBiome() {
        super((new Biome.Builder()).surfaceBuilder(SurfaceBuilder.DEFAULT,
                new SurfaceBuilderConfig(Blocks.IRON_BLOCK.getDefaultState(),
                        Blocks.REDSTONE_BLOCK.getDefaultState(),
                        Blocks.DIAMOND_ORE.getDefaultState()))
                .precipitation(RainType.RAIN)
                .category(Category.PLAINS)
                .depth(0.125f)
                .scale(0.05f)
                .temperature(0.0f)
                .downfall(0.5f)
                .waterColor(0x7eb377)
                .waterFogColor(0x364a31)
                );
        this.addStructure(Feature.VILLAGE.withConfiguration(new VillageConfig("village/taiga/town_centers", 6)));

        DefaultBiomeFeatures.addCarvers(this);
        DefaultBiomeFeatures.addMonsterRooms(this);
        DefaultBiomeFeatures.addLakes(this);
        DefaultBiomeFeatures.addOres(this);
        DefaultBiomeFeatures.addExtraEmeraldOre(this);
        this.addSpawn(EntityClassification.MONSTER,new SpawnListEntry(EntityType.SKELETON,100,5,5));
        this.addSpawn(EntityClassification.MONSTER,new SpawnListEntry(EntityType.ZOMBIE,100,5,5));

    }
}

このバイオームは表面が鉄ブロックその下の2~3マスがレッドスト―ンブロック、水の下がダイヤモンド鉱石になっています。 それを設定してくれるのが SurfaceBuilderConfigになってます。 これは new で新しく設定しているので3種類のブロックを書く必要がありますが、もともと設定されているものもあるのでそっちを使っても大丈夫です。 例えばタイがバイオ―ムなら

new SurfaceBuilderConfig(Blocks.IRON_BLOCK.getDefaultState()Blocks.REDSTONE_BLOCK.getDefaultState(),Blocks.DIAMOND_ORE.getDefaultState())

から

SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG

にできます。 ただそれだと既存のバイオームと変わりがなくて面白くないので今回は三つ設定してます。 その下の precipitation などで雨の種類(なし、雨、雪など)や大きさ、深さ、水の色、温度など設定できます。 その次の this.addStructure で構造物の生成ができます。今回はめんどくさかったので村だけですが、襲撃者の砦や沈没船、海底神殿などの追加ができます。別のものが作りたい場合は

this.addStructure(Feature.VILLAGE.withConfiguration(new VillageConfig("village/taiga/town_centers", 6)));
this.addStructure(Feature.PILLAGER_OUTPOST.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG));
this.addStructure(Feature.MINESHAFT.withConfiguration(new MineshaftConfig(0.004D, MineshaftStructure.Type.NORMAL)));
this.addStructure(Feature.STRONGHOLD.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG));

こんな感じでいろいろ加えられます(タイガバイオームから抜粋) Config の書き方は構造物によって違うようなので注意してください。

次の DefaultBiomeFeature.addでは鉱石、湖、モンスタールームなどを加えたりできます。 種類が多すぎるので割愛しますが、予測でいろいろでてくると思うので見てみてください。 これは this で指定するだけなので簡単ですね。

次の this.addSpawn ではスポーンする mob を決めることができます。 ただ気を付けてほしいこととして、動物系の mob は基本的に土ブロックがないと湧いてくれません(イルカなどは別)。 確か継承元の AnimalEntity に書いてあったはずなので気になる方は見てみてください。 予測で出てきた候補は IntelliJ IDEA では CTRL + Bを押せばコードを読むことができます。 だから困ったときはCtrl + Bでコードを見てみてください。read only なので書き込みはできないですが......。

次はバイオームの登録に入ります。 ここに追加するバイオームをまとめて入れておきます。

ModBiome.java

package your_package;

import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeManager;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import BiomeMod;
import IronBiome;

public class ModBiome {
    public static final DeferredRegister<Biome> BIOMES = new DeferredRegister<>(ForgeRegistries.BIOMES, BiomeMod.MOD_ID);
    public static final RegistryObject<Biome> IRON_BIOME = BIOMES.register("iron_biome", IronBiome::new);


}

もう一つ別のやり方があるんですが、今後追加するもののためにこっちで登録します。

次はバイオームをスポーンさせる関数を定義しておく場所を作ります。

BiomeRegister.java

package your_package;


import net.minecraft.world.biome.Biome;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.common.BiomeManager.BiomeEntry;
import net.minecraftforge.common.BiomeManager.BiomeType;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
import net.minecraftforge.registries.ObjectHolder;
import net.minecraftforge.registries.RegistryManager;
import BiomeMod;
import IronBiome;


@ObjectHolder(BiomeMod.MOD_ID)
public class BiomeRegister {
    public static final IronBiome IRON_BIOME = null;

   public static void addBiomes(Biome biome,BiomeType type,int weight){
        BiomeManager.addBiome(type,new BiomeEntry(biome,weight));
        BiomeManager.addSpawnBiome(biome);
    }
}

このaddBiomeという関数でバイオームの追加とスポーン条件を設定してるみたいです(たぶん)。 恐らく BiomeManager.addBiome だけだとスポーンしないのではないかと(予想)。

最後に登録します。 このファイルがバイオームの名前だったりを定義してます。もしかして最初に書いておいた方がよかったかもしれないです(小並感)。

BiomeMod.java

package your_package;

import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.world.biome.*;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import BiomeRegister;
import ModBiome;
import IronBiome;

@Mod(BiomeMod.MOD_ID)
@Mod.EventBusSubscriber(modid = BiomeMod.MOD_ID,bus = Mod.EventBusSubscriber.Bus.MOD)
public class BiomeMod {
    public static final String MOD_ID = "biomemod";
    public BiomeMod(){
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        MinecraftForge.EVENT_BUS.register(this);
        final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        ModBiome.BIOMES.register(modEventBus);
    }
    private void setup(final FMLCommonSetupEvent event){
        BiomeRegister.addBiomes(BiomeRegister.IRON_BIOME, BiomeManager.BiomeType.COOL,5);
    }



}

BiomeModの中でModBiomeの中のバイオームを登録してます。 setup関数でさっきのBiomeRegisterの中のaddBiomeを使ってます。

一応これで必要なファイルは全部書き終わっているので、runClient で動かしてみてください。 Biome がちゃんと生成されているか見たい人はsetup関数のweight値を大きくすると見つけやすい思います。 めんどくさい人はビュッフェ形式があるので、そこでさっき作ったバイオームを選んでみてください。作ったバイオームしかでなくなります。

今回バイオームの登録に使った DeferredRegisterは他のEntityなどにも使うことができます。 本当はフォルダで分けてるんですが、意味が被っているフォルダがあったりしてゴチャついていてわかりにくいのでパッケージがyour_packageになってます。

簡単とか書いたけどずいぶん長くなってしまいました。申し訳ないです。

困ったときは Ctrl + Bを忘れないでください。 1,2枚目は勝手に作ったスライムブロックが表面にあるバイオームでで3枚目が今回作った鉄ブロックとレッドストーンブロックのバイオームです。 f:id:innomono8:20200412153956p:plainf:id:innomono8:20200412153959p:plainf:id:innomono8:20200412153950p:plain 通常ではありえないですね。

Ctrl + B を忘れないでください。

読んでいただきありがとうございます。ではまた。

P.S Ctrl + B を忘れないでください。