insane_gravy Posted December 25, 2012 Posted December 25, 2012 I have written code for a custom tree, but it doesn't generate no matter how much I tweak the code. I'm totally lost and don't know what to do. If it helps, I copied the code used by WorldGenTrees and replaced some of the variables. The relevant files are: package insanegravy.herbcraft.common; import java.util.Random; import net.minecraft.src.IChunkProvider; import net.minecraft.src.World; import net.minecraft.src.WorldGenMinable; import cpw.mods.fml.common.IWorldGenerator; public class HerbcraftWorldGenerator implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId) { case -1: generateNether(world, random, chunkX*16, chunkZ*16); case 0: generateSurface(world, random, chunkX*16, chunkZ*16); } } private void generateSurface(World world, Random random, int i, int j) { /* for (int n = 0; n < 30; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(61); (new WorldGenMinable(modHerbcraft.OreTin.blockID, 5)).generate(world, random, X, Y, Z); } for (int n = 0; n < 3; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(51); (new WorldGenMinable(modHerbcraft.OreAthentumite.blockID, 1)).generate(world, random, X, Y, Z); }*/ for (int n = 0; n < 100; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(); (new WorldGenObbywood(true)).generate(world, random, X, Y, Z); } } private void generateNether(World world, Random random, int i, int j) { } } package insanegravy.herbcraft.common; import java.util.Random; import net.minecraft.src.Block; import net.minecraft.src.Direction; import net.minecraft.src.World; import net.minecraft.src.WorldGenTrees; import net.minecraft.src.WorldGenerator; public class WorldGenObbywood extends WorldGenerator { /** The minimum height of a generated tree. */ private final int minTreeHeight; /** True if this tree should grow Vines. */ private final boolean vinesGrow; /** The metadata value of the wood to use in tree generation. */ private final int metaWood; /** The metadata value of the leaves to use in tree generation. */ private final int metaLeaves; public WorldGenObbywood(boolean par1) { this(par1, 4, 0, 0, false); } public WorldGenObbywood(boolean par1, int par2, int par3, int par4, boolean par5) { super(par1); this.minTreeHeight = par2; this.metaWood = par3; this.metaLeaves = par4; this.vinesGrow = par5; } public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) { int var6 = par2Random.nextInt(3) + this.minTreeHeight; boolean var7 = true; if (par4 >= 1 && par4 + var6 + 1 <= 256) { int var8; byte var9; int var11; int var12; for (var8 = par4; var8 <= par4 + 1 + var6; ++var8) { var9 = 1; if (var8 == par4) { var9 = 0; } if (var8 >= par4 + 1 + var6 - 2) { var9 = 2; } for (int var10 = par3 - var9; var10 <= par3 + var9 && var7; ++var10) { for (var11 = par5 - var9; var11 <= par5 + var9 && var7; ++var11) { if (var8 >= 0 && var8 < 256) { var12 = par1World.getBlockId(var10, var8, var11); Block block = Block.blocksList[var12]; if (var12 != 0 && !block.isLeaves(par1World, var10, var8, var11) && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && !block.isWood(par1World, var10, var8, var11)) { var7 = false; } } else { var7 = false; } } } } if (!var7) { return false; } else { var8 = par1World.getBlockId(par3, par4 - 1, par5); if ((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && par4 < 256 - var6 - 1) { this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID); var9 = 3; byte var18 = 0; int var13; int var14; int var15; for (var11 = par4 - var9 + var6; var11 <= par4 + var6; ++var11) { var12 = var11 - (par4 + var6); var13 = var18 + 1 - var12 / 2; for (var14 = par3 - var13; var14 <= par3 + var13; ++var14) { var15 = var14 - par3; for (int var16 = par5 - var13; var16 <= par5 + var13; ++var16) { int var17 = var16 - par5; Block block = Block.blocksList[par1World.getBlockId(var14, var11, var16)]; if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && (block == null || block.canBeReplacedByLeaves(par1World, var14, var11, var16))) { this.setBlockAndMetadata(par1World, var14, var11, var16, modHerbcraft.Desertleaves.blockID, this.metaLeaves); } } } } for (var11 = 0; var11 < var6; ++var11) { var12 = par1World.getBlockId(par3, par4 + var11, par5); Block block = Block.blocksList[var12]; if (var12 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var11, par5)) { this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, modHerbcraft.Desertwood.blockID, this.metaWood); if (this.vinesGrow && var11 > 0) { if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3 - 1, par4 + var11, par5)) { this.setBlockAndMetadata(par1World, par3 - 1, par4 + var11, par5, Block.vine.blockID, ; } if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3 + 1, par4 + var11, par5)) { this.setBlockAndMetadata(par1World, par3 + 1, par4 + var11, par5, Block.vine.blockID, 2); } if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3, par4 + var11, par5 - 1)) { this.setBlockAndMetadata(par1World, par3, par4 + var11, par5 - 1, Block.vine.blockID, 1); } if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3, par4 + var11, par5 + 1)) { this.setBlockAndMetadata(par1World, par3, par4 + var11, par5 + 1, Block.vine.blockID, 4); } } } } if (this.vinesGrow) { for (var11 = par4 - 3 + var6; var11 <= par4 + var6; ++var11) { var12 = var11 - (par4 + var6); var13 = 2 - var12 / 2; for (var14 = par3 - var13; var14 <= par3 + var13; ++var14) { for (var15 = par5 - var13; var15 <= par5 + var13; ++var15) { Block block = Block.blocksList[par1World.getBlockId(var14, var11, var15)]; if (block != null && block.isLeaves(par1World, var14, var11, var15)) { if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 - 1, var11, var15) == 0) { this.growVines(par1World, var14 - 1, var11, var15, ; } if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 + 1, var11, var15) == 0) { this.growVines(par1World, var14 + 1, var11, var15, 2); } if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14, var11, var15 - 1) == 0) { this.growVines(par1World, var14, var11, var15 - 1, 1); } if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14, var11, var15 + 1) == 0) { this.growVines(par1World, var14, var11, var15 + 1, 4); } } } } } if (par2Random.nextInt(5) == 0 && var6 > 5) { for (var11 = 0; var11 < 2; ++var11) { for (var12 = 0; var12 < 4; ++var12) { if (par2Random.nextInt(4 - var11) == 0) { var13 = par2Random.nextInt(3); this.setBlockAndMetadata(par1World, par3 + Direction.offsetX[Direction.footInvisibleFaceRemap[var12]], par4 + var6 - 5 + var11, par5 + Direction.offsetZ[Direction.footInvisibleFaceRemap[var12]], Block.cocoaPlant.blockID, var13 << 2 | var12); } } } } } return true; } else { return false; } } } else { return false; } } /** * Grows vines downward from the given block for a given length. Args: World, x, starty, z, vine-length */ private void growVines(World par1World, int par2, int par3, int par4, int par5) { this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5); int var6 = 4; while (true) { --par3; if (par1World.getBlockId(par2, par3, par4) != 0 || var6 <= 0) { return; } this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5); --var6; } } } Quote
Kore Posted December 25, 2012 Posted December 25, 2012 make sure you set the correct biome that it can spawn in Quote The Korecraft Mod
insane_gravy Posted December 25, 2012 Author Posted December 25, 2012 How would I do that? Do I need another file, or is it part of the class implementing IWorldGenerator? Quote
Kore Posted December 25, 2012 Posted December 25, 2012 nevermind, heres your problem for (int n = 0; n < 100; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(); (new WorldGenObbywood(true)).generate(world, random, X, Y, Z); } fix it to this for (int n = 0; n < 100; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(10); (new WorldGenObbywood(true)).generate(world, random, X+(i*16), Y+64, Z+(j*16)); } in the generate you are only spawning trees in coords x 0-16, z 0-16 Quote The Korecraft Mod
insane_gravy Posted December 26, 2012 Author Posted December 26, 2012 It still doesn't work. I've tried changing the boolean to false, but that doesn't seem to do anything. Also, unless I set the loop to have a small counter size, my client runs out of memory during world creation. Am I missing something? Quote
Kore Posted December 26, 2012 Posted December 26, 2012 yes, i thought it would be a bit laggy, the i=0;i<100;i++ means that the trees will try to spawn 100 times in a single chunk Quote The Korecraft Mod
insane_gravy Posted December 26, 2012 Author Posted December 26, 2012 Figures, but I'm still missing something. All of my ores spawn normally, but the trees don't appear at all. I also checked the chunk at (0,0), and there is nothing there. Am I missing a file, or did I type something incorrectly? Quote
Kore Posted December 27, 2012 Posted December 27, 2012 what is your worldgentree class extending? Quote The Korecraft Mod
insane_gravy Posted December 27, 2012 Author Posted December 27, 2012 It's extending WorldGenerator. I copied the generate method from WorldGenTrees, but changed a couple of lines. For example, this line this.setBlockAndMetadata(par1World, var14, var11, var16, Block.leaves.blockID, this.metaLeaves); reads like this instead this.setBlockAndMetadata(par1World, var14, var11, var16, modHerbcraft.Desertleaves.blockID, this.metaLeaves); Quote
Kore Posted December 27, 2012 Posted December 27, 2012 On 12/27/2012 at 8:35 PM, insane_gravy said: It's extending WorldGenerator. I copied the generate method from WorldGenTrees, but changed a couple of lines. For example, this line this.setBlockAndMetadata(par1World, var14, var11, var16, Block.leaves.blockID, this.metaLeaves); reads like this instead this.setBlockAndMetadata(par1World, var14, var11, var16, modHerbcraft.Desertleaves.blockID, this.metaLeaves); you need to set the this.metaLeaves to 0 because you are not using any metadata Quote The Korecraft Mod
insane_gravy Posted December 29, 2012 Author Posted December 29, 2012 I already have. The constructor assumes metaLeaves = 0 when it's called. Quote
Kore Posted December 29, 2012 Posted December 29, 2012 could you post a spoiler with your new worldgen code in it? Quote The Korecraft Mod
insane_gravy Posted January 4, 2013 Author Posted January 4, 2013 Sorry about taking so long to post this. tree file: package insanegravy.herbcraft.common; import java.util.Random; import net.minecraft.src.Block; import net.minecraft.src.Direction; import net.minecraft.src.World; import net.minecraft.src.WorldGenTrees; import net.minecraft.src.WorldGenerator; public class WorldGenObbywood extends WorldGenerator { /** The minimum height of a generated tree. */ private final int minTreeHeight; /** True if this tree should grow Vines. */ private final boolean vinesGrow; /** The metadata value of the wood to use in tree generation. */ private final int metaWood; /** The metadata value of the leaves to use in tree generation. */ private final int metaLeaves; public WorldGenObbywood(boolean par1) { this(par1, 4, 0, 0, false); } public WorldGenObbywood(boolean par1, int par2, int par3, int par4, boolean par5) { super(par1); this.minTreeHeight = par2; this.metaWood = par3; this.metaLeaves = par4; this.vinesGrow = par5; } public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) { int var6 = par2Random.nextInt(3) + this.minTreeHeight; boolean var7 = true; if (par4 >= 1 && par4 + var6 + 1 <= 256) { int var8; byte var9; int var11; int var12; for (var8 = par4; var8 <= par4 + 1 + var6; ++var8) { var9 = 1; if (var8 == par4) { var9 = 0; } if (var8 >= par4 + 1 + var6 - 2) { var9 = 2; } for (int var10 = par3 - var9; var10 <= par3 + var9 && var7; ++var10) { for (var11 = par5 - var9; var11 <= par5 + var9 && var7; ++var11) { if (var8 >= 0 && var8 < 256) { var12 = par1World.getBlockId(var10, var8, var11); Block block = Block.blocksList[var12]; if (var12 != 0 && !block.isLeaves(par1World, var10, var8, var11) && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && !block.isWood(par1World, var10, var8, var11)) { var7 = false; } } else { var7 = false; } } } } if (!var7) { return false; } else { var8 = par1World.getBlockId(par3, par4 - 1, par5); if ((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && par4 < 256 - var6 - 1) { this.setBlock(par1World, par3, par4 - 1, par5, Block.dirt.blockID); var9 = 3; byte var18 = 0; int var13; int var14; int var15; for (var11 = par4 - var9 + var6; var11 <= par4 + var6; ++var11) { var12 = var11 - (par4 + var6); var13 = var18 + 1 - var12 / 2; for (var14 = par3 - var13; var14 <= par3 + var13; ++var14) { var15 = var14 - par3; for (int var16 = par5 - var13; var16 <= par5 + var13; ++var16) { int var17 = var16 - par5; Block block = Block.blocksList[par1World.getBlockId(var14, var11, var16)]; if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && (block == null || block.canBeReplacedByLeaves(par1World, var14, var11, var16))) { this.setBlockAndMetadata(par1World, var14, var11, var16, modHerbcraft.Desertleaves.blockID, this.metaLeaves); } } } } for (var11 = 0; var11 < var6; ++var11) { var12 = par1World.getBlockId(par3, par4 + var11, par5); Block block = Block.blocksList[var12]; if (var12 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var11, par5)) { this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, modHerbcraft.Desertwood.blockID, this.metaWood); if (this.vinesGrow && var11 > 0) { if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3 - 1, par4 + var11, par5)) { this.setBlockAndMetadata(par1World, par3 - 1, par4 + var11, par5, Block.vine.blockID, ; } if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3 + 1, par4 + var11, par5)) { this.setBlockAndMetadata(par1World, par3 + 1, par4 + var11, par5, Block.vine.blockID, 2); } if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3, par4 + var11, par5 - 1)) { this.setBlockAndMetadata(par1World, par3, par4 + var11, par5 - 1, Block.vine.blockID, 1); } if (par2Random.nextInt(3) > 0 && par1World.isAirBlock(par3, par4 + var11, par5 + 1)) { this.setBlockAndMetadata(par1World, par3, par4 + var11, par5 + 1, Block.vine.blockID, 4); } } } } if (this.vinesGrow) { for (var11 = par4 - 3 + var6; var11 <= par4 + var6; ++var11) { var12 = var11 - (par4 + var6); var13 = 2 - var12 / 2; for (var14 = par3 - var13; var14 <= par3 + var13; ++var14) { for (var15 = par5 - var13; var15 <= par5 + var13; ++var15) { Block block = Block.blocksList[par1World.getBlockId(var14, var11, var15)]; if (block != null && block.isLeaves(par1World, var14, var11, var15)) { if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 - 1, var11, var15) == 0) { this.growVines(par1World, var14 - 1, var11, var15, ; } if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 + 1, var11, var15) == 0) { this.growVines(par1World, var14 + 1, var11, var15, 2); } if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14, var11, var15 - 1) == 0) { this.growVines(par1World, var14, var11, var15 - 1, 1); } if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14, var11, var15 + 1) == 0) { this.growVines(par1World, var14, var11, var15 + 1, 4); } } } } } if (par2Random.nextInt(5) == 0 && var6 > 5) { for (var11 = 0; var11 < 2; ++var11) { for (var12 = 0; var12 < 4; ++var12) { if (par2Random.nextInt(4 - var11) == 0) { var13 = par2Random.nextInt(3); this.setBlockAndMetadata(par1World, par3 + Direction.offsetX[Direction.footInvisibleFaceRemap[var12]], par4 + var6 - 5 + var11, par5 + Direction.offsetZ[Direction.footInvisibleFaceRemap[var12]], Block.cocoaPlant.blockID, var13 << 2 | var12); } } } } } return true; } else { return false; } } } else { return false; } } /** * Grows vines downward from the given block for a given length. Args: World, x, starty, z, vine-length */ private void growVines(World par1World, int par2, int par3, int par4, int par5) { this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5); int var6 = 4; while (true) { --par3; if (par1World.getBlockId(par2, par3, par4) != 0 || var6 <= 0) { return; } this.setBlockAndMetadata(par1World, par2, par3, par4, Block.vine.blockID, par5); --var6; } } } worldgen file: package insanegravy.herbcraft.common; import java.util.Random; import net.minecraft.src.IChunkProvider; import net.minecraft.src.World; import net.minecraft.src.WorldGenMinable; import cpw.mods.fml.common.IWorldGenerator; public class HerbcraftWorldGenerator implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId) { case -1: generateNether(world, random, chunkX*16, chunkZ*16); case 0: generateSurface(world, random, chunkX*16, chunkZ*16); } } private void generateSurface(World world, Random random, int i, int j) { /* for (int n = 0; n < 30; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(61); (new WorldGenMinable(modHerbcraft.OreTin.blockID, 5)).generate(world, random, X, Y, Z); } for (int n = 0; n < 3; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(51); (new WorldGenMinable(modHerbcraft.OreAthentumite.blockID, 1)).generate(world, random, X, Y, Z); }*/ //for (int n = 0; n < 5; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(10); (new WorldGenObbywood(false)).generate(world, random, X+(i*16), Y+64, Z+(j*16)); //} } private void generateNether(World world, Random random, int i, int j) { } } Quote
Bishamonten Posted January 5, 2013 Posted January 5, 2013 Quote //for (int n = 0; n < 5; n++) { int X = i + random.nextInt(16); int Z = j + random.nextInt(16); int Y = random.nextInt(10); (new WorldGenObbywood(false)).generate(world, random, X+(i*16), Y+64, Z+(j*16)); //} although probably just for the text I'd like to point out by saying you have ' // ' in front of your for loop and at the end ' //} '. but i think that might be just for your example. The Y layer you have selected is from 64 to 74. which is a good range, but you may want to make sure where you looking for the trees is around that layer. i know in some areas it can be higher or lower. Quote
Recommended Posts
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.