Jump to content

[1.19.2] Listening to Vanilla Minecraft packets


Gatherer7124

Recommended Posts

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:

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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())
    }

Link to comment
Share on other sites

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.