From 25f2ec8fd70ff328de8630f414e6707f6806754e Mon Sep 17 00:00:00 2001 From: d3lta <83219809+D3lta-2-1@users.noreply.github.com> Date: Sat, 8 Apr 2023 14:02:16 +0200 Subject: [PATCH 1/4] update to support server side --- build.gradle | 6 +--- gradle.properties | 9 +++--- .../packetevents/PacketEventsMod.java | 1 + .../fabric/FabricPacketEventsBuilder.java | 14 ++++----- .../packetevents/handler/PacketDecoder.java | 8 +++-- .../packetevents/handler/PacketEncoder.java | 6 +--- .../handler/ServerPacketDecoder.java | 31 +++++++++++++++++++ .../handler/ServerPacketEncoder.java | 22 +++++++++++++ .../mixin/PacketEventsInjectorMixin.java | 28 ++++++++++++++--- src/main/resources/fabric.mod.json | 6 ++-- src/main/resources/packetevents.mixins.json | 2 -- 11 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java create mode 100644 src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java diff --git a/build.gradle b/build.gradle index 36758a022..d33a53952 100644 --- a/build.gradle +++ b/build.gradle @@ -3,10 +3,6 @@ plugins { id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - -archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group @@ -40,7 +36,7 @@ dependencies { mappings loom.layered() { officialMojangMappings() - parchment("org.parchmentmc.data:parchment-${project.minecraft_version}:${project.parchment_mappings}") + parchment("org.parchmentmc.data:parchment-${project.parchment_minecraft_version}:${project.parchment_mappings}") } modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" diff --git a/gradle.properties b/gradle.properties index 885e51af0..ee44b9700 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,10 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.18.1 - parchment_mappings=2022.01.23 - loader_version=0.13.1 + minecraft_version=1.19.4 + parchment_mappings=2023.03.12 + parchment_minecraft_version=1.19.3 + loader_version=0.14.18 # Mod Properties mod_version = 2.0.0 @@ -13,5 +14,5 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = packetevents # Dependencies - fabric_version=0.46.4+1.18 + fabric_version=0.77.0+1.19.4 diff --git a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index c0a5bec0d..3f3755434 100644 --- a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -25,5 +25,6 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { @Override public void onInitialize() { PacketEvents.getAPI().init(); + PacketEvents.getAPI().getEventManager().registerListener(new test()); } } diff --git a/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java index 170fc19da..5668c455a 100644 --- a/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java +++ b/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java @@ -2,8 +2,6 @@ package io.github.retrooper.packetevents.factory.fabric; import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; -import com.github.retrooper.packetevents.event.SimplePacketListenerAbstract; -import com.github.retrooper.packetevents.event.simple.PacketPlaySendEvent; import com.github.retrooper.packetevents.injector.ChannelInjector; import com.github.retrooper.packetevents.manager.InternalPacketListener; import com.github.retrooper.packetevents.manager.player.PlayerManager; @@ -11,7 +9,6 @@ import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; import com.github.retrooper.packetevents.manager.server.ServerManager; import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.netty.NettyManager; -import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.protocol.ProtocolVersion; import com.github.retrooper.packetevents.protocol.packettype.PacketType; import com.github.retrooper.packetevents.protocol.player.User; @@ -113,7 +110,7 @@ public class FabricPacketEventsBuilder { private final ChannelInjector injector = new ChannelInjector() { @Override - public boolean isServerBound() { + public boolean isServerBound() { return true; } @@ -176,16 +173,19 @@ public class FabricPacketEventsBuilder { //Register internal packet listener (should be the first listener) //This listener doesn't do any modifications to the packets, just reads data getEventManager().registerListener(new InternalPacketListener()); - getEventManager().registerListener(new SimplePacketListenerAbstract() { + + //TODO: Fix Make this load on the client + /*getEventManager().registerListener(new SimplePacketListenerAbstract() { @Override public void onPacketPlaySend(PacketPlaySendEvent event) { if (event.getPacketType() == PacketType.Play.Server.JOIN_GAME) { - System.out.println("Is player null? " + (Minecraft.getInstance().player != null)); + PacketEventsMod.LOGGER.info("Is player null? " + (Minecraft.getInstance().player != null)); PacketEvents.getAPI().getInjector().setPlayer(event.getChannel(), Minecraft.getInstance().player); } } - }); + });*/ + } } diff --git a/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index e25766a0a..9a27d43b9 100644 --- a/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -8,6 +8,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; import net.minecraft.client.player.LocalPlayer; +import org.jetbrains.annotations.NotNull; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -30,6 +31,7 @@ public class PacketDecoder extends MessageToMessageDecoder { if (msg.isReadable()) { ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg); boolean recompress = handleCompression(ctx, outputBuffer); + PacketEventsImplHelper.handleClientBoundPacket(ctx.channel(), user, player, outputBuffer, false); //TODO hasTasksAfter if (outputBuffer.isReadable()) { @@ -42,12 +44,12 @@ public class PacketDecoder extends MessageToMessageDecoder { } @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { + public void channelInactive(@NotNull ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); } - private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { + protected boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { if (checkedCompression) return false; if (ctx.pipeline().names().indexOf("decompress") > ctx.pipeline().names().indexOf(PacketEvents.DECODER_NAME)) { // Need to decompress this packet due to bad order @@ -81,7 +83,7 @@ public class PacketDecoder extends MessageToMessageDecoder { return false; } - private void recompress(ChannelHandlerContext ctx, ByteBuf buffer) { + protected void recompress(ChannelHandlerContext ctx, ByteBuf buffer) { ByteBuf compressed = ctx.alloc().buffer(); try { ChannelHandler compressor = ctx.pipeline().get("compress"); diff --git a/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 33cf47c88..081406e99 100644 --- a/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -1,10 +1,6 @@ package io.github.retrooper.packetevents.handler; -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.PacketReceiveEvent; -import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper; import com.github.retrooper.packetevents.protocol.player.User; -import com.github.retrooper.packetevents.util.EventCreationUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; @@ -25,7 +21,7 @@ public class PacketEncoder extends MessageToByteEncoder { } @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { ByteBuf buf = null; try { if (acceptOutboundMessage(msg)) { diff --git a/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java new file mode 100644 index 000000000..92aa9ea5e --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java @@ -0,0 +1,31 @@ +package io.github.retrooper.packetevents.handler; + +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import java.util.List; + +@ChannelHandler.Sharable +public class ServerPacketDecoder extends PacketDecoder { + public ServerPacketDecoder(User user) { + super(user); + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.isReadable()) { + ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg); + boolean recompress = handleCompression(ctx, outputBuffer); + PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player, outputBuffer, false); + //TODO hasTasksAfter + if (outputBuffer.isReadable()) { + if (recompress) { + recompress(ctx, outputBuffer); + } + out.add(outputBuffer.retain()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java new file mode 100644 index 000000000..b481808aa --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java @@ -0,0 +1,22 @@ +package io.github.retrooper.packetevents.handler; + +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; + +@ChannelHandler.Sharable +public class ServerPacketEncoder extends PacketEncoder { + public ServerPacketEncoder(User user) { + super(user); + } + + @Override + protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { + if (msg.isReadable()) { + PacketEventsImplHelper.handleClientBoundPacket(ctx.channel(), user, player, msg, false); + out.writeBytes(msg); + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java b/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java index d666fa312..b3cd47495 100644 --- a/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java +++ b/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java @@ -10,11 +10,14 @@ import com.github.retrooper.packetevents.protocol.player.UserProfile; import io.github.retrooper.packetevents.PacketEventsMod; import io.github.retrooper.packetevents.handler.PacketDecoder; import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.github.retrooper.packetevents.handler.ServerPacketDecoder; +import io.github.retrooper.packetevents.handler.ServerPacketEncoder; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; -import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.protocol.PacketFlow; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -22,15 +25,30 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(net.minecraft.network.Connection.class) public class PacketEventsInjectorMixin { + + @Shadow @Final + private PacketFlow receiving; + @Inject(method = "channelActive", at = @At("HEAD")) - private void channelActive(ChannelHandlerContext ctx, CallbackInfo info) throws Exception { + private void channelActive(ChannelHandlerContext ctx, CallbackInfo info) { PacketEventsMod.LOGGER.info("Connected!"); Channel channel = ctx.channel(); User user = new User(channel, ConnectionState.HANDSHAKING, ClientVersion.getLatest(), new UserProfile(null, null)); ProtocolManager.USERS.put(channel, user); - PacketDecoder decoder = new PacketDecoder(user); - PacketEncoder encoder = new PacketEncoder(user); + PacketDecoder decoder; + PacketEncoder encoder; + if(receiving == PacketFlow.CLIENTBOUND) + { + decoder = new PacketDecoder(user); + encoder = new PacketEncoder(user); + } + else + { + decoder = new ServerPacketDecoder(user); + encoder = new ServerPacketEncoder(user); + } + channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, decoder); channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, encoder); PacketEventsMod.LOGGER.info("Pipeline: " + ChannelHelper.pipelineHandlerNamesAsString(channel)); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 1a5ff9c61..e5e691b39 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -4,7 +4,7 @@ "version": "${version}", "name": "PacketEvents Fabric", - "description": "This is an example description! Tell everyone what your mod is about!", + "description": "fabric implementation of packetevents", "authors": [ "Me!" ], @@ -30,9 +30,9 @@ ], "depends": { - "fabricloader": ">=0.12.12", + "fabricloader": ">=0.14.18", "fabric": "*", - "minecraft": "1.18.x", + "minecraft": "1.19.x", "java": ">=17" }, "suggests": { diff --git a/src/main/resources/packetevents.mixins.json b/src/main/resources/packetevents.mixins.json index 362aaa6b9..4ad7c92c8 100644 --- a/src/main/resources/packetevents.mixins.json +++ b/src/main/resources/packetevents.mixins.json @@ -4,8 +4,6 @@ "package": "io.github.retrooper.packetevents.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - ], - "client": [ "PacketEventsInjectorMixin" ], "injectors": { From 192b622d567a9ba25f36ba3c9c84821fdee7e65e Mon Sep 17 00:00:00 2001 From: d3lta <83219809+D3lta-2-1@users.noreply.github.com> Date: Sun, 9 Apr 2023 17:17:29 +0200 Subject: [PATCH 2/4] Make it load on server and client --- .../packetevents/PacketEventsMod.java | 30 +++++++++++--- .../fabric/FabricPacketEventsBuilder.java | 39 +++++++------------ .../factory/fabric/ServerInstanceManager.java | 16 ++++++++ .../packetevents/handler/PacketDecoder.java | 4 +- .../packetevents/handler/PacketEncoder.java | 4 +- .../mixin/ClientPacketListenerAccessor.java | 12 ++++++ .../mixin/ConnectionAccessor.java | 11 ++++++ .../mixin/PacketEventsInjectorMixin.java | 6 +-- .../ServerGamePacketListenerImplAccessor.java | 12 ++++++ src/main/resources/fabric.mod.json | 3 ++ src/main/resources/packetevents.mixins.json | 9 ++++- 11 files changed, 107 insertions(+), 39 deletions(-) create mode 100644 src/main/java/io/github/retrooper/packetevents/factory/fabric/ServerInstanceManager.java create mode 100644 src/main/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerAccessor.java create mode 100644 src/main/java/io/github/retrooper/packetevents/mixin/ConnectionAccessor.java create mode 100644 src/main/java/io/github/retrooper/packetevents/mixin/ServerGamePacketListenerImplAccessor.java diff --git a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 3f3755434..a7f49207d 100644 --- a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -2,15 +2,21 @@ package io.github.retrooper.packetevents; import com.github.retrooper.packetevents.PacketEvents; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsBuilder; +import io.github.retrooper.packetevents.factory.fabric.ServerInstanceManager; +import io.github.retrooper.packetevents.mixin.ClientPacketListenerAccessor; +import io.github.retrooper.packetevents.mixin.ConnectionAccessor; +import io.github.retrooper.packetevents.mixin.ServerGamePacketListenerImplAccessor; +import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; +import net.minecraft.client.Minecraft; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { - // This logger is used to write text to the console and the log file. - // It is considered best practice to use your mod id as the logger's name. - // That way, it's clear which mod wrote info, warnings, and errors. +public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer, ClientModInitializer { + //single player world are locked on loading, don't know why public static final Logger LOGGER = LoggerFactory.getLogger("packetevents"); @Override @@ -24,7 +30,21 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { @Override public void onInitialize() { + ServerInstanceManager.init(); PacketEvents.getAPI().init(); - PacketEvents.getAPI().getEventManager().registerListener(new test()); + ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { + var connection = ((ServerGamePacketListenerImplAccessor)handler).getConnection(); + var channel = ((ConnectionAccessor)connection).getChannel(); + PacketEvents.getAPI().getInjector().setPlayer(channel, handler.player); + }); + } + + @Override + public void onInitializeClient() { + ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> { + var connection = ((ClientPacketListenerAccessor)handler).getConnection(); + var channel = ((ConnectionAccessor)connection).getChannel(); + PacketEvents.getAPI().getInjector().setPlayer(channel, Minecraft.getInstance().player); + }); } } diff --git a/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java index 5668c455a..2fcc96ec9 100644 --- a/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java +++ b/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java @@ -15,6 +15,7 @@ import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.settings.PacketEventsSettings; import com.github.retrooper.packetevents.util.LogManager; import com.github.retrooper.packetevents.util.reflection.ReflectionObject; +import io.github.retrooper.packetevents.PacketEventsMod; import io.github.retrooper.packetevents.handler.PacketDecoder; import io.github.retrooper.packetevents.handler.PacketEncoder; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; @@ -24,9 +25,10 @@ import io.github.retrooper.packetevents.impl.netty.manager.server.ServerManagerA import io.netty.channel.Channel; import net.kyori.adventure.text.format.NamedTextColor; import net.minecraft.SharedConstants; -import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.Connection; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,20 +37,20 @@ import java.util.regex.Pattern; public class FabricPacketEventsBuilder { private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + '\u00A7' + "[0-9A-FK-ORX]"); - private static PacketEventsAPI INSTANCE; + private static PacketEventsAPI INSTANCE; public static void clearBuildCache() { INSTANCE = null; } - public static PacketEventsAPI build(String modId) { + public static PacketEventsAPI build(String modId) { if (INSTANCE == null) { INSTANCE = buildNoCache(modId); } return INSTANCE; } - public static PacketEventsAPI build(String modId, PacketEventsSettings settings) { + public static PacketEventsAPI build(String modId, PacketEventsSettings settings) { if (INSTANCE == null) { INSTANCE = buildNoCache(modId, settings); } @@ -56,11 +58,11 @@ public class FabricPacketEventsBuilder { } - public static PacketEventsAPI buildNoCache(String modId) { + public static PacketEventsAPI buildNoCache(String modId) { return buildNoCache(modId, new PacketEventsSettings()); } - public static PacketEventsAPI buildNoCache(String modId, PacketEventsSettings inSettings) { + public static PacketEventsAPI buildNoCache(String modId, PacketEventsSettings inSettings) { return new PacketEventsAPI<>() { private final PacketEventsSettings settings = inSettings; //TODO Implement platform version @@ -91,7 +93,7 @@ public class FabricPacketEventsBuilder { private final PlayerManagerAbstract playerManager = new PlayerManagerAbstract() { @Override public int getPing(@NotNull Object player) { - String name = ((LocalPlayer) player).getGameProfile().getName(); + String name = ((Player) player).getGameProfile().getName(); try { return ((LocalPlayer) player).connection.getPlayerInfo(name).getLatency(); } catch (Exception ex) { @@ -137,10 +139,10 @@ public class FabricPacketEventsBuilder { public void setPlayer(Object ch, Object player) { Channel channel = (Channel) ch; PacketDecoder decoder = (PacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME); - decoder.player = (LocalPlayer) player; + decoder.player = (Player) player; PacketEncoder encoder = (PacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME); - encoder.player = (LocalPlayer) player; + encoder.player = (Player) player; } }; private final NettyManager nettyManager = new NettyManagerImpl(); @@ -149,7 +151,7 @@ public class FabricPacketEventsBuilder { protected void log(Level level, @Nullable NamedTextColor color, String message) { //First we must strip away the color codes that might be in this message message = STRIP_COLOR_PATTERN.matcher(message).replaceAll(""); - System.out.println(message); + PacketEventsMod.LOGGER.info(message); } }; private boolean loaded; @@ -173,19 +175,6 @@ public class FabricPacketEventsBuilder { //Register internal packet listener (should be the first listener) //This listener doesn't do any modifications to the packets, just reads data getEventManager().registerListener(new InternalPacketListener()); - - //TODO: Fix Make this load on the client - /*getEventManager().registerListener(new SimplePacketListenerAbstract() { - @Override - public void onPacketPlaySend(PacketPlaySendEvent event) { - if (event.getPacketType() == PacketType.Play.Server.JOIN_GAME) { - PacketEventsMod.LOGGER.info("Is player null? " + (Minecraft.getInstance().player != null)); - PacketEvents.getAPI().getInjector().setPlayer(event.getChannel(), - Minecraft.getInstance().player); - } - } - });*/ - } } @@ -230,8 +219,8 @@ public class FabricPacketEventsBuilder { } @Override - public Minecraft getPlugin() { - return Minecraft.getInstance(); + public MinecraftServer getPlugin() { + return ServerInstanceManager.getServerInstance(); } @Override diff --git a/src/main/java/io/github/retrooper/packetevents/factory/fabric/ServerInstanceManager.java b/src/main/java/io/github/retrooper/packetevents/factory/fabric/ServerInstanceManager.java new file mode 100644 index 000000000..f8bc1b8da --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/factory/fabric/ServerInstanceManager.java @@ -0,0 +1,16 @@ +package io.github.retrooper.packetevents.factory.fabric; + +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.server.MinecraftServer; + +public class ServerInstanceManager { + private static MinecraftServer serverInstance; + + public static void init() { + ServerLifecycleEvents.SERVER_STARTED.register(server -> serverInstance = server); + ServerLifecycleEvents.SERVER_STOPPED.register(server -> serverInstance = null); + } + public static MinecraftServer getServerInstance() { + return serverInstance; + } +} diff --git a/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 9a27d43b9..13165ba22 100644 --- a/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -7,7 +7,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.InvocationTargetException; @@ -19,7 +19,7 @@ import java.util.List; public class PacketDecoder extends MessageToMessageDecoder { private static Method DECOMPRESSOR_METHOD, COMPRESSOR_METHOD; public User user; - public LocalPlayer player; + public Player player; public boolean checkedCompression; public PacketDecoder(User user) { diff --git a/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 081406e99..1c201e4a8 100644 --- a/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -9,12 +9,12 @@ import io.netty.channel.ChannelPromise; import io.netty.handler.codec.EncoderException; import io.netty.handler.codec.MessageToByteEncoder; import io.netty.util.ReferenceCountUtil; -import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.player.Player; @ChannelHandler.Sharable public class PacketEncoder extends MessageToByteEncoder { public User user; - public LocalPlayer player; + public Player player; public PacketEncoder(User user) { this.user = user; diff --git a/src/main/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerAccessor.java b/src/main/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerAccessor.java new file mode 100644 index 000000000..c60d500bd --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerAccessor.java @@ -0,0 +1,12 @@ +package io.github.retrooper.packetevents.mixin; + +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.Connection; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ClientPacketListener.class) +public interface ClientPacketListenerAccessor { + @Accessor + Connection getConnection(); +} diff --git a/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionAccessor.java b/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionAccessor.java new file mode 100644 index 000000000..ab078da65 --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionAccessor.java @@ -0,0 +1,11 @@ +package io.github.retrooper.packetevents.mixin; + +import io.netty.channel.Channel; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(net.minecraft.network.Connection.class) +public interface ConnectionAccessor { + @Accessor + Channel getChannel(); +} diff --git a/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java b/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java index b3cd47495..a83cc67f1 100644 --- a/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java +++ b/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java @@ -31,7 +31,7 @@ public class PacketEventsInjectorMixin { @Inject(method = "channelActive", at = @At("HEAD")) private void channelActive(ChannelHandlerContext ctx, CallbackInfo info) { - PacketEventsMod.LOGGER.info("Connected!"); + PacketEventsMod.LOGGER.debug("Connected!"); Channel channel = ctx.channel(); User user = new User(channel, ConnectionState.HANDSHAKING, ClientVersion.getLatest(), new UserProfile(null, null)); @@ -51,11 +51,11 @@ public class PacketEventsInjectorMixin { channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, decoder); channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, encoder); - PacketEventsMod.LOGGER.info("Pipeline: " + ChannelHelper.pipelineHandlerNamesAsString(channel)); + PacketEventsMod.LOGGER.debug("Pipeline: " + ChannelHelper.pipelineHandlerNamesAsString(channel)); } @Inject(method = "channelInactive", at = @At("HEAD")) private void channelInactive(ChannelHandlerContext ctx, CallbackInfo info) { - PacketEventsMod.LOGGER.info("Disconnected!"); + PacketEventsMod.LOGGER.debug("Disconnected!"); } } diff --git a/src/main/java/io/github/retrooper/packetevents/mixin/ServerGamePacketListenerImplAccessor.java b/src/main/java/io/github/retrooper/packetevents/mixin/ServerGamePacketListenerImplAccessor.java new file mode 100644 index 000000000..53d6cf4e8 --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/mixin/ServerGamePacketListenerImplAccessor.java @@ -0,0 +1,12 @@ +package io.github.retrooper.packetevents.mixin; + +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import net.minecraft.network.Connection; + +@Mixin(ServerGamePacketListenerImpl.class) +public interface ServerGamePacketListenerImplAccessor { + @Accessor + Connection getConnection(); +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e5e691b39..e1ff92dfc 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,6 +23,9 @@ ], "main": [ "io.github.retrooper.packetevents.PacketEventsMod" + ], + "client": [ + "io.github.retrooper.packetevents.PacketEventsMod" ] }, "mixins": [ diff --git a/src/main/resources/packetevents.mixins.json b/src/main/resources/packetevents.mixins.json index 4ad7c92c8..f21c746ad 100644 --- a/src/main/resources/packetevents.mixins.json +++ b/src/main/resources/packetevents.mixins.json @@ -4,9 +4,14 @@ "package": "io.github.retrooper.packetevents.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "PacketEventsInjectorMixin" + "ConnectionAccessor", + "PacketEventsInjectorMixin", + "ServerGamePacketListenerImplAccessor" ], "injectors": { "defaultRequire": 1 - } + }, + "client": [ + "ClientPacketListenerAccessor" + ] } From 25f896c6d1a05fde6cbd2e2c8a945a2766f6937d Mon Sep 17 00:00:00 2001 From: d3lta <83219809+D3lta-2-1@users.noreply.github.com> Date: Mon, 10 Apr 2023 15:19:27 +0200 Subject: [PATCH 3/4] debug singlePlayer and add lan support --- .../packetevents/ChannelUtilities.java | 21 +++++ .../packetevents/PacketEventsMod.java | 16 +++- .../fabric/FabricPacketEventsBuilder.java | 26 ++++--- .../handler/ClientPacketDecoder.java | 31 ++++++++ .../handler/ClientPacketEncoder.java | 22 ++++++ .../handler/ServerPacketDecoder.java | 77 ++++++++++++++++++- .../handler/ServerPacketEncoder.java | 46 ++++++++++- .../mixin/PacketEventsInjectorMixin.java | 30 +++++--- 8 files changed, 242 insertions(+), 27 deletions(-) create mode 100644 src/main/java/io/github/retrooper/packetevents/ChannelUtilities.java create mode 100644 src/main/java/io/github/retrooper/packetevents/handler/ClientPacketDecoder.java create mode 100644 src/main/java/io/github/retrooper/packetevents/handler/ClientPacketEncoder.java diff --git a/src/main/java/io/github/retrooper/packetevents/ChannelUtilities.java b/src/main/java/io/github/retrooper/packetevents/ChannelUtilities.java new file mode 100644 index 000000000..2920a28f9 --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/ChannelUtilities.java @@ -0,0 +1,21 @@ +package io.github.retrooper.packetevents; + +import io.netty.channel.ChannelPipeline; + +public class ChannelUtilities { + public static boolean pipelineContainsSplitterAndPrepender(ChannelPipeline pipeline) + { + boolean containsSplitter = false; + boolean containsPrepender = false; + for(var handler : pipeline) { + PacketEventsMod.LOGGER.info(handler.getClass().getName()); + if(handler.getKey().equals("splitter")) { + containsSplitter = true; + } + if(handler.getKey().equals("prepender")) { + containsPrepender = true; + } + } + return containsSplitter && containsPrepender; + } +} diff --git a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index a7f49207d..c375185a7 100644 --- a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -1,6 +1,8 @@ package io.github.retrooper.packetevents; import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.PacketListenerAbstract; +import com.github.retrooper.packetevents.event.PacketSendEvent; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsBuilder; import io.github.retrooper.packetevents.factory.fabric.ServerInstanceManager; import io.github.retrooper.packetevents.mixin.ClientPacketListenerAccessor; @@ -35,7 +37,16 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer, Cli ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { var connection = ((ServerGamePacketListenerImplAccessor)handler).getConnection(); var channel = ((ConnectionAccessor)connection).getChannel(); - PacketEvents.getAPI().getInjector().setPlayer(channel, handler.player); + if(ChannelUtilities.pipelineContainsSplitterAndPrepender(channel.pipeline())) + PacketEvents.getAPI().getInjector().setPlayer(channel, handler.player); + }); + + PacketEvents.getAPI().getEventManager().registerListener(new PacketListenerAbstract() { + @Override + public void onPacketSend(PacketSendEvent event) { + System.out.println("Packet send: " + event.getPacketType()); + System.out.println("player: " + event.getPlayer()); + } }); } @@ -44,7 +55,8 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer, Cli ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> { var connection = ((ClientPacketListenerAccessor)handler).getConnection(); var channel = ((ConnectionAccessor)connection).getChannel(); - PacketEvents.getAPI().getInjector().setPlayer(channel, Minecraft.getInstance().player); + if(ChannelUtilities.pipelineContainsSplitterAndPrepender(channel.pipeline())) + PacketEvents.getAPI().getInjector().setPlayer(channel, Minecraft.getInstance().player); }); } } diff --git a/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java index 2fcc96ec9..928aa8bd3 100644 --- a/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java +++ b/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java @@ -16,8 +16,8 @@ import com.github.retrooper.packetevents.settings.PacketEventsSettings; import com.github.retrooper.packetevents.util.LogManager; import com.github.retrooper.packetevents.util.reflection.ReflectionObject; import io.github.retrooper.packetevents.PacketEventsMod; -import io.github.retrooper.packetevents.handler.PacketDecoder; -import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.github.retrooper.packetevents.handler.ServerPacketDecoder; +import io.github.retrooper.packetevents.handler.ServerPacketEncoder; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.impl.netty.manager.protocol.ProtocolManagerAbstract; @@ -32,6 +32,7 @@ import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.UUID; import java.util.logging.Level; import java.util.regex.Pattern; @@ -93,11 +94,18 @@ public class FabricPacketEventsBuilder { private final PlayerManagerAbstract playerManager = new PlayerManagerAbstract() { @Override public int getPing(@NotNull Object player) { - String name = ((Player) player).getGameProfile().getName(); + UUID id = ((Player) player).getGameProfile().getId(); try { - return ((LocalPlayer) player).connection.getPlayerInfo(name).getLatency(); + var minecraft = getPlugin(); + if(minecraft == null) + return ((LocalPlayer) player).connection.getPlayerInfo(id).getLatency(); + else { + var playerManager = minecraft.getPlayerList(); + var playerEntity = playerManager.getPlayer(id); + return playerEntity.latency; + } } catch (Exception ex) { - PacketEvents.getAPI().getLogManager().debug("Failed to get ping for player " + name); + PacketEvents.getAPI().getLogManager().debug("Failed to get ping for player " + id); return -1; } } @@ -129,19 +137,19 @@ public class FabricPacketEventsBuilder { @Override public void updateUser(Object ch, User user) { Channel channel = (Channel) ch; - PacketDecoder decoder = (PacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME); + ServerPacketDecoder decoder = (ServerPacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME); decoder.user = user; - PacketEncoder encoder = (PacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME); + ServerPacketEncoder encoder = (ServerPacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME); encoder.user = user; } @Override public void setPlayer(Object ch, Object player) { Channel channel = (Channel) ch; - PacketDecoder decoder = (PacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME); + ServerPacketDecoder decoder = (ServerPacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME); decoder.player = (Player) player; - PacketEncoder encoder = (PacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME); + ServerPacketEncoder encoder = (ServerPacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME); encoder.player = (Player) player; } }; diff --git a/src/main/java/io/github/retrooper/packetevents/handler/ClientPacketDecoder.java b/src/main/java/io/github/retrooper/packetevents/handler/ClientPacketDecoder.java new file mode 100644 index 000000000..4c11b8865 --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/handler/ClientPacketDecoder.java @@ -0,0 +1,31 @@ +package io.github.retrooper.packetevents.handler; + +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import java.util.List; + +@ChannelHandler.Sharable +public class ClientPacketDecoder extends ServerPacketDecoder { + public ClientPacketDecoder(User user) { + super(user); + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + if (msg.isReadable()) { + ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg); + boolean recompress = handleCompression(ctx, outputBuffer); + PacketEventsImplHelper.handleClientBoundPacket(ctx.channel(), user, player, outputBuffer, false); + //TODO hasTasksAfter + if (outputBuffer.isReadable()) { + if (recompress) { + recompress(ctx, outputBuffer); + } + out.add(outputBuffer.retain()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/retrooper/packetevents/handler/ClientPacketEncoder.java b/src/main/java/io/github/retrooper/packetevents/handler/ClientPacketEncoder.java new file mode 100644 index 000000000..5d7a2788e --- /dev/null +++ b/src/main/java/io/github/retrooper/packetevents/handler/ClientPacketEncoder.java @@ -0,0 +1,22 @@ +package io.github.retrooper.packetevents.handler; + +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; + +@ChannelHandler.Sharable +public class ClientPacketEncoder extends ServerPacketEncoder { + public ClientPacketEncoder(User user) { + super(user); + } + + @Override + protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { + if (msg.isReadable()) { + PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player, msg, false); + out.writeBytes(msg); + } + } +} \ No newline at end of file diff --git a/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java index 92aa9ea5e..73c082e9d 100644 --- a/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java +++ b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketDecoder.java @@ -1,16 +1,29 @@ package io.github.retrooper.packetevents.handler; +import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.List; @ChannelHandler.Sharable -public class ServerPacketDecoder extends PacketDecoder { +public class ServerPacketDecoder extends MessageToMessageDecoder { + private static Method DECOMPRESSOR_METHOD, COMPRESSOR_METHOD; + public User user; + public Player player; + public boolean checkedCompression; + public ServerPacketDecoder(User user) { - super(user); + this.user = user; } @Override @@ -18,6 +31,7 @@ public class ServerPacketDecoder extends PacketDecoder { if (msg.isReadable()) { ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg); boolean recompress = handleCompression(ctx, outputBuffer); + PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player, outputBuffer, false); //TODO hasTasksAfter if (outputBuffer.isReadable()) { @@ -28,4 +42,63 @@ public class ServerPacketDecoder extends PacketDecoder { } } } + + @Override + public void channelInactive(@NotNull ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + } + + + protected boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { + if (checkedCompression) return false; + if (ctx.pipeline().names().indexOf("decompress") > ctx.pipeline().names().indexOf(PacketEvents.DECODER_NAME)) { + // Need to decompress this packet due to bad order + ChannelHandler decompressor = ctx.pipeline().get("decompress"); + //CompressionDecoder + try { + if (DECOMPRESSOR_METHOD == null) { + DECOMPRESSOR_METHOD = decompressor.getClass().getDeclaredMethod("decode", ChannelHandlerContext.class, ByteBuf.class, List.class); + } + List list = new ArrayList<>(1); + DECOMPRESSOR_METHOD.invoke(decompressor, ctx, buffer, list); + ByteBuf decompressed = (ByteBuf) list.get(0); + if (buffer != decompressed) { + try { + buffer.clear().writeBytes(decompressed); + } finally { + decompressed.release(); + } + } + //Relocate handlers + ServerPacketDecoder decoder = (ServerPacketDecoder) ctx.pipeline().remove(PacketEvents.DECODER_NAME); + ctx.pipeline().addAfter("decompress", PacketEvents.DECODER_NAME, decoder); + ServerPacketEncoder encoder = (ServerPacketEncoder) ctx.pipeline().remove(PacketEvents.ENCODER_NAME); + ctx.pipeline().addAfter("compress", PacketEvents.ENCODER_NAME, encoder); + checkedCompression = true; + return true; + } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { + e.printStackTrace(); + } + } + return false; + } + + protected void recompress(ChannelHandlerContext ctx, ByteBuf buffer) { + ByteBuf compressed = ctx.alloc().buffer(); + try { + ChannelHandler compressor = ctx.pipeline().get("compress"); + if (COMPRESSOR_METHOD == null) { + COMPRESSOR_METHOD = compressor.getClass().getDeclaredMethod("encode", ChannelHandlerContext.class, ByteBuf.class, ByteBuf.class); + } + COMPRESSOR_METHOD.invoke(compressor, ctx, buffer, compressed); + } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { + e.printStackTrace(); + } + try { + buffer.clear().writeBytes(compressed); + PacketEvents.getAPI().getLogManager().debug("Recompressed packet!"); + } finally { + compressed.release(); + } + } } \ No newline at end of file diff --git a/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java index b481808aa..cfc4551e5 100644 --- a/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java +++ b/src/main/java/io/github/retrooper/packetevents/handler/ServerPacketEncoder.java @@ -5,11 +5,53 @@ import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import io.netty.handler.codec.EncoderException; +import io.netty.handler.codec.MessageToByteEncoder; +import io.netty.util.ReferenceCountUtil; +import net.minecraft.world.entity.player.Player; @ChannelHandler.Sharable -public class ServerPacketEncoder extends PacketEncoder { +public class ServerPacketEncoder extends MessageToByteEncoder { + public User user; + public Player player; + public ServerPacketEncoder(User user) { - super(user); + this.user = user; + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { + ByteBuf buf = null; + try { + if (acceptOutboundMessage(msg)) { + ByteBuf in = (ByteBuf) msg; + buf = allocateBuffer(ctx, in, true); + try { + encode(ctx, in, buf); + } finally { + ReferenceCountUtil.release(in); + } + if (buf.isReadable()) { + ctx.write(buf, promise); + } else { + buf.release(); + //We cancelled this packet, do not pass it on to the next handler. + //ctx.write(Unpooled.EMPTY_BUFFER, promise); + } + buf = null; + } else { + ctx.write(msg, promise); + } + } catch (EncoderException e) { + throw e; + } catch (Throwable e) { + throw new EncoderException(e); + } finally { + if (buf != null) { + buf.release(); + } + } } @Override diff --git a/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java b/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java index a83cc67f1..8dffcd029 100644 --- a/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java +++ b/src/main/java/io/github/retrooper/packetevents/mixin/PacketEventsInjectorMixin.java @@ -7,11 +7,12 @@ import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.protocol.player.ClientVersion; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.protocol.player.UserProfile; +import io.github.retrooper.packetevents.ChannelUtilities; import io.github.retrooper.packetevents.PacketEventsMod; -import io.github.retrooper.packetevents.handler.PacketDecoder; -import io.github.retrooper.packetevents.handler.PacketEncoder; import io.github.retrooper.packetevents.handler.ServerPacketDecoder; import io.github.retrooper.packetevents.handler.ServerPacketEncoder; +import io.github.retrooper.packetevents.handler.ClientPacketDecoder; +import io.github.retrooper.packetevents.handler.ClientPacketEncoder; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import net.minecraft.network.protocol.PacketFlow; @@ -31,27 +32,32 @@ public class PacketEventsInjectorMixin { @Inject(method = "channelActive", at = @At("HEAD")) private void channelActive(ChannelHandlerContext ctx, CallbackInfo info) { - PacketEventsMod.LOGGER.debug("Connected!"); + Channel channel = ctx.channel(); User user = new User(channel, ConnectionState.HANDSHAKING, ClientVersion.getLatest(), new UserProfile(null, null)); ProtocolManager.USERS.put(channel, user); - PacketDecoder decoder; - PacketEncoder encoder; - if(receiving == PacketFlow.CLIENTBOUND) - { - decoder = new PacketDecoder(user); - encoder = new PacketEncoder(user); + ServerPacketDecoder decoder; + ServerPacketEncoder encoder; + if(receiving == PacketFlow.CLIENTBOUND) { + PacketEventsMod.LOGGER.info("Connected as Client!"); + decoder = new ClientPacketDecoder(user); + encoder = new ClientPacketEncoder(user); } else { + + PacketEventsMod.LOGGER.info("Connected as Server!"); decoder = new ServerPacketDecoder(user); encoder = new ServerPacketEncoder(user); } - channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, decoder); - channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, encoder); - PacketEventsMod.LOGGER.debug("Pipeline: " + ChannelHelper.pipelineHandlerNamesAsString(channel)); + if(ChannelUtilities.pipelineContainsSplitterAndPrepender(channel.pipeline())) + { + channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, decoder); + channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, encoder); + } + PacketEventsMod.LOGGER.info("Pipeline: " + ChannelHelper.pipelineHandlerNamesAsString(channel)); } @Inject(method = "channelInactive", at = @At("HEAD")) From db41fe529291842d962a7201d969210f004f9977 Mon Sep 17 00:00:00 2001 From: retrooper Date: Sat, 13 May 2023 20:32:59 +0200 Subject: [PATCH 4/4] Remove debugs --- .../io/github/retrooper/packetevents/PacketEventsMod.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index c375185a7..898ac4633 100644 --- a/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -44,8 +44,8 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer, Cli PacketEvents.getAPI().getEventManager().registerListener(new PacketListenerAbstract() { @Override public void onPacketSend(PacketSendEvent event) { - System.out.println("Packet send: " + event.getPacketType()); - System.out.println("player: " + event.getPlayer()); + //System.out.println("Packet send: " + event.getPacketType()); + //System.out.println("player: " + event.getPlayer()); } }); }