Jump to content

[1.8.9] Frustrations with oregen


blahblahbal

Recommended Posts

I've been meaning to post this for quite a while, but just never got around to it. I'm having issues with consistency in ore generation, such that one or more ores/blocks won't generate in the world.

 

Here is the code for the generation (in CommonProxy.init()):  https://github.com/blahblahbal/Blah-s-Minecraft-Mod/blob/Structure-fix/src/main/java/blahblahbal/blahmod/CommonProxy.java
Here is the BlahWorldGen file:  https://github.com/blahblahbal/Blah-s-Minecraft-Mod/blob/Structure-fix/src/main/java/blahblahbal/blahmod/world/BlahWorldGen.java

And the BlahWorldGen2 file:  https://github.com/blahblahbal/Blah-s-Minecraft-Mod/blob/Structure-fix/src/main/java/blahblahbal/blahmod/world/BlahWorldGen2.java

 

To further explain:

- Before I moved sulphur ore generation to the Nether, it wouldn't always generate in igneous rock. Now it generates in Netherrack just fine.

- Lumite ore doesn't generate at the moment. I have no clue why this is happening, as it seems to be completely random when it spawns and when it doesn't. If, for example, I were to move the lines in CommonProxy.init() around, swapping lines, some of them will not generate.

 

Is there anything I'm missing about the generation of ores that could be causing this issue?

Link to comment
Share on other sites

https://github.com/blahblahbal/Blah-s-Minecraft-Mod/blob/Structure-fix/src/main/java/blahblahbal/blahmod/world/BlahWorldGen2.java#L53

Why are you comparing strings? There is a BiomeDictionary class for biome checking. Why is everything about your code always stringly typed? :D

https://github.com/blahblahbal/Blah-s-Minecraft-Mod/blob/Structure-fix/src/main/java/blahblahbal/blahmod/world/BlahWorldGen2.java#L61

You are not multiplying chunkX and Z by 16. Yes, WorldGenMinable indeed wants block coordinates and not chunk coordinates.

https://github.com/blahblahbal/Blah-s-Minecraft-Mod/blob/Structure-fix/src/main/java/blahblahbal/blahmod/world/BlahWorldGen.java#L68

Why are you even holding dimension ID in an array if you are always comparing with the first element and never with the rest of the array? Why are you even iterating over that array then? Did you mean to type 

int dimID = dimensions[i];

? ;)

  • Like 1
Link to comment
Share on other sites

This is my class I use for ore generation. Basically, it takes a block that you make and has it generate in your world.

package org.gardenstreetacademy.cool.worldgen;

import java.util.Random;

import org.gardenstreetacademy.cool.init.ModBlocks;

import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkGenerator;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable;
import net.minecraft.world.gen.feature.WorldGenerator;
import net.minecraftforge.fml.common.IWorldGenerator;

public class ModWorldGen implements IWorldGenerator {
	private WorldGenerator gen_example;
	
	public ModWorldGen() {
		this.gen_example = new WorldGenMinable(ModBlocks.example_block.getDefaultState(),12);
	}

	@Override
	public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
		
		switch (world.provider.getDimension()) {
		case 0: //Overworld
			//this.modOreGenerator(this.gen_example, world, random, chunkX, chunkZ, 100, 0, 128);
			break;
		case -1: //Nether
			
			break;
		case 1: //End
			
			break;
		}
	}

	
	private void modOreGenerator(WorldGenerator generator, World world, Random rand, int chunk_X, int chunk_Z, int chancesToSpawn, int minHeight, int maxHeight) {
	    if (minHeight < 0 || maxHeight > 256 || minHeight > maxHeight)
	        throw new IllegalArgumentException("Illegal Height Arguments for WorldGenerator");

	    int heightDiff = maxHeight - minHeight + 1;
	    for (int i = 0; i < chancesToSpawn; i ++) {
	        int x = chunk_X * 16 + rand.nextInt(16);
	        int y = minHeight + rand.nextInt(heightDiff);
	        int z = chunk_Z * 16 + rand.nextInt(16);
	        generator.generate(world, rand, new BlockPos(x, y, z));
	    }
	}

	public static int getGroundFromAbove(World world, int x, int z){
		int y = 255;
		boolean foundGround = false;
		while(!foundGround && y-- >=0){
			Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock();
			foundGround = blockAt == Blocks.DIRT || blockAt == Blocks.GRASS;
		}
		return y;
	}

}

 

Link to comment
Share on other sites

I have no clue how the chunk<X or Z> * 16 was missed by me, as it's in BlahWorldGen, and I'm pretty sure I just duplicated the code for the second file. I should probably merge the two of those generators, and use a boolean to determine which it should use.

 

The reason my code for checking the biome is string-based is because that's how a tutorial showed me how to do it. How would I use the BiomeDictionary to check if the biome the generator is in is a certain biome? I've looked in the BiomeDictionary source file and can't find any method that looks promising.

Edited by blahblahbal
Link to comment
Share on other sites

If you want your worldgen to only occure in a specific biome you can compare it to your biome object directly. Biomes, like blocks and items are singletons.

BiomeDictionary is good if you want your ore to generate in 'similar' biomes (ex.: if you are adding a generic salt ore and want it to generate on beaches it might be a good idea to use BiomeDictionary::areBiomesSimilar to also generate in beach biomes from other mods)

  • Like 1
Link to comment
Share on other sites

How do I get the coordinates? Same as what I'm doing currently, except without the biomeName field?

 

For example, I want to make Topaz Ore only generate in Desert biomes, and Sapphire Ore only generate in Ocean biomes. Similar to how Emerald Ore only generates in Extreme Hills.

Link to comment
Share on other sites

Yes, you get the coordinates exactly the same way(don't forget to multiply by 16/lshift by 4), get the biome at those coordinates and either hardcode it with a reference check(==) or do BiomeDictionary::areBiomesSimilar(biomeAtCoords, biomeYouWantOreToSpawnIn)

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.