Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

 

}

 

}

 

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.

  • Author

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.

  • Author

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

}

 

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)

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

  • Author

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.

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.

  • Author

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

 

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

 

 

 

 

  • Author

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

 

}

  • Author

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

}

}

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.