Jump to content

[1.8.9] Generate biome terrain beneath the surface


blahblahbal

Recommended Posts

I've been working on a biome in which the stone beneath the surface (to a point) is replaced with a variant. The code I have now works to a degree, but this is what happens when it generates a cave:

2017-05-27_07_39_55.thumb.png.a5b56dc9226f1baec924f7cf0e7e4dc3.png

 

I'm pretty sure I know why this happens (the vanilla gen doesn't recognize the variant and thus does not replace it with air), but what I don't know is how to fix it. Here is the code:

 

public void generateBiomeTerrain2(World worldIn, Random rand, ChunkPrimer chunkPrimerIn, int p_180628_4_, int p_180628_5_, double p_180628_6_)
    {
        int i = 63;
        IBlockState iblockstate = this.topBlock;
        IBlockState iblockstate1 = this.fillerBlock;
        IBlockState seashell = ModBlocks.seashell.getDefaultState();
        int rn2 = rand.nextInt(4);
        if (rn2 == 0)
        	seashell = ModBlocks.seashell.getDefaultState().withProperty(FACING, EnumFacing.EAST);
        else if (rn2 == 1)
        	seashell = ModBlocks.seashell.getDefaultState().withProperty(FACING, EnumFacing.WEST);
        else if (rn2 == 2)
        	seashell = ModBlocks.seashell.getDefaultState().withProperty(FACING, EnumFacing.SOUTH);
        else if (rn2 == 3)
        	seashell = ModBlocks.seashell.getDefaultState().withProperty(FACING, EnumFacing.NORTH);
        IBlockState l_seashell = ModBlocks.largeSeashell.getDefaultState();
        int rn = rand.nextInt(4);
        if (rn == 0)
        	l_seashell = ModBlocks.largeSeashell.getDefaultState().withProperty(FACING, EnumFacing.EAST);
        else if (rn == 1)
        	l_seashell = ModBlocks.largeSeashell.getDefaultState().withProperty(FACING, EnumFacing.WEST);
        else if (rn == 2)
        	l_seashell = ModBlocks.largeSeashell.getDefaultState().withProperty(FACING, EnumFacing.SOUTH);
        else if (rn == 3)
        	l_seashell = ModBlocks.largeSeashell.getDefaultState().withProperty(FACING, EnumFacing.NORTH);
        int j = -1;
        int k = (int)(p_180628_6_ / 3.0D + 3.0D + rand.nextDouble() * 0.25D);
        int l = p_180628_4_ & 15;
        int i1 = p_180628_5_ & 15;

        for (int ypos = 255; ypos >= 0; --ypos)
        {
            if (ypos <= rand.nextInt(5))
            {
                chunkPrimerIn.setBlockState(i1, ypos, l, Blocks.bedrock.getDefaultState());
            }
            else
            {
                IBlockState iblockstate2 = chunkPrimerIn.getBlockState(i1, ypos, l);

                if (iblockstate2.getBlock().getMaterial() == Material.air)
                {
                    j = -1;
                }
                else if (iblockstate2.getBlock() == Blocks.stone)
                {
                    if (ypos >= 32 - rand.nextInt(7))
                    {
                    	chunkPrimerIn.setBlockState(i1, ypos, l, ModBlocks.tropicStone.getDefaultState());
                    }
                    if (j == -1)
                    {
                    	if (k <= 0)
                    	{
                    		iblockstate = null;
                    		iblockstate1 = ModBlocks.blackSand.getDefaultState();
                    	}
                    	else if (ypos >= i - 4 && ypos <= i + 1)
                    	{
                    		iblockstate = ModBlocks.blackSand.getDefaultState();
                    		iblockstate1 = ModBlocks.blackSand.getDefaultState();
                    	}
                        j = k;
                        if (ypos >= i - 1)
                        {
                        	if (rand.nextInt(40) == 0 && chunkPrimerIn.getBlockState(i1, ypos + 1, l).getBlock().getMaterial() == Material.air)
                        	{
                        		if (rand.nextInt(35) == 0) chunkPrimerIn.setBlockState(i1, ypos + 1, l, l_seashell);
                        		else chunkPrimerIn.setBlockState(i1, ypos + 1, l, seashell);
                        	}
                        	chunkPrimerIn.setBlockState(i1, ypos, l, ModBlocks.blackSand.getDefaultState());
                        }
                        else if (ypos < i - 1 && ypos >= i - 7 - k)
                        {
                        	iblockstate = null;
                        	iblockstate1 = ModBlocks.tropicStone.getDefaultState();
                        }
                        else if (ypos < i - 7 - k)
                        {
                            iblockstate = null;
                            iblockstate1 = ModBlocks.tropicStone.getDefaultState();
                            chunkPrimerIn.setBlockState(i1, ypos, l, Blocks.gravel.getDefaultState());
                        }
                        else
                        {
                            chunkPrimerIn.setBlockState(i1, ypos, l, iblockstate1);
                        }
                    }
                    else if (j > 0)
                    {
                        --j;
                        chunkPrimerIn.setBlockState(i1, ypos, l, iblockstate1);

                        if (j == 0 && iblockstate1.getBlock() == ModBlocks.blackSand)
                        {
                            j = rand.nextInt(4) + Math.max(0, ypos - 63);
                            iblockstate1 = ModBlocks.blackSandstone.getDefaultState();
                        }
                        /*if (j == 0 && iblockstate1.getBlock() == Blocks.stone)
                        {
                        	//j = rand.nextInt(4) + Math.max(0, ypos - 63);
                        	int rn3 = 7 + rand.nextInt(15) 
                        	if (ypos >= rn3)
                        	chunkPrimerIn.setBlockState(i1, ypos, l, ModBlocks.tropicStone.getDefaultState());
                        }*/
                    }
                }
            }
        }
    }

 

I don't think there needs to be any more code shown, but if I'm wrong, let me know.

Link to comment
Share on other sites

Cave creation seems to work around all manner of custom ores, so you might be able to do your stone variant as a kind of "ore" generation that is restricted by biome. NB: If you generate large amounts of this stuff, just be careful that it doesn't overflow its chunk boundaries (contributing to runaway terrain-gen).

 

BTW,  Do you get vanilla coal and iron ore bodies forming in your variant stone? Do you want them? By delaying your replacement until ore-generation, you might also control vanilla ores.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

I actually don't get vanilla coal and iron in the stone. I 'fixed' this by creating a variant of coal and iron ore that only generates in the variant stone.

 

I thought about using the ore generator to replace the stone, but then the problem is getting the borders, like you said. I guess it wouldn't be too problematic if it extended partially outside the biome. I'll try this way of generating the stone.

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.