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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • So I saw that mixin is shipped as a library with forge, but is it available for 1.7.10 ?  
    • So I've read the EULA, and lets be straight...     If I split my modpack(of my mods, yeah I'm nuts) into several(many) individual mods(like just one boss) with minor additions(plus not working together), then have a complete/modpack version on patreon/onlyfans having each addon work together... Would people buy my idea?
    • German A1 – C1, TestDAF, Goethe B1, B2, C1, C2, valid GOETHE certificate German A1 – C1, TestDAF, Goethe B1, B2, C1, C2, valid GOETHE certificate(+27(838-80-8170
    • Done, it still crashed. New log https://paste.ee/p/kYv6e
    • I am migrating a mod from 1.16.5 to 1.20.2 The version for 1.16.5 can be found here https://github.com/beothorn/automataCraft For the block called automata_start, it uses TileEntities and has blockstates, model/block and textures on json files. This is currently working fine on 1.16.5 https://github.com/beothorn/automataCraft/tree/master/src/main/resources/assets/automata For 1.20.2 I migrated the logic from TileEntities to BlockEntity. The mod is working fine. All blocks and Items are working with the correct textures except for the textures for each state of the automata_start block. No changes where made to the json files. This is the branch I am working on (there were some refactorings, but all is basically the same): https://github.com/beothorn/automataCraft/tree/1_20/src/main/resources/assets/automata The only difference I can think that may be related is that i had to implement createBlockStateDefinition on the BaseEntityBlock: https://github.com/beothorn/automataCraft/blob/1_20/src/main/java/br/com/isageek/automata/automata/AutomataStartBlock.java#L43 This is driving me crazy. I know the jsons are being loaded as I put a breakpoint at `net.minecraft.client.resources.model.ModelBakery#loadModel` and I can see BlockModelDefinition.fromJsonElement being called with automata_start. I also printed the state from the arguments of the tick function call and they look correct (https://github.com/beothorn/automataCraft/blob/1_20/src/main/java/br/com/isageek/automata/automata/Ticker.java#L32 ): blockState Block{automata:automata_start}[state=loadreplaceables] In game, all I see is the no textures. I think it is weird it is not the "missing texture" texture so I think it may be related to the material, but I had no success tweaking it (https://github.com/beothorn/automataCraft/blob/1_20/src/main/java/br/com/isageek/automata/automata/AutomataStartBlock.java#L37).   public static final Property<AutomataStartState> state = EnumProperty.create("state", AutomataStartState.class); private final AtomicReference<RegistryObject<BlockEntityType<?>>> blockEntityType; private final Map<String, RegistryObject<Block>> registeredBlocks; public AutomataStartBlock( final AtomicReference<RegistryObject<BlockEntityType<?>>> blockEntityType, final Map<String, RegistryObject<Block>> registeredBlocks ) { super(BlockBehaviour.Properties.of().mapColor(MapColor.STONE).strength(1.5F, 6.0F)); this.blockEntityType = blockEntityType; this.registeredBlocks = registeredBlocks; this.registerDefaultState(this.getStateDefinition().any().setValue(state, AutomataStartState.LOAD_REPLACEABLES)); } @Override protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> stateBuilder) { stateBuilder.add(state); }     So my cry for help is, anyone has any ideas? Is there a way to easily debug this, for example somewhere where I can list the textures for a given state, or make sure this is loaded?   Thanks in advance for the hints
  • Topics

×
×
  • Create New...

Important Information

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