Posted April 27, 201312 yr My custom flower keeps crashing from the "canBlockStay" part of my code. Not sure what the problem is because its mostly copied from the minecraft BlockFlower class. public class BlockOrangeFlower extends Block implements IPlantable { public BlockOrangeFlower(int par1, Material par2Material) { super(par1, par2Material); this.setTickRandomly(true); float f = 0.2F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 3.0F, 0.5F + f); this.setCreativeTab(CreativeTabs.tabDecorations); this.setStepSound(soundGrassFootstep); } public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) { return super.canPlaceBlockAt(par1World, par2, par3, par4) && canBlockStay(par1World, par2, par3, par4); } /** * Gets passed in the blockID of the block below and supposed to return true * if its allowed to grow on the type of blockID passed in. Args: blockID */ protected boolean canThisPlantGrowOnThisBlockID(int par1) { return par1 == Block.grass.blockID || par1 == Block.dirt.blockID || par1 == Block.tilledField.blockID; } /** * Lets the block know when one of its neighbor changes. Doesn't know which * neighbor changed (coordinates passed are their own) Args: x, y, z, * neighbor blockID */ public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) { super.onNeighborBlockChange(par1World, par2, par3, par4, par5); this.checkFlowerChange(par1World, par2, par3, par4); } /** * Ticks the block if it's been scheduled */ public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) { this.checkFlowerChange(par1World, par2, par3, par4); } protected final void checkFlowerChange(World par1World, int par2, int par3, int par4) { if (!this.canBlockStay(par1World, par2, par3, par4)) { this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); par1World.setBlockToAir(par2, par3, par4); } } /** * Can this block stay at this position. Similar to canPlaceBlockAt except * gets checked often with plants. */ public boolean canBlockStay(World par1World, int par2, int par3, int par4) { Block soil = blocksList[par1World.getBlockId(par2, par3 - 1, par4)]; return (par1World.getFullBlockLightValue(par2, par3, par4) >= 8 || par1World .canBlockSeeTheSky(par2, par3, par4)) && (soil != null && soil.canSustainPlant(par1World, par2, par3 - 1, par4, ForgeDirection.UP, this)); } /** * Returns a bounding box from the pool of bounding boxes (this means this * box can change after the pool has been cleared to be reused) */ public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) { return null; } /** * Is this block (a) opaque and (b) a full 1m cube? This determines whether * or not to render the shared face of two adjacent blocks and also whether * the player can attach torches, redstone wire, etc to this block. */ public boolean isOpaqueCube() { return false; } /** * If this block doesn't render as an ordinary block it will return False * (examples: signs, buttons, stairs, etc) */ public boolean renderAsNormalBlock() { return false; } /** * The type of render function that is called for this block */ public int getRenderType() { return 1; } @Override public EnumPlantType getPlantType(World world, int x, int y, int z) { // TODO Auto-generated method stub return null; } @Override public int getPlantID(World world, int x, int y, int z) { // TODO Auto-generated method stub return 0; } @Override public int getPlantMetadata(World world, int x, int y, int z) { // TODO Auto-generated method stub return 0; } @SideOnly(Side.CLIENT) public void registerIcons(IconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon(Main.modid + ":" + this.getUnlocalizedName2()); } } Crash: java.lang.NullPointerException 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.block.Block.canSustainPlant(Block.java:2213) 2013-04-26 23:51:08 [iNFO] [sTDERR] at derek.main.BlockOrangeFlower.canBlockStay(BlockOrangeFlower.java:79) 2013-04-26 23:51:08 [iNFO] [sTDERR] at derek.main.BlockOrangeFlower.canPlaceBlockAt(BlockOrangeFlower.java:31) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.block.Block.canPlaceBlockOnSide(Block.java:939) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.block.Block.canPlaceBlockOnSide(Block.java:921) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.world.World.canPlaceEntityOnSide(World.java:3773) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.item.ItemBlock.canPlaceItemBlockOnSide(ItemBlock.java:180) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.client.multiplayer.PlayerControllerMP.onPlayerRightClick(PlayerControllerMP.java:376) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.clickMouse(Minecraft.java:1315) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runTick(Minecraft.java:1799) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:834) 2013-04-26 23:51:08 [iNFO] [sTDERR] at net.minecraft.client.Minecraft.run(Minecraft.java:759) 2013-04-26 23:51:08 [iNFO] [sTDERR] at java.lang.Thread.run(Unknown Source) Any help appreciated. http://mag.racked.eu/cimage/i6000/Achievement++get%21/Newb+Modder%21/mca.png[/img]
April 27, 201312 yr You're getting a crash because the canBlockSustainPlant method wants an EnumPlantType, so change getPlantType to this: @Override public EnumPlantType getPlantType(World world, int x, int y, int z) { return EnumPlantType.Plains; } Hope that helped Writing a steampunk mod called MineTech, and author of a long dead fishing mod
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.