Jump to content

[1.10.2] How to change ItemStack item?


yooksi

Recommended Posts

Until now I've been using ItemStack#setItem to get this job done, but now that it's been recently deprecated, I don't know what to use. What is the best way of accomplishing this task in 1.10.2?

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

That depends.  Where are you wanting to do this and why?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

That depends.  Where are you wanting to do this and why?

I would like to change the item of an ItemStack passed as an argument in the ItemBlock#onUpdate method with another custom item instance. Why? Because I want to replace an item the player is holding in his main hand.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

You can just replace the itemstack in the player's inventory.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

You can just replace the itemstack in the player's inventory.

 

That would indeed probably be the simplest way, although if you have any custom NBT attached to it you'll need to copy it over.

 

That's exactly what I wanted to avoid, but guess in the end it's really no biggie. If that's the proper way of doing it, then that's the way I'll do it. Thanks for the info you two.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

Okay, two more additional problem:

 

First: after checking the code, I see I don't actually have direct access to a EntityPlayer instance in the method that is handling the ItemStack in question, although I can remedy this by adding an additional argument to the method.

 

Second: I don't know of an elegant way of finding the ItemStack instance in player's inventory. How would I go about solving the second problem in a most elegant fashion permissible by the newest version of Forge?

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

If you're replacing an item in the hotbar (the currently active item) you should be able to figure out which slot is currently active.

Even if not you can loop over the hotbar and compare item stack instances directly (one will return true for

stack == otherStack

)

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

If you're replacing an item in the hotbar (the currently active item) you should be able to figure out which slot is currently active.

Even if not you can loop over the hotbar and compare item stack instances directly (one will return true for

stack == otherStack

)

 

Yes I know, and I can do pretty much the same for HeldEquippment, but is there a specialized method for doing that? Something like InventoryPlayer#hasItemStack which tries to see if an ItemStack instance exits in player's inventory, except returning a boolean it would return an inventory slot position.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

If you're replacing an item in the hotbar (the currently active item) you should be able to figure out which slot is currently active.

Even if not you can loop over the hotbar and compare item stack instances directly (one will return true for

stack == otherStack

)

 

Yes I know, and I can do pretty much the same for HeldEquippment, but is there a specialized method for doing that? Something like InventoryPlayer#hasItemStack which tries to see if an ItemStack instance exits in player's inventory, except returning a boolean it would return an inventory slot position.

No you will have to create that method yourself.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Yes I know, and I can do pretty much the same for HeldEquippment, but is there a specialized method for doing that? Something like InventoryPlayer#hasItemStack which tries to see if an ItemStack instance exits in player's inventory, except returning a boolean it would return an inventory slot position.

No you will have to create that method yourself.

 

Alright, good to know. Thanks.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

The

onUpdate

method has a parameter for the slot in the player's inventory. No need to search anything.

 

The difficulty is that

Item#onUpdate

will be called for items in any of the player's three inventory sections (main, armour and off hand), so you need to check which section it's in before trying to interact with that section.

 

You can do this by checking if the

ItemStack

in the provided slot of the inventory section is the same as the provided

ItemStack

.

 

I do this here. This doesn't handle the item being in the player's off hand.

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

Wow... that is a horrible design on Mojang's part.

 

Hash-tag: no one is surprised.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

This thread inspired me to fix the item I linked earlier to properly handle the off hand. You can see the new implementation here and here.

 

I now use the latter method for all inventory handling in my

Item#onUpdate

implementations.

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

The

onUpdate

method has a parameter for the slot in the player's inventory. No need to search anything.

 

The difficulty is that

Item#onUpdate

will be called for items in any of the player's three inventory sections (main, armour and off hand), so you need to check which section it's in before trying to interact with that section.

 

You can do this by checking if the

ItemStack

in the provided slot of the inventory section is the same as the provided

ItemStack

.

 

I do this here. This doesn't handle the item being in the player's off hand.

 

I see you use IItemHandler to interact with player inventory. What are the advantages of manipulating the inventory that way over using PlayerInventory?

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

The

onUpdate

method has a parameter for the slot in the player's inventory. No need to search anything.

 

The difficulty is that

Item#onUpdate

will be called for items in any of the player's three inventory sections (main, armour and off hand), so you need to check which section it's in before trying to interact with that section.

 

You can do this by checking if the

ItemStack

in the provided slot of the inventory section is the same as the provided

ItemStack

.

 

I do this here. This doesn't handle the item being in the player's off hand.

 

I see you use IItemHandler to interact with player inventory. What are the advantages of manipulating the inventory that way over using PlayerInventory?

 

It allows you to simulate inventory changes and treat it the same as any other inventory, e.g. use it in a wrapper like

CombinedInvWrapper

or

RangedWrapper

.

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

 

It allows you to simulate inventory changes and treat it the same as any other inventory, e.g. use it in a wrapper like

CombinedInvWrapper

or

RangedWrapper

.

 

I don't know what

CombinedInvWrapper

and

RangedWrapper

are, can you give me a simpler explanation? I am not a really experienced modder.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

It allows you to simulate inventory changes and treat it the same as any other inventory, e.g. use it in a wrapper like

CombinedInvWrapper

or

RangedWrapper

.

 

I don't know what

CombinedInvWrapper

and

RangedWrapper

are, can you give me a simpler explanation? I am not a really experienced modder.

 

CombinedInvWrapper

combines multiple

IItemHandler

inventories into one.

RangedWrapper

exposes a range of slots from an

IItemHandler

inventory.

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

This is how my method code looks after I've tried to work around ItemStack#setItem: NewItemTorch.java.

 

Notice that I am forced to call ItemStack#areItemStacksEqual quite often, and from what I've seen in the code belonging to the methods called, this might get really expensive after continued use. Especially since I have to scan the whole player inventory, and if the player is carrying a lot of items... you see my point.

 

I am very sensitive about code optimization and even though I try not to fall into the pit of premature optimization, I'm still often worried about my code performance. Do you think I am overreacting in this case?

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

It allows you to simulate inventory changes and treat it the same as any other inventory, e.g. use it in a wrapper like

CombinedInvWrapper

or

RangedWrapper

.

 

I don't know what

CombinedInvWrapper

and

RangedWrapper

are, can you give me a simpler explanation? I am not a really experienced modder.

 

CombinedInvWrapper

combines multiple

IItemHandler

inventories into one.

RangedWrapper

exposes a range of slots from an

IItemHandler

inventory.

 

Aha, so for example, it merges all player inventories into one?

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

This is how my method code looks after I've tried to work around ItemStack#setItem: NewItemTorch.java.

 

Notice that I am forced to call ItemStack#areItemStacksEqual quite often, and from what I've seen in the code belonging to the methods called, this might get really expensive after continued use. Especially since I have to scan the whole player inventory, and if the player is carrying a lot of items... you see my point.

 

I am very sensitive about code optimization and even though I try not to fall into the pit of premature optimization, I'm still often worried about my code performance. Do you think I am overreacting in this case?

 

You don't need to know whether the stacks are equal to each other (i.e. same

Item

, metadata, NBT and capabilities), you need to know whether they're the same object (i.e. use

==

).

 

You already know which slot the item is in, so you shouldn't need to scan every inventory slot; just check that slot of each section.

 

Aha, so for example, it merges all player inventories into one?

You can do that (and

PlayerInvWrapper

does), but I'm not using that myself because I need to access each section separately.

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 don't need to know whether the stacks are equal to each other (i.e. same

Item

, metadata, NBT and capabilities), you need to know whether they're the same object (i.e. use

==

).

 

 

You're right, that's a better idea, I was overthinking it.

 

 

You already know which slot the item is in, so you shouldn't need to scan every inventory slot; just check that slot of each section.

 

 

I don't know this in every situation, the itemSlot method argument will sometimes be passed as -1.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

You already know which slot the item is in, so you shouldn't need to scan every inventory slot; just check that slot of each section.

 

I don't know this in every situation, the itemSlot method argument will sometimes be passed as -1.

 

Vanilla never calls

Item#onUpdate

with a negative slot number. Is the method being called from another mod?

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

Vanilla never calls

Item#onUpdate

with a negative slot number. Is the method being called from another mod?

 

It's called by other methods beside

Item#onUpdate

. I still believe we should have a method that edits the item of an ItemStack, all this effort seems like hacking to me. We also have to allocate new objects all the time when all we want to do is replace the Item and leave other ItemStack properties the same.

I still haven't published a mod because I can never get that in-dev version just right to warrant a public release. And yes, after two years of mod development I am still learning to speak Java.

 

Follow me on GitHub: https://github.com/yooksi

Contact me on Twitter: https://twitter.com/yooksi

Read my Minecraft blog: https://yooksidoesminecraft.blogspot.de/

Link to comment
Share on other sites

I found out that deprecated does not mean do not use. Deprecated rather means more like "i'd rather you not use it but if you have to go then go ahead."

 

In my code I have a block which has multi textures and FACING so orientation matters. One of the functions there      getStateFromMeta(int meta) is marked as deprecated.

 

@Deprecated

    public IBlockState getStateFromMeta(int meta)

    {

        return this.getDefaultState();

    }

 

Now if you don't use this function the block resets position every time you reload the game so in this case is deprecated but YOU HAVE TO USE IT. So what do I do? I use it. There's no other way :D

 

Point is if it says deprecated is because original MC team are trying to move away from this function so expect it to go away in the future but doesn't mean you can't use it now.

Disclaimer:  I been told to keep my opinions to myself, to shut up and that I am spreading lies and misinformation or even that my methods are unorthodox and or too irregular. Here are my suggestions take it or leave 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.