Spring Posted November 11, 2021 Share Posted November 11, 2021 hello . I want to register my ore in overworld, but it has no effect Below is my code @Mod.EventBusSubscriber(modid = ApplicationConstants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class OreGenerateEvent { public static ConfiguredFeature<?, ?> COPPER_ORE = null; @SubscribeEvent public static void setup(FMLCommonSetupEvent event) { ConfiguredFeature<?, ?> register = register(String.valueOf(BlockLoader.COPPER_ORE.get().getRegistryName()), Feature.ORE.configured(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, BlockLoader.COPPER_ORE.get().defaultBlockState(), 17)).range(128) .squared().count(20)); } @SubscribeEvent public void onBiomeLoading(final BiomeLoadingEvent biome) { if (biome.getCategory() == Biome.Category.NETHER || biome.getCategory() == Biome.Category.THEEND) { return; } biome.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES) .add(() -> OreGenerateEvent.COPPER_ORE); } private static <FC extends IFeatureConfig> ConfiguredFeature<?, ?> register(String key, ConfiguredFeature<FC, ?> configuredFeature) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, key, configuredFeature); } } I refer to the writing of 1.16.4, but it has no effect If I write like this, NullPointException will be thrown public static final ConfiguredFeature<?, ?> ORE_COAL = register("ore_coal", Feature.ORE.configured(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, BlockLoader.COPPER_ORE.get().defaultBlockState(), 17)).range(128).squared().count(20)); my main class @Mod(value = ApplicationConstants.MOD_ID) public class OceanApplication { public OceanApplication() { MinecraftForge.EVENT_BUS.register(this); IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BlockLoader.BLOCKS.register(modEventBus); ItemLoader.ITEMS.register(modEventBus); } } my BlockLoader class public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ApplicationConstants.MOD_ID); public static RegistryObject<Block> COPPER_ORE = BLOCKS.register("copper_ore", CopperOre::new); How can he correctly realize the ore generation in the overworld? thanks ! Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted November 11, 2021 Share Posted November 11, 2021 (edited) you never use your static field COPPER_ORE, it is still null in BiomeLoadingEvent Edited November 11, 2021 by Luis_ST Quote Link to comment Share on other sites More sharing options...
Spring Posted November 11, 2021 Author Share Posted November 11, 2021 8 minutes ago, diesieben07 said: You also must use enqueueWork in FMLCommonSetupEvent to register your ConfiguredFeature, registries are not threadsafe. like this ? @SubscribeEvent public static void setup(FMLCommonSetupEvent event) { event.enqueueWork(() -> { register(String.valueOf(BlockLoader.COPPER_ORE.get().getRegistryName()), Feature.ORE.configured(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, BlockLoader.COPPER_ORE.get().defaultBlockState(), 17)).range(128) .squared().count(20)); }); } private static <FC extends IFeatureConfig> ConfiguredFeature<?, ?> register(String key, ConfiguredFeature<FC, ?> configuredFeature) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, key, configuredFeature); } Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted November 11, 2021 Share Posted November 11, 2021 58 minutes ago, Spring said: like this ? that still throws a NullPointException, since you still ignore the static Field of your CF, you need to set the Field in FMLCommonSetupEvent using the return value of the register method 1 Quote Link to comment Share on other sites More sharing options...
Spring Posted November 11, 2021 Author Share Posted November 11, 2021 (edited) 59 minutes ago, Luis_ST said: that still throws a NullPointException, since you still ignore the static Field of your CF, you need to set the Field in FMLCommonSetupEvent using the return value of the register method so? public static ConfiguredFeature<?, ?> COPPER_ORE = null; @SubscribeEvent public static void setup(FMLCommonSetupEvent event) { event.enqueueWork(() -> { COPPER_ORE = register(String.valueOf(BlockLoader.COPPER_ORE.get().getRegistryName()), Feature.ORE.configured(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, BlockLoader.COPPER_ORE.get().defaultBlockState(), 17)).range(128) .squared().count(20)); }); } @SubscribeEvent public void onBiomeLoading(final BiomeLoadingEvent biome) { if (biome.getCategory() == Biome.Category.NETHER || biome.getCategory() == Biome.Category.THEEND) { return; } biome.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES) .add(() -> OreGenerateEvent.COPPER_ORE); } private static <FC extends IFeatureConfig> ConfiguredFeature<?, ?> register(String key, ConfiguredFeature<FC, ?> configuredFeature) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, key, configuredFeature); } What to do next, he still hasn’t taken effect onBiomeLoading() Not loaded Edited November 11, 2021 by Spring Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted November 11, 2021 Share Posted November 11, 2021 is the BiomeLoadingEvent fierd? How do you register the Event? Quote Link to comment Share on other sites More sharing options...
Spring Posted November 11, 2021 Author Share Posted November 11, 2021 5 minutes ago, Luis_ST said: is the BiomeLoadingEvent fierd? How do you register the Event? I don’t really understand, what else do I need to register? Quote Link to comment Share on other sites More sharing options...
Spring Posted November 12, 2021 Author Share Posted November 12, 2021 17 hours ago, diesieben07 said: https://mcforge.readthedocs.io/en/1.17.x/events/intro/ Still not working, I followed the tutorial step by step, did I miss anything? @Mod(value = ApplicationConstants.MOD_ID) public class OceanApplication { public OceanApplication() { MinecraftForge.EVENT_BUS.register(this); IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); ModBlocks.BLOCKS.register(modEventBus); ModItems.ITEMS.register(modEventBus); } } @Mod.EventBusSubscriber(modid = ApplicationConstants.MOD_ID) public class BiomeLoadEvent { @SubscribeEvent public void onBiomeLoading(final BiomeLoadingEvent event) { ModOreGeneration.generateOres(event); } } public class ModOreGeneration { public static void generateOres(final BiomeLoadingEvent event) { for (OreType ore : OreType.values()) { OreFeatureConfig oreFeatureConfig = new OreFeatureConfig( OreFeatureConfig.FillerBlockType.NATURAL_STONE, ore.getBlock().get().defaultBlockState(), ore.getMaxVeinSize()); ConfiguredPlacement<TopSolidRangeConfig> configuredPlacement = Placement.RANGE.configured( new TopSolidRangeConfig(ore.getMinHeight(), ore.getMinHeight(), ore.getMaxHeight())); ConfiguredFeature<?, ?> oreFeature = registerOreFeature(ore, oreFeatureConfig, configuredPlacement); event.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).add(() -> oreFeature); } } private static ConfiguredFeature<?, ?> registerOreFeature(OreType ore, OreFeatureConfig oreFeatureConfig, ConfiguredPlacement<?> configuredPlacement) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, Objects.requireNonNull(ore.getBlock().get().getRegistryName()), Feature.ORE.configured(oreFeatureConfig).decorated(configuredPlacement) .squared()); } } Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted November 12, 2021 Share Posted November 12, 2021 where is your FMLCommonSetupEvent Quote Link to comment Share on other sites More sharing options...
Spring Posted November 12, 2021 Author Share Posted November 12, 2021 1 hour ago, Luis_ST said: where is your FMLCommonSetupEvent I deleted it because I didn’t write it in the video tutorial, And i don't know what is needed inside Quote Link to comment Share on other sites More sharing options...
Spring Posted November 12, 2021 Author Share Posted November 12, 2021 3 hours ago, Spring said: I deleted it because I didn’t write it in the video tutorial, And i don't know what is needed inside I got it, I didn't recreate the world Quote Link to comment Share on other sites More sharing options...
Luis_ST Posted November 12, 2021 Share Posted November 12, 2021 problem solved? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.