Jump to content

Ore Generation 1.16.5


wforte6

Recommended Posts

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

 

sc.png

Edited by wforte6
Link to comment
Share on other sites


@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

 

Link to comment
Share on other sites

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 by Luis_ST
  • Like 1
Link to comment
Share on other sites

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!

  • Like 1
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by kiou.23
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

  • Thanks 1
Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.