Posted May 26, 20214 yr So a little background I have been working with this for a while trying to troubleshoot this with print out's to see if it is called I will provide the code below to show where I am at with ore gen, it seem's like it is being called but I cannot find the ore generated in the world It is showing my sys print out in the console import net.minecraft.world.gen.placement.Placement; import net.minecraft.world.gen.placement.TopSolidRangeConfig; import net.minecraftforge.common.world.BiomeGenerationSettingsBuilder; import net.minecraftforge.event.world.BiomeLoadingEvent; public class OreGeneration { public static void generateOres(BiomeLoadingEvent event) { if(!(event.getCategory().equals(Biome.Category.NETHER) || !(event.getCategory().equals(Biome.Category.THEEND)))) { generateOre(event.getGeneration(), OreFeatureConfig.FillerBlockType.NATURAL_STONE, ModBlocks.YELLOW_ORE.get().defaultBlockState(), 5, 5, 70, 10000); System.out.println("Ore Generation Called for spongebob"); } } private static void generateOre(BiomeGenerationSettingsBuilder settings, RuleTest fillerType, BlockState stateContainer, int veinSize, int minHeight, int maxHeight, int amount) { settings.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE.configured(new OreFeatureConfig(fillerType, stateContainer, veinSize)) .decorated(Placement.RANGE.configured(new TopSolidRangeConfig(minHeight, 0, maxHeight))) .squared().count(amount).range(64)); System.out.println("Ore Generation Called for spongebob ore generated"); } } Next class is where the Mod event bus is called package com.example.examplemod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.example.examplemod.registry.Registration; import com.example.examplemod.world.OreGeneration; import net.minecraft.block.Blocks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; // The value here should match an entry in the META-INF/mods.toml file @Mod("spongebob") public class TestMod { public static final String MOD_ID = "spongebob"; // Directly reference a log4j logger. private static final Logger LOGGER = LogManager.getLogger(); public TestMod() { Registration.register(); // Register the setup method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); MinecraftForge.EVENT_BUS.addListener(OreGeneration::generateOres); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } private void setup(final FMLCommonSetupEvent event) { // some print code LOGGER.info("HELLO FROM PREINIT"); LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); } } Please assist, I will love you forever Update: I am going to attach where they are getting printed out in the console Edited May 26, 20214 yr by wforte6
May 26, 20214 yr Author @Mod.EventBusSubscriber public class OreGeneration { @SubscribeEvent(priority = EventPriority.HIGHEST) public static void generateOres(BiomeLoadingEvent event) { if(!(event.getCategory().equals(Biome.Category.NETHER) || !(event.getCategory().equals(Biome.Category.THEEND)))) { generateOre(event.getGeneration(), OreFeatureConfig.FillerBlockType.NATURAL_STONE, ModBlocks.YELLOW_ORE.get().defaultBlockState(), 25, 5, 100, 10); System.out.println("Ore Generation Called for spongebob"); } } private static void generateOre(BiomeGenerationSettingsBuilder settings, RuleTest fillerType, BlockState stateContainer, int veinSize, int minHeight, int maxHeight, int amount) { settings.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE.configured(new OreFeatureConfig(fillerType, stateContainer, veinSize)) .decorated(Placement.RANGE.configured(new TopSolidRangeConfig(minHeight, 0, maxHeight))) .squared().count(amount).range(64)); System.out.println("Ore Generation Called for spongebob ore generated"); } } I added the Subscribe event, trying to learn from other posts, still is being called even more frequently now but still no ore is found in the world
May 27, 20214 yr your code looks okay 12 hours ago, wforte6 said: .range(64) this will set the max height to 64, im not 100% sure but it can be that this overwrite your TopSolidRangeConfig if(!(event.getCategory().equals(Biome.Category.NETHER) || !(event.getCategory().equals(Biome.Category.THEEND)))) { This line is completely wrong, if you want to generate your ore in the overworld, because here it is checked whether it is not the end or not the nether, so minecraft will try to generate the ore in all dimensions replace || with && (is not absolutely necessary) you also need to register your ConfigureFeature use this to register your ore private static <FC extends IFeatureConfig> ConfiguredFeature<FC, ?> register(String name, ConfiguredFeature<FC, ?> configuredFeature) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation(MOD_ID, name), configuredFeature); } -> Edit: fix the two errors I have described above and register your feature, this should fix your problem Edited May 27, 20214 yr by Luis_ST
May 27, 20214 yr Author Luis I cannot thank you enough, I have been struggling with ore generation for like two weeks now just going through tutorial's and everything where I swear I had the same code. It really takes someone who is familiar with what they are looking at. I appreciate you and hope you have a great day. My ore has successfully generated. So excited for the future of modding!
May 27, 20214 yr Adding on to this, and for my curiosity, could somebody tell me why my code does work? I was looking at this post to see if I could help because we have nearly identical code, but I couldn't figure out why it wasn't working for him. 12 hours ago, Luis_ST said: you also need to register your ConfigureFeature use this to register your ore private static <FC extends IFeatureConfig> ConfiguredFeature<FC, ?> register(String name, ConfiguredFeature<FC, ?> configuredFeature) { return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation(MOD_ID, name), configuredFeature); } Nowhere in my code do I do this, and I also don't tag any of my functions with @SubscribeEvent. Maybe I'm just misunderstanding how registries and events work. Here is my ore generation class: Spoiler public class OreGeneration { public static void generateOres(final BiomeLoadingEvent event) { if (!(event.getCategory().equals(Biome.Category.NETHER) || event.getCategory().equals(Biome.Category.THEEND))) { generateOre(event.getGeneration(), new erg.voidcraft.common.world.gen.VoidOreRuleTest(Blocks.BEDROCK), VoidcraftBlocks.blockVoidOre.defaultBlockState(), 3, 1, 8, 3); }else if(event.getCategory().equals(Biome.Category.NETHER)) { generateOre(event.getGeneration(), new erg.voidcraft.common.world.gen.VoidOreNetherRuleTest(Blocks.BEDROCK), VoidcraftBlocks.blockNetherVoidOre.defaultBlockState(), 4, 1, 10, 4); }else if(event.getCategory().equals(Biome.Category.THEEND)) { generateOre(event.getGeneration(), new BlockMatchRuleTest(Blocks.END_STONE), VoidcraftBlocks.blockEndVoidOre.defaultBlockState(), 6, 1, 128, 8); } } private static void generateOre(BiomeGenerationSettingsBuilder settings, RuleTest fillerType, BlockState state, int veinSize, int minHeight, int maxHeight, int amount) { settings.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE.configured(new OreFeatureConfig(fillerType, state, veinSize)) .decorated(Placement.RANGE.configured(new TopSolidRangeConfig(minHeight, 0, maxHeight))) .squared().count(amount)); } } And here is my main: Spoiler @Mod(Voidcraft.MODID) public class Voidcraft { public static final String MODID = "voidcraft"; public static IEventBus MOD_EVENT_BUS; public static IEventBus FORGE_EVENT_BUS; public Voidcraft() { MOD_EVENT_BUS = FMLJavaModLoadingContext.get().getModEventBus(); FORGE_EVENT_BUS = MinecraftForge.EVENT_BUS; registerCommonEvents(); FORGE_EVENT_BUS.addListener(EventPriority.HIGH, OreGeneration::generateOres); FORGE_EVENT_BUS.addListener(VoidcraftEntities::registerWorldSpawn); FORGE_EVENT_BUS.register(VoidcraftCommands.class); DistExecutor.runWhenOn(Dist.CLIENT, () -> this::registerClientEvents); } private void registerCommonEvents() { MOD_EVENT_BUS.register(VoidcraftBlocks.class); MOD_EVENT_BUS.register(VoidcraftTiles.class); MOD_EVENT_BUS.register(VoidcraftContainers.class); MOD_EVENT_BUS.register(VoidcraftItems.class); MOD_EVENT_BUS.register(VoidcraftParticles.class); MOD_EVENT_BUS.register(VoidcraftPacketHandler.class); MOD_EVENT_BUS.register(VoidcraftEntities.class); MOD_EVENT_BUS.addListener(VoidcraftEntities::registerAttributes); } public void registerClientEvents() { MOD_EVENT_BUS.register(ClientSetup.class); } } And here is my repo if anyone wants to take a deeper dive: https://github.com/eddie1101/Voidcraft
May 28, 20214 yr 5 hours ago, octa said: Nowhere in my code do I do this, and I also don't tag any of my functions with @SubscribeEvent. Maybe I'm just misunderstanding how registries and events work. You don't need to tag the method with @SubscribeEvent because you're manually adding the event listener method in your Main constructor, here: FORGE_EVENT_BUS.addListener(EventPriority.HIGH, OreGeneration::generateOres); (also, there's no point in setting EventPriority to high) the docs goes into the different ways of attaching your event listeners: https://mcforge.readthedocs.io/en/latest/events/intro/ This line if (!(event.getCategory().equals(Biome.Category.NETHER) || event.getCategory().equals(Biome.Category.THEEND))) { isn't doing s**t, it's flawed logic, you want this to only be true when the biome category is the overwold, right? so walk through it, imagine the biome is in the nether, the left part of the || will be evaluated to false, correctly, but then, the biome is in the nether, but not in the end, the right part will evaluate to true, and false || true == true And about the registering, IIRC you don't "need" to register the feature, but you should, I don't quite remember why, so don't quote me on this. I'll look for where I read this, if I find it I'll add it here as an edit EDIT: found it: Edited May 28, 20214 yr by kiou.23
May 28, 20214 yr 6 minutes ago, kiou.23 said: if (!(event.getCategory().equals(Biome.Category.NETHER) || event.getCategory().equals(Biome.Category.THEEND))) { isn't doing s**t, it's flawed logic Read it again, the expression is !(nether || end) 7 minutes ago, kiou.23 said: IIRC you don't "need" to register the feature , but you should, I don't quite remember why, so don't quote me on this. I'll look for where I read this, if I find it I'll add it here as an edit Then why did registering the feature fix OP's issue? I'm just genuinely curious how this could break his code but not mine. I'll be interested if you find that source.
May 28, 20214 yr 3 minutes ago, octa said: Read it again, the expression is !(nether || end) ohh, my bad then, I'm sorry 4 minutes ago, octa said: Then why did registering the feature fix OP's issue? I'm just genuinely curious how this could break his code but not mine. I'll be interested if you find that source. I edited the source in. the problem the OP had was possibly a different one, I can't really tell tho
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.