Posted August 2, 201510 yr Hello. Nothing happens when i try to use this code i entered into my mod's block class file: public boolean onBlockActivated(Block block, World world, EntityPlayer player, Item item, ItemStack itemstack, int x, int y, int z) { if(player.inventory.getCurrentItem().getItem() == Items.bone) { world.setBlock(x, y, z, Blocks.air); System.out.println("rightclick worked"); return true; } return true; } nothing happens. What am i doing wrong? (also, my block file extends Block)
August 2, 201510 yr Author Sorry... i am using eclipse, and i have no idea how to override automatically with it. How do i do this? I tried adding @Override annotation to it(above it) and it did not work, giving me a error. I have no idea how to fix it. Please do not get angry, i am a beginner and have no idea how to @Override, eventhough i know most of the basics. EDIT: OKay.... wow. Yeah your right it was WAY too simple. Sorry to waste your time.
August 2, 201510 yr Author Okay. Now i got a different problem...i tried fixing it a bit, but it still crashes when i right click with nothing in my hand... @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int coords, float one, float two, float three) { Item item = player.getCurrentEquippedItem().getItem(); if(player.getHeldItem() != null) { if(item == MyMod.olKey) { world.setBlock(x, y, z, Blocks.air); player.inventory.consumeInventoryItem(MyMod.olKey); System.out.println("Old Dungeon unlocked"); } else { System.out.println("Are you trying to unlock it with THAT?"); } } else { System.out.println("Stpo trying to pry it open"); } return super.onBlockActivated(world, x, y, z, player, coords, one, two, three); }
August 2, 201510 yr You're calling ItemStack#getItem before checking if the ItemStack (returned from player.getCurrentEquippedItem() ) is null . When it's null , you'll get a NullPointerException because you tried to call a method of a null value. getHeldItem and getCurrentEquippedItem do the exact same thing, you should really only use one. Don't use System.out.println for output that the player is supposed to see in-game. Use EntityPlayer#addChatComponentMessage to send a chat message to a player (make sure you only do it on the client or server, not both). For general logging output, use FMLLog or a wrapper around it. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
August 2, 201510 yr Author You're calling ItemStack#getItem before checking if the ItemStack (returned from player.getCurrentEquippedItem() ) is null . When it's null , you'll get a NullPointerException because you tried to call a method of a null value. getHeldItem and getCurrentEquippedItem do the exact same thing, you should really only use one. Don't use System.out.println for output that the player is supposed to see in-game. Use EntityPlayer#addChatComponentMessage to send a chat message to a player (make sure you only do it on the client or server, not both). For general logging output, use FMLLog or a wrapper around it. Okay, thanks for attempting to help. What i do not understand is i did exactly what you said to do(without the chat thing) but it crashes still. here is my code: @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int coords, float one, float two, float three) { if(player.getHeldItem().getItem() != null) { if(player.getHeldItem().getItem() == MyMod.olKey) { world.setBlock(x, y, z, Blocks.air); player.inventory.consumeInventoryItem(MyMod.olKey); } else { System.out.println("Are you trying to unlock it with THAT?"); } } else { System.out.println("Stpo trying to pry it open"); } return super.onBlockActivated(world, x, y, z, player, coords, one, two, three); }
August 2, 201510 yr You null check the itemstack not the item. Development of Plugins [2012 - 2014] Development of Mods [2012 - Current]
August 3, 201510 yr @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) { if(player.getHeldItem().getItem() != null && player.getHeldItem().getItem() == Items.bone){ world.setBlockToAir(x, y, z); } return super.onBlockActivated(world, x, y, z, player, p_149727_6_, p_149727_7_, p_149727_8_, p_149727_9_); } First you check if the item is null and if it's not then you check if that item is your item. Then you execute your code. Your code is similiar to that right? The problem is that you are putting a condition in the if statement. The above code will work but if a player tries to right click that block with nothing in it's hand it will crash!
August 3, 201510 yr Thanks... But how do i make it so getHeldItem() is not null? You DON'T. You can't help it if a player clicks with nothing in their hand, but you CAN check for it. Null-checking is a very basic concept which you seem to sort of understand, but you are checking the wrong object for null: object.method() <-- this will crash if the object is null player.getHeldItem() <-- returns an ItemStack, or possibly null if not holding anything; would crash if player was null (null.getHeldItem() fails) player.getHeldItem().getItem() <-- returns the Item contained in the ItemStack, thus it crashes if getHeldItem() returns null instead of an actual ItemStack (player.null.getItem() ... yeah, nope) player.getHeldItem().getItem().method() <-- would crash if Item returned from getItem() was null, but that should never be the case If at any time an object (such as player, or the result of a method such as getHeldItem()) is possible to be null, you need to null-check or you WILL crash when that object is null and you try to access a class field or method using it. http://i.imgur.com/NdrFdld.png[/img]
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.