Jump to content

Making a block disappear on right click with item error...


StretchFre

Recommended Posts

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)

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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);

 

}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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);

 

}

Link to comment
Share on other sites

 

@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!

Link to comment
Share on other sites

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.

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



×
×
  • Create New...

Important Information

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