Posted March 14, 20214 yr I have a custom biome, and I want to add custom features to it. however, using ".withFeature()", in the biome generation settings isn't working, because the biome gets initialized before the features does, giving me a Null Pointer Exception Biome (gets initialized through a deferred register): @Mod.EventBusSubscriber(modid = Main.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ModBiomes { public static final DeferredRegister<Biome> BIOMES = DeferredRegister.create(ForgeRegistries.BIOMES, Main.MOD_ID); public static final RegistryObject<Biome> EFFETE_FOREST = BIOMES.register("effete_forest", Maker::EffeteForest); @SubscribeEvent public static void setupBiomes(FMLCommonSetupEvent event) { event.enqueueWork(() -> setupBiome(EFFETE_FOREST.get(), BiomeManager.BiomeType.WARM, 10000000, //1000 Type.NETHER, Type.FOREST, Type.HOT, Type.DRY) ); } private static void setupBiome(Biome biome, BiomeManager.BiomeType type, int weight, Type... types) { RegistryKey<Biome> key = RegistryKey.getOrCreateKey( ForgeRegistries.Keys.BIOMES, Objects.requireNonNull(ForgeRegistries.BIOMES.getKey(biome), "Biome registry name was null") ); BiomeDictionary.addTypes(key, types); BiomeManager.addBiome(type, new BiomeManager.BiomeEntry(key, weight)); } private static class Maker { private static Biome EffeteForest() { BiomeGenerationSettings genset = new BiomeGenerationSettings.Builder() .withFeature(GenerationStage.Decoration.VEGETAL_DECORATION, ModFeatures.EFFETE_STEM_CONFIG) // Above line gives a null pointer exception since EFFETE_STEM_CONFIG hasn't been initialized yet .withFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.RED_MUSHROOM_NETHER) .withFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Features.NETHER_SPROUTS) .withFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_GOLD_NETHER) .withFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Features.ORE_QUARTZ_NETHER) .withStructure(StructureFeatures.BASTION_REMNANT) .withStructure(StructureFeatures.NETHER_FOSSIL) .withStructure(StructureFeatures.RUINED_PORTAL_NETHER) .withSurfaceBuilder(ModConfiguredSurfaceBuilders.EFFETE_SURFACE_BUILDER) .build(); MobSpawnInfo mobspawn = new MobSpawnInfo.Builder() .withSpawner(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.CAT, 4, 2, 4)) .copy(); BiomeAmbience ambience = new BiomeAmbience.Builder() .withGrassColor(0xDA67C1) .setFogColor(0xEEEEEE) .setWaterColor(0xCF21B8) .setWaterFogColor(0xCF78C5) .withSkyColor(0xE83452) .withFoliageColor(0xCA57C1) .build(); return new Biome.Builder() .category(Biome.Category.NETHER) .withTemperatureModifier(Biome.TemperatureModifier.NONE) .withGenerationSettings(genset) .withMobSpawnSettings(mobspawn) .depth(0.09f) .scale(0.2f) .downfall(0.1f) .precipitation(Biome.RainType.NONE) .temperature(1.1f) .setEffects(ambience) .build(); } } } Feature (gets initialized in Common setup): @Mod.EventBusSubscriber(modid = Main.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ModFeatures { public static ConfiguredFeature<?, ?> EFFETE_STEM_CONFIG; @SubscribeEvent public static void setup(FMLCommonSetupEvent e) { EFFETE_STEM_CONFIG = register("effete_stem_feature", Feature.RANDOM_PATCH .withConfiguration( (new BlockClusterFeatureConfig.Builder( new SimpleBlockStateProvider(ModBlocks.EFFETE_STEM.get().getDefaultState()), new EffeteColumnBlockPlacer(1, 2) )).tries(3).ySpread(0).func_227317_b_().build() ).withPlacement( Placement.COUNT_MULTILAYER.configure(new FeatureSpreadConfig(5)).square() ) ); } private static <FC extends IFeatureConfig> ConfiguredFeature<FC, ?> register(String key, ConfiguredFeature<FC, ?> configuredFeature) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, key, configuredFeature); } }
March 14, 20214 yr You should register your features inside their apposite registry event. Also, there is another version of the BiomeGenerationSettings.Builder#withFeature method that takes in a Supplier<ConfiguredFeature<?, ?>>. You can look here to see an example on registering custom biomes with their custom features: https://github.com/Beethoven92/BetterEndForge/blob/master/src/main/java/mod/beethoven92/betterendforge/BetterEnd.java Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.