coolAlias Posted November 7, 2013 Share Posted November 7, 2013 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! Quote http://i.imgur.com/NdrFdld.png[/img] Link to comment Share on other sites More sharing options...
TheGreyGhost Posted November 7, 2013 Share Posted November 7, 2013 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 Quote Link to comment Share on other sites More sharing options...
coolAlias Posted November 7, 2013 Author Share Posted November 7, 2013 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. Quote http://i.imgur.com/NdrFdld.png[/img] 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.