planetguy Posted April 17, 2013 Posted April 17, 2013 I have isolated the error to this block because with the line that loads it commented out, it works fine. With the block loaded, it gives me this stack trace when I try to load a world: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2245) at java.util.Arrays.copyOf(Arrays.java:2219) at java.util.ArrayList.grow(ArrayList.java:213) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187) at java.util.ArrayList.add(ArrayList.java:411) at net.minecraft.util.AABBPool.getAABB(AABBPool.java:51) at net.minecraft.block.Block.getCollisionBoundingBoxFromPool(Block.java:593) at net.minecraft.block.Block.addCollisionBoxesToList(Block.java:559) at net.minecraft.world.World.getCollidingBoundingBoxes(World.java:1681) at net.minecraft.entity.player.EntityPlayerMP.<init>(EntityPlayerMP.java:178) at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:383) at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:674) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:570) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:127) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:468) at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16) I started my Minecraft passing in 2GB as the JVM memory allocation, and it took up all of it, so I think there must be a problem in my code. (I can consistently trigger or avoid it by commenting/uncommenting the part in my main class that loads the block below.) The block itself: package planetguy.Gizmos.timebomb; import java.util.Random; import planetguy.Gizmos.ConfigHolder; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.item.EntityTNTPrimed; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.Icon; import net.minecraft.world.World; public class BlockTimeBomb extends Block{ private Icon topTex; private Icon bottomTex; public BlockTimeBomb(int id) { super(id, Material.tnt); this.setTickRandomly(true); this.setCreativeTab(CreativeTabs.tabRedstone); // TODO Auto-generated constructor stub } public void registerIcons(IconRegister ir){ System.out.println("GraviBomb textures loading"); topTex=ir.registerIcon(ConfigHolder.modName+":"+"bombTop"); bottomTex=ir.registerIcon(ConfigHolder.modName+":"+"bombBottom"); } @SideOnly(Side.CLIENT) public Icon getBlockTextureFromSideAndMetadata(int side, int meta){ if(side==0||side==1){ return topTex; } if(meta%2==0){//We're a plain time bomb }else{//Fork bomb > } return topTex; } public void updateTick(World w, int x, int y, int z, Random r){ int curMeta=w.getBlockMetadata(x,y,z); int a=r.nextInt(5); if(a==0){ curMeta+=2; } if(curMeta>15){ w.spawnEntityInWorld(new EntityTNTPrimed(w, (double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), (EntityLiving) null)); } w.setBlockMetadataWithNotify(x, y, z, curMeta, 0x02); } public boolean onBlockActivated(World w, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9){ fork(w,x,y,z); return true; } /** The fork method for the fork bomb variant of the time bomb. Moves the bomb to all available spaces * around it, or if there isn't space leaves it where it is. * */ private void fork(World w, int x, int y, int z){ if(w.getBlockMetadata(x, y, z)%2!=1||!ConfigHolder.allowFB){ return; } boolean hasReplaced=false; int meta=w.getBlockMetadata(x, y, z); if(w.getBlockMaterial(x+1, y, z)==Material.air){ w.setBlock(x+1, y, z, ConfigHolder.timeExplosivesID, meta, 0x02); hasReplaced=true; } if(w.getBlockMaterial(x-1, y, z)==Material.air){ w.setBlock(x-1, y, z, ConfigHolder.timeExplosivesID, meta, 0x02); hasReplaced=true; } if(w.getBlockMaterial(x, y+1, z)==Material.air){ w.setBlock(x, y+1, z, ConfigHolder.timeExplosivesID, meta, 0x02); hasReplaced=true; } if(w.getBlockMaterial(x, y-1, z)==Material.air){ w.setBlock(x, y-1, z, ConfigHolder.timeExplosivesID, meta, 0x02); hasReplaced=true; } if(w.getBlockMaterial(x, y, z+1)==Material.air){ w.setBlock(x, y, z+1, ConfigHolder.timeExplosivesID, meta, 0x02); hasReplaced=true; } if(w.getBlockMaterial(x, y, z-1)==Material.air){ w.setBlock(x, y, z-1, ConfigHolder.timeExplosivesID, meta, 0x02); hasReplaced=true; } if(hasReplaced){ w.setBlockToAir(x, y, z); } } } Can anyone help me with this one? Quote
Neowulf Posted April 17, 2013 Posted April 17, 2013 Looks like the fork bit is capable of infinite recursion to me. Quote
planetguy Posted April 17, 2013 Author Posted April 17, 2013 Looks like the fork bit is capable of infinite recursion to me. I don't see it. I don't think it calls itself, and I don't see how changing blocks would fire an onBlockActivated event in any changed. I'm not even at the stage of having a testable fork bomb yet, but when this crashed my game it was partly through wgen and hadn't started lighting. Swamp biomes look funny with the mushrooms hovering in midair and no leaves on the trees. Quote
Neowulf Posted April 17, 2013 Posted April 17, 2013 Try commenting out the internals of fork and see what happens. 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.