Posted December 20, 20222 yr Hi all, I'm playing with an idea to make a mod that runs only on the client and logs all received vanilla packets to a file, with the purpose of inspecting them later. For context, I'm building an external tool that will take these saved packets and extract useful information from them, the details are not important. However, I'm having some trouble with finding out exactly how I can achieve my goal of listening for packets 🤔 I'm aware there's no actual event for "packet received", and I did go through Forge's documentation for SimpleImpl, but unless I'm mistaken, SimpleImpl is specific for sending and receiving custom packets. I also saw some related questions in the forum where people have suggested adding a custom handler into the netty pipeline. For example: https://forums.minecraftforge.net/topic/38549-19-read-incoming-vanilla-packets/?do=findComment&comment=204747 But I'm not sure if this will allow me to do what I want to. Can someone offer me some advice as to how can I 'write' all received vanilla packets to a file?
December 20, 20222 yr Your question is a netty question rather than a forge question. https://netty.io/ You will probably get better help on their forums or reading their docs. Boilerplate: If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one. If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install Large files should be posted to a file sharing site like https://gist.github.com You should also read the support forum sticky post.
December 20, 20222 yr Author Thanks @warjort 🙂 I'll read up on Netty to better understand how it works. In the meantime, can you think of an alternative approach to accomplish this? I'll still investigate Netty, but I want to make sure I'm not leaving another potential avenue unexplored
December 20, 20222 yr There are existing projects that already do what you trying to do. They are also mainly used to write bots/cheats which I suspect is what your are trying to do, so I am not going to go into details. Writing bots/cheats is not supported in this forum. Boilerplate: If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one. If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install Large files should be posted to a file sharing site like https://gist.github.com You should also read the support forum sticky post.
December 21, 20222 yr Author I appreciate your concern, but I assure you cheating is not my purpose 🙂 Anyway, after some looking online yesterday and trying to better understand Netty I stumbled on this post that has the answer to what I wanted to do! Intercepting Vanilla Minecraft Network Packets (techno.fish) In case the post is ever removed or goes offline, I'll also sketch out the solution here since I've seen this question asked multiple times on the form (I still recommend that you read the post to get a better understanding of things) First create your listener, which should be a subclass of `SimpleChannelInboundHandler` that implements `channelRead0`. @ChannelHandler.Sharable class ClientInboundHandler : SimpleChannelInboundHandler<Any>(false) { override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) { # `msg` is your packet ctx!!.fireChannelRead(msg) } } Now register your listener when the player connects. Since I couldn't find any straightforward way to know when the client connects to a server I ended up just listening for the `EntityJoinLevelEvent` and checking that the current entity is the player @SubscribeEvent fun onClientJoinLevel(event: EntityJoinLevelEvent) { val entityName = event.entity.name val currentPlayerName = Minecraft.getInstance().player?.name if (!entityName.equals(currentPlayerName)) { return; } # get reference to netty pipeline val pipeline = Minecraft .getInstance() .connection!! # the blog post is slightly outdated with how to get this. This works on 1.19.2 .connection .channel() .pipeline() # you NEED to add it before `packet_handler`, read post for more info pipeline.addBefore("packet_handler", "custom_packet_handler", ClientInboundHandler()) }
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.