Jump to content

[SOLVED] Giving Items Right Click Abilities


kitsushadow

Recommended Posts

This Code i wrote will check if the item to the left of ur currently equipped item is not null, if not then it will check to see if its the item u want to swap to. If so the swap will occur. It also takes into account items like tools and weapons that could have damage on them.

 

 

@SubscribeEvent

public void onEvent (PlayerUseItemEvent.Stop event) {

 

if (event.entityPlayer instanceof EntityPlayer) {

 

if (event.entityPlayer.getItemInUse().getItem() == ModItems.longSword) {

 

event.entityPlayer.inventory.changeCurrentItem(1);

}

 

if (event.entityPlayer.inventory.getCurrentItem() != null) {

 

i = event.entityPlayer.inventory.getCurrentItem().getItemDamage();

 

}

 

if (event.entityPlayer.inventory.getCurrentItem() != null && event.entityPlayer.inventory.getCurrentItem().isItemEqual(new ItemStack(ModItems.forgeHammer, OreDictionary.WILDCARD_VALUE, i))) {

 

} else event.entityPlayer.inventory.changeCurrentItem(-1);

 

}

 

}

 

Link to comment
Share on other sites

You could use the following code to get the current / equipped item and the item next to it. (I haven't actually tested it so you might have to add an offset to currentItem. Also make sure to test for another item when the last slot is selected.)

@Override
    public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {
        return super.onItemRightClick(s, w, p);
        p.inventory.currentItem; //To get the current equipped item...
        p.inventory.getStackInSlot(p.inventory.currentItem+1);
    }

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Link to comment
Share on other sites

So gave that piece of code a go

 

Current Code:

 

 

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

//p.inventory.getCurrentItem();

//ItemStack y = p.inventory.getStackInSlot(1);

if(p.inventory.hasItem(ModItems.forgeHammer) == true) {

p.inventory.changeCurrentItem(1);

}

 

return super.onItemRightClick(s, w, p);

}

 

 

 

Have a problem: its changing the players slot but its duplicating the sword in the next slot instead of just switching to that slot. I think it has to do with the return statement.

Link to comment
Share on other sites

So I got the checking and switching working, with some big help from a friend. However i've run into another problem. The switch wont work if the item is damaged.

 

Current Semi Working code:

 

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

p.inventory.changeCurrentItem(1);

s = p.inventory.getCurrentItem();

 

if (p.inventory.getCurrentItem() == null) {

p.inventory.changeCurrentItem(-1);

} else if (s.isItemEqual(new ItemStack(ModItems.forgeHammer))) {

i = 0;

} else p.inventory.changeCurrentItem(-1);

 

 

s = p.inventory.getCurrentItem();

 

 

 

y = s.getItemDamage();

s.setItemDamage(y);

return super.onItemRightClick(s, w, p);

}

 

Link to comment
Share on other sites

You have to create the ItemStack for the test with all the damage values:

new ItemStack(ModItems.forgeHammer, 1, Short.maxValue())

 

It might also be Byte.maxValue (I always mix those up)

 

Hmm Short didn't work, and Byte didnt work either also Short.MAX_VALUE and Byte.MAX_VALUE were the only available options. Also u put () after urs, that wasn't a valid option for Short or for Byte.

Link to comment
Share on other sites

First of all, max and min values are fields, not methods. You do not use brackets.

 

Second, they're all CAPS like MAX_VALUE.

 

Lastly, because the 'wildcard value' changes (it used to be -1 I think) you use OreDictionary.WILDCARD_VALUE.

 

Anyway, to compare items just use ItemStack#getItem and then compare the reference, since there is only one instance of your item at a time.

BEFORE ASKING FOR HELP READ THE EAQ!

 

I'll help if I can. Apologies if I do something obviously stupid. :D

 

If you don't know basic Java yet, go and follow these tutorials.

Link to comment
Share on other sites

First of all, max and min values are fields, not methods. You do not use brackets.

 

Second, they're all CAPS like MAX_VALUE.

 

Lastly, because the 'wildcard value' changes (it used to be -1 I think) you use OreDictionary.WILDCARD_VALUE.

 

Anyway, to compare items just use ItemStack#getItem and then compare the reference, since there is only one instance of your item at a time.

 

So I tried all the iterations of what you suggested,  -1, 0, 1,

-1, OreDictionary.WILDCARD_VALUE

0, OreDictionary.WILDCARD_VALUE

1, OreDictionary.WILDCARD_VALUE

OreDictionary.WILDCARD_VALUE, OreDictionary.WILDCARD_VALUE

OreDictionary.WILDCARD_VALUE, -1

OreDictionary.WILDCARD_VALUE, 0

OreDictionary.WILDCARD_VALUE, 1

 

Link to comment
Share on other sites

Hi

 

Here is a working example from vanilla code, like what shieldbug said

 

           ItemStack itemstack = player.inventory.getCurrentItem();

            if (itemstack == null)  {
                return true;
            } else {
               if (itemstack.getItem() == Items.water_bucket) {
                        // do your stuff
               }
            }

 

-TGG

 

 

 

 

Link to comment
Share on other sites

Made some progress but i'm still having a serious issue with keeping the damage on the item. 

 

Current Code Will correctly check, and switch even if item is damage. However, if the item is damaged it will NOT keep the damage value, instead it will reset the hammer to new. Need to find a way to run s.setItemDamage(y); AFTER the return statement runs.

 

Code Logic:

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

p.inventory.changeCurrentItem(1);

s = p.inventory.getCurrentItem();

y = s.getItemDamage();

 

if (p.inventory.getCurrentItem() == null) {

p.inventory.changeCurrentItem(-1);

} else if (s.isItemEqual(new ItemStack(ModItems.forgeHammer, y, y ))) {

i = 0;

} else p.inventory.changeCurrentItem(-1);

 

 

s = p.inventory.getCurrentItem();

 

s.setItemDamage(y);

return super.onItemRightClick(s, w, p);

 

}

Link to comment
Share on other sites

Hi

 

Here is a working example from vanilla code, like what shieldbug said

 

           ItemStack itemstack = player.inventory.getCurrentItem();

            if (itemstack == null)  {
                return true;
            } else {
               if (itemstack.getItem() == Items.water_bucket) {
                        // do your stuff
               }
            }

 

-TGG

 

This example only handles the check. I have the check working. Its the switch that's not working correctly. i'll post the whole class at the end. I have to Override the onItemRightClick since i need the code to run when onItemRightClick occurs. Like I said in my previous post. The code isn't complete because the ItemStack.setItemDamage(); isnt being applied after the return statement.

 

@Override

public ItemStack onItemRightClick(ItemStack s, World w, EntityPlayer p) {

 

p.inventory.changeCurrentItem(1);

s = p.inventory.getCurrentItem();

y = s.getItemDamage();

 

if (p.inventory.getCurrentItem() == null) {

p.inventory.changeCurrentItem(-1);

} else if (s.isItemEqual(new ItemStack(ModItems.forgeHammer, y, y ))) {

i = 0;

} else p.inventory.changeCurrentItem(-1);

 

s = p.inventory.getCurrentItem();

 

s.setItemDamage(y);

 

return super.onItemRightClick(s, w, p);

}

}

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.