Jump to content

Recommended Posts

Posted

There are several similar situations I'm trying to resolve, all of which involve the player interacting with a Gui and me wanting to get the results of that to modify data in the player. I haven't seen any Forge Events for these, but each one involves sending a packet to the server to relay the information, so I was wondering if it was possible somehow to intercept that packet and get the information, or if that's just a totally whack idea.

 

Here's what I'm trying to do:

1. Check when a player enchants an item of any kind using the vanilla enchantment table.

2. Check when a player signs a book

3. Check when a player completes a transaction with a villager

4. Check when a player brews a potion, i.e. takes it from the stand (the PotionBrewedEvent is not designed for this particular scenario, as far as I can tell)

 

The reason I was thinking of intercepting the packet is because the only other idea I could think of would be to check every tick whether any of these gui screens / containers were open and try to get the information by comparing some initial values (such as player xp / level) vs. the values when the screen closes, but that seems like an extremely inefficient / messy way to go about it.

 

Hopefully I'm just overlooking something obvious... any ideas or alternatives are more than welcome. Thanks!

Posted

Hi

 

I suspect you might be able to intercept Packets by creating your own MyNetClientHandler extends NetClientHandler, ithen overwriting EntityClientPlayerMP.sendQueue with MyNetClientHandler.

 

http://greyminecraftcoder.blogspot.com.au/2013/10/client-side-class-linkage-map.html

 

Duplicating the NetClientHandler object would be the hard part, I'm not sure it's possible using .clone() and many of the member fields are private so you couldn't copy them directly.  You might be able to store a reference to the original NetClientHandler inside your MyNetClientHandler, and then override all the functions with accessors to the NetClientHandler

 

eg

MyNetClientHandler.
    public void processReadPackets()
    {
       this.netClientHandler.processReadPackets()
    }

 

however you would then need to make sure that you keep the public fields in MyNetClientHandler up to date.

 

Either way I think it would be pretty messy, and I hear that 1.7 completely updates packets anyway, so you might want to look for other ways perhaps...

 

-TGG

 

 

Posted

Thanks for the ideas TGG. Yeah, with 1.7's network code changes on the way, I think I'll hold off my battle with the network code until then, although your idea is intriguing. I may give it a shot anyway if I run out of other projects and still haven't thought of a better method.

 

Thanks again for the well-thought out response.

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.