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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Please read the FAQ and post logs as described there.
    • Upon starting the server I get; [main/ERROR] [minecraft/Main]: Failed to start the minecraft server net.minecraftforge.fml.LoadingFailedException: Loading errors encountered: [     Framework (framework) has failed to load correctly §7java.lang.NoClassDefFoundError: net/minecraft/client/gui/components/toasts/Toast ] I suspect there is a (possibly a few) client-only mods installed on my server. Any help would be appreciated! (Yes I know there are a lot of mods...) Here is the crash log:   https://paste.ee/p/pRz5mhMl#s=0
    • That's basically what the failure does, my apologies for failing to specify.  It just tries again on the next tick until it detects the entities for that chunk are loaded, and then tries to load the entity.  From there it gets into different failure states depending on what goes wrong, but in short, if the entity fails to load once the entity list becomes available, the request is cleared and must be resubmitted by the end user.  There should be few cases where that actually happens. Yes, that is my understanding of forceloading.  That's why on a successful summon, it removes the forceload.  Otherwise it does just leave the chunks loaded long term. Thank you for your help, any knowledge is useful!  I don't often mess with forceloading and my prior experience is 1.16 so I'm also a bit out of my depth haha.
    • I will have to do more research about 1.18 chunk loading. You were unclear about how your code manages with the entity load failure. If you simply used a loop, I suggest submitting a tick task to the next tick which does the same thing, checking if the entities are loaded and if so teleporting the right one else submitting another tick task etc. Also I think forceloading permanently force loads the chunk, and it only starts to unload when you make a subsequent call to mark the chunk as not forceloaded. I may be completely wrong, I dont know much about 1.18, most of my experience is 1.20. Good luck I hope you figure it out after all this time 😅
    • i managed to fix it by reinstalling the modpack and re-add all the extra mods I've had previously.
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

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