バイオームに自然湧きするようにします。
一応動画↓
https://youtu.be/lu3AX-MPzIA
既存のバイオームにわかせる方法は詳しく記事を書いている人がいるのでその記事を紹介させてもらいます。
これです↓
https://json-fileman.hatenablog.com/entry/2020/04/22/212358
この記事ではすべてのバイオームに追加したMobを沸かせるようになっています。
ただ自分で追加したバイオームに関してはどうなっているのかわからないので一応その方法だけ書いておきたいと思います。
Mobのコードを全部載せると長くなりすぎてしまうのでないオームの部分とそれの登録部分を載せておきます。
IronBiome.java
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.feature.structure.VillageConfig;
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));
}
public static void generate(IronBiome biome,EntityClassification classification, SpawnListEntry entry){
biome.addSpawn(classification,entry);
}
}
このバイオームでは表面が鉄ブロックでその下がレッドストーンブロックになるように作りました。
一番下のgenerate関数が一番重要な部分です。
正直汚いやり方だと思ってます。
やっぱり
TaigaBiome.getSpawns().add();
という形式でやるのが簡単な気がします。(Taigaは例)
次にバイオームを登録します。
ModBiome.java
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 work.prgrm.biomemod.BiomeMod;
import work.prgrm.biomemod.world.biome.FragileBiome;
import work.prgrm.biomemod.world.biome.IronBiome;
public class ModBiome {
public static final DeferredRegister BIOMES = new DeferredRegister<>(ForgeRegistries.BIOMES, BiomeMod.MOD_ID);
public static final RegistryObject IRON_BIOME = BIOMES.register("iron_biome", IronBiome::new);
}
DeferredRegisterはバイオーム以外にもEntityTypeやItemなどを登録できます。便利です。
次にバイオームを沸かせるための関数を置いておくだけのクラスを作ります。
BiomeRegister.java
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.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
public class BiomeRegister {
public static void addBiomes(Biome biome,BiomeType type,int weight){
BiomeManager.addBiome(type,new BiomeEntry(biome,weight));
BiomeManager.addSpawnBiome(biome);
}
}
addBiomes関数でバイオームを沸かせるだけです。
typeが気温でweightが大きさ(のはず)。
最後にMobをわかせます。
BiomeMod.java
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;
@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(){
// Register the doClientStuff method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::loadComplete);
MinecraftForge.EVENT_BUS.register(this);
final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
ModBiome.BIOMES.register(modEventBus);
ModEntityType.ENTITY_TYPES.register(modEventBus);
}
private void setup(final FMLCommonSetupEvent event){
BiomeRegister.addBiomes(BiomeRegister.IRON_BIOME, BiomeManager.BiomeType.COOL,10);
}
private void loadComplete(final FMLLoadCompleteEvent event){
IronBiome.generate((IronBiome) ModBiome.IRON_BIOME.get(),EntityClassification.MONSTER,new Biome.SpawnListEntry(ModEntityType.CREEPER_MAN.get(),100,1,2));
}
}
FMLCommonSetupEventなどは順番があるので間違ったところに書くとエラーがでます。
最後のloadComplete内でMobを沸かせてます。
以上です。
最後にMobの方も見たい方用に置いておきます。