Jump to content

[SOLVED][1.10] ItemHandler tooltip when in non player inventory on mp server


Recommended Posts

Posted

I am trying to figure out if there's a way to get ItemHandler capability sync to client when the itemstack it's attached to is in a non player inventory.

 

Basically this breaks for me showing tooltips for ItemHandlers as I can send sync packets when these are in players inventory, but can't seem to find a way to know that player is looking at a inventory and sync the data in that case.

Any thoughts on how I could go about that?

 

Look for solution in the first reply from Leviathan143.

Posted

The code for one of them is here https://github.com/P3pp3rF1y/Reliquary/blob/1.10.2/src/main/java/xreliquary/items/ItemVoidTear.java

 

But the problem here is that the data isn't stored in nbt which gets synced, but in capNBT which as you know doesn't get synced to client and thus needs to be synced through special packets.

 

In the code above you can see the packets being triggered, but that only is the case when the item is in player's inventory. As soon as it is in a container this code does nothing which means on dedicated server there's no information on client on the actual capability data.

Posted

The only way I can think of when it comes to dealing with this is using regular NBT and store the data to be displayed on client in there as well. But that means that I would end up with the exact same data stored in two different places at least in case of this item.

 

Sounds to me like another reason for itemstack caps to be synced with the stack data (or at least part of the cap data marked to be synced to client)

Posted

PlayerContainerEvent.Open fires when a player opens a Container. If you just need to sync the cap on opening a container that should suffice.

 

If you need to sync the cap while the container is open, you can attach an IContainerListener. On PlayerContainerEvent.Open attach an IContainerListener with

Container#addListener()

, on PlayerContainerEvent.Close detach it with

Container#removeListener()

. You can then override

IContainerListener#sendSlotContents()

to sync your capability.

IContainerListener#sendSlotContents()

is called every time an ItemStack in the container changes.

Posted
If you need to sync the cap while the container is open

 

Say...hoppers?

  • Like 1

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.

Posted

I don't quite get your meaning here. Hoppers have a container.

 

Hoppers pulling from or pushing to YOUR container would require an update while the player is looking at the GUI.

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.

Posted

Hoppers pulling from or pushing to YOUR container would require an update while the player is looking at the GUI.

 

No problem there. Removal or addition of ItemStacks causes

IContainerListener#sendSlotContents()

to be called, allowing you to sync the cap if the itemstack is being inserted. If it's being extracted, you don't care as it's now in an inventory which the player isn't looking at. The next time it's caps are synced is when the player opens the inventory it was extracted to.

Posted
If it's being extracted, you don't care as it's now in an inventory which the player isn't looking at

 

Cough, change in stack size, cough.

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.

Posted

If it's being extracted, you don't care as it's now in an inventory which the player isn't looking at

 

Cough, change in stack size, cough.

*Cough*

Look at the call hierarchy of

IContainerListener#sendSlotContents()

.

*Cough*

IContainerListener#sendSlotContents()

is called if

ItemStack.areItemStacksEqual()

returns false. Changes in stacksize, damage value, contained Item or NBT will cause

ItemStack.areItemStacksEqual()

to return false.

 

Posted

You also missed the bit where I said that you'd need to have an IContainerListener otherwise hoppers break things.  You assumed that I was saying that hoppers make an IContainerListener insufficient.

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.

Posted

So this solution sounds fairly good.

One thing I don't like about it is the fact I will need to listen to all the itemstack changes passing through just in case my item shows up, but I guess that will just have to do.

Posted

So I finally got to plugin this in and have to say it's not as easy as it may seem.

First of all removeListener for some reason is client side only method, which is just annoying and was fairly easy to solve with reflection (just removing from listeners collection directly).

 

However the listener part is way worse. I am going through all the stacks when inventory opens and then checking for just updates which is all good until a player clicks on anything that has capabilities.

When that happens CPacketClickWindow is triggered which then triggers EntityPlayerMP.updateCraftingInventory in case that the stack it just got from packet doesn't match the one on server and because capabilities are not synced it won't match ever. Which is bad because updateCraftingInventory sends back to client all of the inventory contents yet again.

So basically what I can do is on every sendSlotContents call in my listener go through all of the inventory because I have no way of knowing if the player just clicked on stack that will cause sync of just one slot or full inventory.

 

Right now I am going with a more limited variant which checks if a stack with itemhandler capability was clicked and only in that case it scans inventory and sends updates. this still means that if an item with different capability was clicked my items would lose their context, but I am going to accept that as an ok solution.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Reach Out To Rapid Digital: What sapp Info: +1 41 4 80 7 14 85 Email INFO: rap iddi gita lrecov ery @ exe cs. com Hello, my name is Jayson, and I’m 35 years old from the United Kingdom. My family and I recently endured an incredibly challenging experience that I wouldn’t wish on anyone. We became victims of a cryptocurrency investment fraud scheme that saw us lose a staggering $807,000 in USDT and Bitcoins. The fraudsters had created a convincing facade, and we were lured into investing, only to discover later that the platform was a complete scam. We were left devastated, not just financially, but emotionally, as we had trusted these people and believed in the legitimacy of the investment. After the initial shock wore off, we desperately searched for ways to recover the lost funds. It seemed like an impossible task, and we felt as though there was no hope. That’s when, by sheer luck, we stumbled across a post about Rapid Digital Recovery, a cryptocurrency and funds recovery organization with a proven track record in cybersecurity and fraud recovery. We decided to reach out to them, and from the first interaction, we were impressed with their professionalism and transparency. They explained the recovery process in detail and reassured us that they had the skills and expertise to track down the perpetrators and recover our funds. This gave us a renewed sense of hope, something we hadn’t felt in months. What truly stood out during our experience with Rapid Digital Recovery was their dedication to the recovery process. The team went above and beyond, using sophisticated tracking tools and cyber forensics to gather critical information. Within a matter of weeks, they had successfully located the funds and traced the scam back to the fraudsters responsible. They worked with the authorities to ensure the criminals were held accountable for their actions. To our relief, the team at Rapid Digital Recovery was able to recover every single penny we had lost. The funds were returned in full, and the sense of closure we felt was invaluable. We couldn’t have imagined such a positive outcome in the early stages of our recovery journey, and we are deeply grateful for the work they did. If you ever find yourself in a similar situation, I highly recommend contacting Rapid Digital Recovery. Their expertise, transparency, and dedication to their clients make them the go-to choice for anyone seeking to recover lost cryptocurrency or funds. They truly gave us back our financial future.  
    • This is my first time modding anything, so maybe just skill issue. I'm using Forge 54.0.12 and Temurin 21.0.5+11-LTS I wanted to create a custom keybind and to check whether it works I'd like to send a chat message. I tried using Minecraft.getInstance().player.sendSystemMessage(Component.literal("test")); but IntelliJ couldnt resolve sendSystemMessage(...). Since I saw people using it in earlier versions, I tried the same thing with 1.20.6(- 50.1.0), where it works fine, now I can't figure out if this is intentional and whether there are other options for sending chat messages. On that note, is there more documentation than https://docs.minecraftforge.net/en/1.21.x/? It seems very incomplete compared to something like the Oracle Java docs
    • Hi, i'm having this error and I wanna fix it. we try: -Reload drivers -Eliminate .minecraft -Eliminate Java -Restart launcher -Verify if minecraft is using gpu -Mods  in .minecraft is empty -Install the latest and recomended version of forge idk what i have to do, help me pls. the lastest log is: https://mclo.gs/WAMao8x  
    • Read the FAQ, Rule #2. (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/)  
  • Topics

×
×
  • Create New...

Important Information

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