kitsushadow Posted September 28, 2014 Share Posted September 28, 2014 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); } } Quote Link to comment Share on other sites More sharing options...
Busti Posted September 28, 2014 Share Posted September 28, 2014 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); } Quote 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 More sharing options...
hugo_the_dwarf Posted September 28, 2014 Share Posted September 28, 2014 also might want to move that "return super.onItemRightClick(s, w, p);" below your getter code, since returns always exit out of a method Quote Currently updating my Mod to 1.10.2 https://bitbucket.org/hugo_the_dwarf/riseoftristram2016/src?at=master Link to comment Share on other sites More sharing options...
kitsushadow Posted September 29, 2014 Author Share Posted September 29, 2014 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. Quote Link to comment Share on other sites More sharing options...
kitsushadow Posted September 29, 2014 Author Share Posted September 29, 2014 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); } Quote Link to comment Share on other sites More sharing options...
Busti Posted September 29, 2014 Share Posted September 29, 2014 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) Quote 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 More sharing options...
kitsushadow Posted September 29, 2014 Author Share Posted September 29, 2014 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. Quote Link to comment Share on other sites More sharing options...
Busti Posted September 29, 2014 Share Posted September 29, 2014 Does Integer.maxValue() work? Quote 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 More sharing options...
shieldbug1 Posted September 29, 2014 Share Posted September 29, 2014 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. Quote BEFORE ASKING FOR HELP READ THE EAQ! I'll help if I can. Apologies if I do something obviously stupid. If you don't know basic Java yet, go and follow these tutorials. Link to comment Share on other sites More sharing options...
kitsushadow Posted September 29, 2014 Author Share Posted September 29, 2014 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 Quote Link to comment Share on other sites More sharing options...
TheGreyGhost Posted September 29, 2014 Share Posted September 29, 2014 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 Quote Link to comment Share on other sites More sharing options...
kitsushadow Posted September 29, 2014 Author Share Posted September 29, 2014 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); } Quote Link to comment Share on other sites More sharing options...
kitsushadow Posted September 29, 2014 Author Share Posted September 29, 2014 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); } } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.