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