From a184bc387a64b63a0af2bb93290111d665f72f2d Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 29 Mar 2025 03:54:20 -0400 Subject: [PATCH 01/43] Remove usage of direct external/public static references to ProtocolManager.CHANNELS and ProtocolManager.USERS Fields will remain accessible for backwards compatibility in the unlikely case of a developer meddling these values in their own code. All usage of both these fields is now wrapped in interface methods which can be overwritten by other ProtocolManagers. --- .../packetevents/factory/fabric/FabricChannelInjector.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java index a04c48add..0a9570148 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java @@ -18,6 +18,8 @@ package io.github.retrooper.packetevents.factory.fabric; +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.injector.ChannelInjector; import com.github.retrooper.packetevents.protocol.PacketSide; From 7d9664746df7fe0a036c1aa451a5614aa7963fe4 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:12:11 -0500 Subject: [PATCH 02/43] Fire UserJoinEvent() on Fabric --- .../github/retrooper/packetevents/mixin/PlayerListMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java b/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java index cc9b3f097..0da4710c2 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java @@ -46,8 +46,8 @@ public class PlayerListMixin { at = @At("HEAD") ) private void preNewPlayerPlace( - Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci + Connection connection, ServerPlayer player, + CommonListenerCookie cookie, CallbackInfo ci ) { PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); } From 6a88a90600c1213987e5153fcede3c5b7a7b4376 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:30:13 -0500 Subject: [PATCH 03/43] Execute getTasksAfterSend() on fabric and replicate other PacketEncoder behaviours on other platforms --- .../packetevents/handler/PacketEncoder.java | 108 +++++++++++++++++- .../packetevents/mixin/PlayerListMixin.java | 4 +- 2 files changed, 105 insertions(+), 7 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index eded37b8e..d0ce3f3ff 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -18,15 +18,27 @@ package io.github.retrooper.packetevents.handler; +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.PacketSendEvent; +import com.github.retrooper.packetevents.event.ProtocolPacketEvent; +import com.github.retrooper.packetevents.exception.CancelPacketException; +import com.github.retrooper.packetevents.exception.InvalidDisconnectPacketSend; +import com.github.retrooper.packetevents.exception.PacketProcessException; +import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.protocol.PacketSide; import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.ExceptionUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDisconnect; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public class PacketEncoder extends ChannelOutboundHandlerAdapter { @@ -34,6 +46,7 @@ public class PacketEncoder extends ChannelOutboundHandlerAdapter { private final PacketSide side; public User user; public Player player; + private ChannelPromise promise; public PacketEncoder(PacketSide side, User user) { this.side = side; @@ -46,15 +59,100 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) ctx.write(msg, promise); return; } + + // Handle promise management first (matches Spigot) + ChannelPromise oldPromise = this.promise != null && !this.promise.isSuccess() ? this.promise : null; + promise.addListener(p -> this.promise = oldPromise); + this.promise = promise; + + // Process the packet and execute post-send tasks (matches Spigot) + handlePacket(ctx, in, promise); + + // Check for empty packets last (matches Spigot) if (!in.isReadable()) { in.release(); + throw CancelPacketException.INSTANCE; + } + + // Forward the packet if readable + ctx.write(in, promise); + } + + private @Nullable ProtocolPacketEvent handlePacket(ChannelHandlerContext ctx, ByteBuf buffer, ChannelPromise promise) throws Exception { + // Process the packet using PacketEventsImplHelper (similar to Spigot) + ProtocolPacketEvent protocolPacketEvent = PacketEventsImplHelper.handlePacket( + ctx.channel(), this.user, this.player, buffer, false, this.side + ); + + // Execute post-send tasks (required for cross-platform support) + if (protocolPacketEvent instanceof PacketSendEvent packetSendEvent && packetSendEvent.hasTasksAfterSend()) { + promise.addListener((p) -> { + for (Runnable task : packetSendEvent.getTasksAfterSend()) { + task.run(); + } + }); + } + return protocolPacketEvent; + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + // Handle CancelPacketException (similar to Spigot) + if (ExceptionUtil.isException(cause, CancelPacketException.class)) { return; } - PacketEventsImplHelper.handlePacket(ctx.channel(), - this.user, this.player, in, false, this.side); - if (in.isReadable()) { - ctx.write(in, promise); + // Handle InvalidDisconnectPacketSend (similar to Spigot) + if (ExceptionUtil.isException(cause, InvalidDisconnectPacketSend.class)) { + return; + } + + // Handle PacketProcessException (similar to Spigot) + boolean didWeCauseThis = ExceptionUtil.isException(cause, PacketProcessException.class); + if (didWeCauseThis && (user == null || user.getEncoderState() != ConnectionState.HANDSHAKING)) { + if (!isMinecraftServerInstanceDebugging()) { + if (PacketEvents.getAPI().getSettings().isFullStackTraceEnabled()) { + cause.printStackTrace(); + } else { + PacketEvents.getAPI().getLogManager().warn(cause.getMessage()); + } + } + + if (PacketEvents.getAPI().getSettings().isKickOnPacketExceptionEnabled()) { + try { + if (user != null && player instanceof ServerPlayer) { + // Use cross-platform PacketEvents wrapper for disconnect packet + WrapperPlayServerDisconnect disconnectPacket = new WrapperPlayServerDisconnect( + net.kyori.adventure.text.Component.text("Invalid packet") + ); + user.sendPacket(disconnectPacket); + } + } catch (Exception ignored) { + // Ignore exceptions during disconnect (similar to Spigot) + } + ctx.channel().close(); + + if (player instanceof ServerPlayer serverPlayer) { + // Schedule delayed kick (Fabric-specific, using Minecraft's scheduler) + serverPlayer.getServer().execute(() -> { + serverPlayer.connection.disconnect(Component.literal("Invalid packet")); + }); + } + + if (user != null) { + PacketEvents.getAPI().getLogManager().warn( + "Disconnected " + user.getProfile().getName() + " due to invalid packet!" + ); + } + } } + + super.exceptionCaught(ctx, cause); + } + + // Placeholder for Minecraft server debugging check (Fabric-specific) + private boolean isMinecraftServerInstanceDebugging() { + // TODO: Implement Fabric-specific debugging check + return false; } -} +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java b/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java index 0da4710c2..cc9b3f097 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java @@ -46,8 +46,8 @@ public class PlayerListMixin { at = @At("HEAD") ) private void preNewPlayerPlace( - Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci + Connection connection, ServerPlayer player, + CommonListenerCookie cookie, CallbackInfo ci ) { PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); } From 1364e6f0de52d174b390dad28971457363b84bdc Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 2 Mar 2025 21:54:03 -0500 Subject: [PATCH 04/43] Basic Multiversion Fabric support --- fabric/build.gradle.kts | 16 ++- fabric/gradle.properties | 8 +- fabric/mc1201/build.gradle.kts | 58 ++++++++++ fabric/mc1201/gradle.properties | 10 ++ .../mc1201/PacketEventsClientMod.java | 33 ++++++ .../fabric/Fabric1201ClientPlayerManager.java | 50 +++++++++ .../mixin/ClientPacketListenerMixin.java | 73 +++++++++++++ .../packetevents/mc1201/PacketEventsMod.java | 32 ++++++ .../mc1201/PacketEventsServerMod.java | 32 ++++++ .../fabric/Fabric1201ServerPlayerManager.java | 42 ++++++++ .../mc1201}/mixin/ConnectionMixin.java | 6 +- .../mc1201}/mixin/PlayerListMixin.java | 7 +- .../mc1201/src/main/resources/fabric.mod.json | 35 ++++++ .../resources/packetevents-mc1201.mixins.json | 16 +++ .../main/resources/packetevents.accesswidener | 11 ++ fabric/mc1211/build.gradle.kts | 58 ++++++++++ fabric/mc1211/gradle.properties | 10 ++ .../mc1211/PacketEventsClientMod.java | 33 ++++++ .../Fabric1211ClientPlayerManager.java} | 5 +- .../mixin/ClientPacketListenerMixin.java | 2 +- .../packetevents/mc1211/PacketEventsMod.java | 32 ++++++ .../mc1211/PacketEventsServerMod.java | 32 ++++++ .../Fabric1211ServerPlayerManager.java} | 4 +- .../mc1211/mixin/ConnectionMixin.java | 92 ++++++++++++++++ .../mc1211/mixin/PlayerListMixin.java | 100 ++++++++++++++++++ .../mc1211/src/main/resources/fabric.mod.json | 35 ++++++ .../resources/packetevents-mc1211.mixins.json | 16 +++ .../main/resources/packetevents.accesswidener | 11 ++ .../retrooper/packetevents/LazyHolder.java | 57 ++++++++++ .../packetevents/PacketEventsClientMod.java | 13 +-- .../packetevents/PacketEventsMod.java | 12 ++- .../packetevents/PacketEventsServerMod.java | 6 +- .../factory/fabric/FabricPacketEventsAPI.java | 14 +-- .../fabric/FabricPacketEventsBuilder.java | 0 .../main/resources/packetevents.accesswidener | 3 +- .../main/resources/packetevents.mixins.json | 7 -- settings.gradle.kts | 2 + 37 files changed, 924 insertions(+), 49 deletions(-) create mode 100644 fabric/mc1201/build.gradle.kts create mode 100644 fabric/mc1201/gradle.properties create mode 100644 fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java create mode 100644 fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java create mode 100644 fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java create mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java create mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java create mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java rename fabric/{src/main/java/io/github/retrooper/packetevents => mc1201/src/main/java/io/github/retrooper/packetevents/mc1201}/mixin/ConnectionMixin.java (94%) rename fabric/{src/main/java/io/github/retrooper/packetevents => mc1201/src/main/java/io/github/retrooper/packetevents/mc1201}/mixin/PlayerListMixin.java (94%) create mode 100644 fabric/mc1201/src/main/resources/fabric.mod.json create mode 100644 fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json create mode 100644 fabric/mc1201/src/main/resources/packetevents.accesswidener create mode 100644 fabric/mc1211/build.gradle.kts create mode 100644 fabric/mc1211/gradle.properties create mode 100644 fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java rename fabric/{src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricClientPlayerManager.java => mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java} (90%) rename fabric/{src/client/java/io/github/retrooper/packetevents => mc1211/src/client/java/io/github/retrooper/packetevents/mc1211}/mixin/ClientPacketListenerMixin.java (98%) create mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java create mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java rename fabric/{src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPlayerManager.java => mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java} (91%) create mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java create mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java create mode 100644 fabric/mc1211/src/main/resources/fabric.mod.json create mode 100644 fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json create mode 100644 fabric/mc1211/src/main/resources/packetevents.accesswidener create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java rename fabric/src/{client => main}/java/io/github/retrooper/packetevents/PacketEventsClientMod.java (75%) rename fabric/src/{client => main}/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java (100%) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index f864b0b24..e6e454819 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -54,13 +54,25 @@ tasks { } loom { - splitEnvironmentSourceSets() mods { register("packetevents") { sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) } } accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() .resolve("${rootProject.name}.accesswidener") } + +subprojects.forEach { + tasks.named("remapJar").configure { + dependsOn("${it.path}:remapJar") + } +} + +tasks.remapJar.configure { + subprojects.forEach { subproject -> + subproject.tasks.matching { it.name == "remapJar" }.configureEach { + nestedJars.from(this) + } + } +} diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 1433bd04d..a27726efb 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -4,7 +4,7 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.5 -parchment_mappings=2025.03.23 -parchment_minecraft_version=1.21.4 -loader_version=0.16.10 +minecraft_version=1.20.1 +parchment_mappings=2023.09.03 +parchment_minecraft_version=1.20.1 +loader_version=0.15.11 diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts new file mode 100644 index 000000000..e795549db --- /dev/null +++ b/fabric/mc1201/build.gradle.kts @@ -0,0 +1,58 @@ +plugins { + alias(libs.plugins.fabric.loom) +} + +repositories { + maven("https://repo.codemc.io/repository/maven-snapshots/") + maven { + name = "ParchmentMC" + url = uri("https://maven.parchmentmc.org") + } +} + +val minecraft_version: String by project +val parchment_minecraft_version: String by project +val parchment_mappings: String by project +val loader_version: String by project + +dependencies { + implementation(libs.bundles.adventure) + implementation(project(":api")) + implementation(project(":netty-common")) + implementation(project(":fabric")) + + // To change the versions, see the gradle.properties file + minecraft("com.mojang:minecraft:$minecraft_version") + mappings(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") + }) + + modImplementation("net.fabricmc:fabric-loader:$loader_version") +} + +tasks { + withType { + val targetJavaVersion = 17 + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { + options.release = targetJavaVersion + } + } +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } + accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() + .resolve("${rootProject.name}.accesswidener") +} + + +tasks.compileJava { + options.release.set(17) +} \ No newline at end of file diff --git a/fabric/mc1201/gradle.properties b/fabric/mc1201/gradle.properties new file mode 100644 index 000000000..a27726efb --- /dev/null +++ b/fabric/mc1201/gradle.properties @@ -0,0 +1,10 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.1 +parchment_mappings=2023.09.03 +parchment_minecraft_version=1.20.1 +loader_version=0.15.11 diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java new file mode 100644 index 000000000..97b0bff39 --- /dev/null +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java @@ -0,0 +1,33 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1201; + + +import io.github.retrooper.packetevents.LazyHolder; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ClientPlayerManager; + +public class PacketEventsClientMod extends io.github.retrooper.packetevents.PacketEventsClientMod { + + @Override + public void onPreLaunch() { + FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1201ClientPlayerManager::new); + super.preLaunch(); + } +} diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java new file mode 100644 index 000000000..b2703a86d --- /dev/null +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java @@ -0,0 +1,50 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1201.factory.fabric; + +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.client.player.LocalPlayer; +import org.jetbrains.annotations.NotNull; + +public class Fabric1201ClientPlayerManager extends Fabric1201ServerPlayerManager { + + @Override + public int getPing(@NotNull Object playerObj) { + if (playerObj instanceof LocalPlayer player) { + PlayerInfo info = player.connection.getPlayerInfo(player.getUUID()); + if (info != null) { + return info.getLatency(); + } + // if the server doesn't show the player info of + // the player itself, try to fall back to potential + // latency sampling data - which is often not present + // TODO fix later for 1.20.1 + return -1; + } + return super.getPing(playerObj); + } + + @Override + public Object getChannel(@NotNull Object player) { + if (player instanceof LocalPlayer) { + return ((LocalPlayer) player).connection.getConnection().channel; + } + return super.getChannel(player); + } +} diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java new file mode 100644 index 000000000..1cc0e5900 --- /dev/null +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java @@ -0,0 +1,73 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1201.mixin; + +import com.github.retrooper.packetevents.PacketEvents; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.Connection; +import net.minecraft.network.TickablePacketListener; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import org.objectweb.asm.Opcodes; +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; + +@Mixin(ClientPacketListener.class) +public abstract class ClientPacketListenerMixin implements TickablePacketListener, + ClientGamePacketListener { + + @Final @Shadow public Minecraft minecraft; + @Shadow public abstract Connection getConnection(); + /** + * @reason Associate connection instance with player instance + */ + @Inject( + method = "handleLogin", + at = @At( + value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/client/Minecraft;player:Lnet/minecraft/client/player/LocalPlayer;", + shift = At.Shift.AFTER + ) + ) + private void postLoginPlayerConstruct(CallbackInfo ci) { + PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, this.minecraft.player); + } + + /** + * @reason Minecraft creates a new player instance on respawn + */ + @Inject( + method = "handleRespawn", + at = @At( + // inject immediately after new player instance has been created + value = "INVOKE", + target = "Lnet/minecraft/client/player/LocalPlayer;setId(I)V" + ) + ) + private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) LocalPlayer player) { + PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, player); + } +} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java new file mode 100644 index 000000000..9ab148ea3 --- /dev/null +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java @@ -0,0 +1,32 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1201; + +public class PacketEventsMod extends io.github.retrooper.packetevents.PacketEventsMod { + + @Override + public void onPreLaunch() { + super.preLaunch(); + } + + @Override + public void onInitialize() { + super.initialize(); + } +} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java new file mode 100644 index 000000000..6075422b4 --- /dev/null +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java @@ -0,0 +1,32 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1201; + +import io.github.retrooper.packetevents.LazyHolder; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; + +public class PacketEventsServerMod extends io.github.retrooper.packetevents.PacketEventsServerMod { + + @Override + public void onPreLaunch() { + FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1201ServerPlayerManager::new); + super.preLaunch(); + } +} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java new file mode 100644 index 000000000..899b06fc7 --- /dev/null +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java @@ -0,0 +1,42 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1201.factory.fabric; + +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.NotNull; + +public class Fabric1201ServerPlayerManager extends PlayerManagerAbstract { + + @Override + public int getPing(@NotNull Object player) { + if (player instanceof ServerPlayer) { + return ((ServerPlayer) player).latency; + } + throw new UnsupportedOperationException("Unsupported player implementation: " + player); + } + + @Override + public Object getChannel(@NotNull Object player) { + if (player instanceof ServerPlayer) { + return ((ServerPlayer) player).connection.connection.channel; + } + throw new UnsupportedOperationException("Unsupported player implementation: " + player); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java similarity index 94% rename from fabric/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionMixin.java rename to fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java index baedaf74c..fa15f43d5 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mixin; +package io.github.retrooper.packetevents.mc1201.mixin; import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.event.UserConnectEvent; @@ -33,7 +33,6 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelPipeline; import net.minecraft.SharedConstants; -import net.minecraft.network.BandwidthDebugMonitor; import net.minecraft.network.protocol.PacketFlow; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -56,8 +55,7 @@ public class ConnectionMixin { at = @At("TAIL") ) private static void configureSerialization( - ChannelPipeline pipeline, PacketFlow flow, boolean memoryOnly, - BandwidthDebugMonitor bandwithDebugMonitor, CallbackInfo ci + ChannelPipeline pipeline, PacketFlow flow, CallbackInfo ci ) { PacketSide pipelineSide = switch (flow) { case CLIENTBOUND -> PacketSide.CLIENT; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java similarity index 94% rename from fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java rename to fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java index cc9b3f097..2dfb46404 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/PlayerListMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mixin; +package io.github.retrooper.packetevents.mc1201.mixin; import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; @@ -27,7 +27,6 @@ import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.server.players.PlayerList; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -47,7 +46,7 @@ public class PlayerListMixin { ) private void preNewPlayerPlace( Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci + CallbackInfo ci ) { PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); } @@ -65,7 +64,7 @@ private void preNewPlayerPlace( ) private void onPlayerLogin( Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci + CallbackInfo ci ) { PacketEventsAPI api = PacketEvents.getAPI(); diff --git a/fabric/mc1201/src/main/resources/fabric.mod.json b/fabric/mc1201/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..ab904685c --- /dev/null +++ b/fabric/mc1201/src/main/resources/fabric.mod.json @@ -0,0 +1,35 @@ +{ + "schemaVersion": 1, + "id": "packetevents-mc1201", + "version": "${version}", + "name": "PacketEvents for 1.20.1", + "description": "", + "authors": [ + "retrooper" + ], + "contact": {}, + "license": "GPL-3.0", + "environment": "*", + "entrypoints": { + "pePreLaunchClient": [ + "io.github.retrooper.packetevents.mc1201.PacketEventsClientMod" + ], + "pePreLaunchServer": [ + "io.github.retrooper.packetevents.mc1201.PacketEventsServerMod" + ], + "preLaunch": [ + "io.github.retrooper.packetevents.mc1201.PacketEventsMod" + ], + "main": [ + "io.github.retrooper.packetevents.mc1201.PacketEventsMod" + ] + }, + "mixins": [ + "packetevents-mc1201.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "fabricloader": ">=0.15.11", + "minecraft": ">=1.20 <1.21" + } +} diff --git a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json new file mode 100644 index 000000000..7a1b75b2b --- /dev/null +++ b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.retrooper.packetevents.mc1201.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "ClientPacketListenerMixin" + ], + "mixins": [ + "ConnectionMixin", + "PlayerListMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric/mc1201/src/main/resources/packetevents.accesswidener b/fabric/mc1201/src/main/resources/packetevents.accesswidener new file mode 100644 index 000000000..eae3f36df --- /dev/null +++ b/fabric/mc1201/src/main/resources/packetevents.accesswidener @@ -0,0 +1,11 @@ +accessWidener v1 named + + +# fields +accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; +accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; +accessible field net/minecraft/client/multiplayer/ClientPacketListener minecraft Lnet/minecraft/client/Minecraft; + +# methods + +# classes diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts new file mode 100644 index 000000000..740e93210 --- /dev/null +++ b/fabric/mc1211/build.gradle.kts @@ -0,0 +1,58 @@ +plugins { + alias(libs.plugins.fabric.loom) +} + +repositories { + maven("https://repo.codemc.io/repository/maven-snapshots/") + maven { + name = "ParchmentMC" + url = uri("https://maven.parchmentmc.org") + } +} + +val minecraft_version: String by project +val parchment_minecraft_version: String by project +val parchment_mappings: String by project +val loader_version: String by project + +dependencies { + compileOnly(libs.bundles.adventure) + compileOnly(project(":api")) + compileOnly(project(":netty-common")) + compileOnly(project(":fabric")) + + // To change the versions, see the gradle.properties file + minecraft("com.mojang:minecraft:$minecraft_version") + mappings(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") + }) + + modImplementation("net.fabricmc:fabric-loader:$loader_version") +} + +tasks { + withType { + val targetJavaVersion = 17 + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { + options.release = targetJavaVersion + } + } +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } + accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() + .resolve("${rootProject.name}.accesswidener") +} + + +tasks.compileJava { + options.release.set(17) +} \ No newline at end of file diff --git a/fabric/mc1211/gradle.properties b/fabric/mc1211/gradle.properties new file mode 100644 index 000000000..287de4351 --- /dev/null +++ b/fabric/mc1211/gradle.properties @@ -0,0 +1,10 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.21.1 +parchment_mappings=2024.11.17 +parchment_minecraft_version=1.21.1 +loader_version=0.15.11 \ No newline at end of file diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java new file mode 100644 index 000000000..c31dc1326 --- /dev/null +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java @@ -0,0 +1,33 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1211; + + +import io.github.retrooper.packetevents.LazyHolder; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ClientPlayerManager; + +public class PacketEventsClientMod extends io.github.retrooper.packetevents.PacketEventsClientMod { + + @Override + public void onPreLaunch() { + FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1211ClientPlayerManager::new); + super.preLaunch(); + } +} diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricClientPlayerManager.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java similarity index 90% rename from fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricClientPlayerManager.java rename to fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java index 84591d065..f46f7f045 100644 --- a/fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricClientPlayerManager.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java @@ -16,14 +16,14 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.factory.fabric; +package io.github.retrooper.packetevents.mc1211.factory.fabric; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.LocalPlayer; import org.jetbrains.annotations.NotNull; -public class FabricClientPlayerManager extends FabricPlayerManager { +public class Fabric1211ClientPlayerManager extends Fabric1211ServerPlayerManager { @Override public int getPing(@NotNull Object playerObj) { @@ -35,6 +35,7 @@ public int getPing(@NotNull Object playerObj) { // if the server doesn't show the player info of // the player itself, try to fall back to potential // latency sampling data - which is often not present + // TODO fix later for 1.20.1 return (int) Minecraft.getInstance().getDebugOverlay().getPingLogger().get(0); } return super.getPing(playerObj); diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java similarity index 98% rename from fabric/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java rename to fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java index 83ec01ea1..034291b9c 100644 --- a/fabric/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mixin; +package io.github.retrooper.packetevents.mc1211.mixin; import com.github.retrooper.packetevents.PacketEvents; import com.llamalad7.mixinextras.sugar.Local; diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java new file mode 100644 index 000000000..bb482b89b --- /dev/null +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java @@ -0,0 +1,32 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1211; + +public class PacketEventsMod extends io.github.retrooper.packetevents.PacketEventsMod { + + @Override + public void onPreLaunch() { + super.preLaunch(); + } + + @Override + public void onInitialize() { + super.initialize(); + } +} diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java new file mode 100644 index 000000000..074810dd9 --- /dev/null +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java @@ -0,0 +1,32 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1211; + +import io.github.retrooper.packetevents.LazyHolder; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ServerPlayerManager; + +public class PacketEventsServerMod extends io.github.retrooper.packetevents.PacketEventsServerMod { + + @Override + public void onPreLaunch() { + FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1211ServerPlayerManager::new); + super.preLaunch(); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPlayerManager.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java similarity index 91% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPlayerManager.java rename to fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java index e7a6fe419..a26d1ded8 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPlayerManager.java +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.factory.fabric; +package io.github.retrooper.packetevents.mc1211.factory.fabric; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; -public class FabricPlayerManager extends PlayerManagerAbstract { +public class Fabric1211ServerPlayerManager extends PlayerManagerAbstract { @Override public int getPing(@NotNull Object player) { diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java new file mode 100644 index 000000000..cdb1f8bef --- /dev/null +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java @@ -0,0 +1,92 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1211.mixin; + +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.UserConnectEvent; +import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; +import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.protocol.PacketSide; +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 com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.github.retrooper.packetevents.handler.PacketDecoder; +import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelPipeline; +import net.minecraft.SharedConstants; +import net.minecraft.network.BandwidthDebugMonitor; +import net.minecraft.network.protocol.PacketFlow; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(net.minecraft.network.Connection.class) +public class ConnectionMixin { + + // doesn't account for mods like ViaFabric + @Unique + private static final ClientVersion CLIENT_VERSION = + ClientVersion.getById(SharedConstants.getProtocolVersion()); + + @Inject( + method = "configureSerialization", + at = @At("TAIL") + ) + private static void configureSerialization( + ChannelPipeline pipeline, PacketFlow flow, boolean memoryOnly, + BandwidthDebugMonitor bandwithDebugMonitor, CallbackInfo ci + ) { + PacketSide pipelineSide = switch (flow) { + case CLIENTBOUND -> PacketSide.CLIENT; + case SERVERBOUND -> PacketSide.SERVER; + }; + PacketSide apiSide = PacketEvents.getAPI().getInjector().getPacketSide(); + if (pipelineSide != apiSide) { + // if pipeline side doesn't match api side, don't inject into + // this pipeline - it probably means this is the pipeline from + // integrated server to minecraft client, which is currently unsupported + PacketEvents.getAPI().getLogManager().debug("Skipped pipeline injection on " + pipelineSide); + return; + } + + PacketEvents.getAPI().getLogManager().debug("Game connected!"); + + Channel channel = pipeline.channel(); + User user = new User(channel, ConnectionState.HANDSHAKING, + CLIENT_VERSION, new UserProfile(null, null)); + ProtocolManager.USERS.put(channel.pipeline(), user); + + UserConnectEvent connectEvent = new UserConnectEvent(user); + PacketEvents.getAPI().getEventManager().callEvent(connectEvent); + if (connectEvent.isCancelled()) { + channel.unsafe().closeForcibly(); + return; + } + + channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); + channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); + channel.closeFuture().addListener((ChannelFutureListener) future -> + PacketEventsImplHelper.handleDisconnection(user.getChannel(), user.getUUID())); + } +} \ No newline at end of file diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java new file mode 100644 index 000000000..f557a4bbf --- /dev/null +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java @@ -0,0 +1,100 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1211.mixin; + +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.event.UserLoginEvent; +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.FakeChannelUtil; +import io.netty.channel.Channel; +import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.players.PlayerList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PlayerList.class) +public class PlayerListMixin { + + /** + * @reason Associate connection instance with player instance + */ + @Inject( + method = "placeNewPlayer", + at = @At("HEAD") + ) + private void preNewPlayerPlace( + Connection connection, ServerPlayer player, + CommonListenerCookie cookie, CallbackInfo ci + ) { + PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); + } + + /** + * @reason Associate connection instance with player instance and handle login event + */ + @Inject( + method = "placeNewPlayer", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V", + shift = At.Shift.AFTER + ) + ) + private void onPlayerLogin( + Connection connection, ServerPlayer player, + CommonListenerCookie cookie, CallbackInfo ci + ) { + PacketEventsAPI api = PacketEvents.getAPI(); + + User user = api.getPlayerManager().getUser(player); + if (user == null) { + Object channelObj = api.getPlayerManager().getChannel(player); + + // Check if it's a fake connection + if (!FakeChannelUtil.isFakeChannel(channelObj) && + (!api.isTerminated() || api.getSettings().isKickIfTerminated())) { + // Kick the player if they're not a fake player + player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); + } + return; + } + + api.getEventManager().callEvent(new UserLoginEvent(user, player)); + } + + /** + * @reason Minecraft creates a new player instance on respawn + */ + @Inject( + method = "respawn", + at = @At("RETURN") + ) + private void postRespawn(CallbackInfoReturnable cir) { + ServerPlayer player = cir.getReturnValue(); + Channel channel = player.connection.connection.channel; + PacketEvents.getAPI().getInjector().setPlayer(channel, player); + } +} \ No newline at end of file diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..ff2f30b8a --- /dev/null +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -0,0 +1,35 @@ +{ + "schemaVersion": 1, + "id": "packetevents-mc1201", + "version": "${version}", + "name": "PacketEvents for 1.20.1", + "description": "", + "authors": [ + "retrooper" + ], + "contact": {}, + "license": "GPL-3.0", + "environment": "*", + "entrypoints": { + "pePreLaunchClient": [ + "io.github.retrooper.packetevents.PacketEventsClientMod" + ], + "pePreLaunchServer": [ + "io.github.retrooper.packetevents.PacketEventsServerMod" + ], + "preLaunch": [ + "io.github.retrooper.packetevents.PacketEventsMod" + ], + "main": [ + "io.github.retrooper.packetevents.PacketEventsMod" + ] + }, + "mixins": [ + "packetevents-mc1211.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "fabricloader": ">=0.15.11", + "minecraft": ">=1.21" + } +} diff --git a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json new file mode 100644 index 000000000..7a1b75b2b --- /dev/null +++ b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.retrooper.packetevents.mc1201.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "ClientPacketListenerMixin" + ], + "mixins": [ + "ConnectionMixin", + "PlayerListMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric/mc1211/src/main/resources/packetevents.accesswidener b/fabric/mc1211/src/main/resources/packetevents.accesswidener new file mode 100644 index 000000000..50f0fb6f9 --- /dev/null +++ b/fabric/mc1211/src/main/resources/packetevents.accesswidener @@ -0,0 +1,11 @@ +accessWidener v1 named + + +# fields +accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; +accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; +accessible field net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; + +# methods + +# classes diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java b/fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java new file mode 100644 index 000000000..a1aebabe8 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java @@ -0,0 +1,57 @@ +package io.github.retrooper.packetevents; + +import java.util.function.Supplier; + +public interface LazyHolder { + static LazyHolder threadSafe(Supplier supplier) { + return new ThreadSafeLazyHolder<>(supplier); + } + + static LazyHolder simple(Supplier supplier) { + return new SimpleLazyHolder<>(supplier); + } + + T get(); +} + +final class ThreadSafeLazyHolder implements LazyHolder { + private final Supplier supplier; + private volatile T value; + + ThreadSafeLazyHolder(Supplier supplier) { + this.supplier = supplier; + } + + @Override + public T get() { + T result = value; + if (result == null) { + synchronized (this) { + result = value; + if (result == null) { + result = supplier.get(); + value = result; + } + } + } + return result; + } +} + +final class SimpleLazyHolder implements LazyHolder { + private T value; + private Supplier supplier; + + SimpleLazyHolder(Supplier supplier) { + this.supplier = supplier; + } + + @Override + public T get() { + if (supplier != null) { + value = supplier.get(); + supplier = null; + } + return value; + } +} \ No newline at end of file diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java similarity index 75% rename from fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java rename to fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java index 6fe46ecc5..1104a98a4 100644 --- a/fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java @@ -19,25 +19,20 @@ package io.github.retrooper.packetevents; import com.github.retrooper.packetevents.PacketEvents; -import io.github.retrooper.packetevents.factory.fabric.FabricClientPlayerManager; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; public class PacketEventsClientMod implements PreLaunchEntrypoint { public static FabricPacketEventsAPI constructApi(String modid) { - return new FabricPacketEventsAPI(modid, EnvType.CLIENT) { - @Override - protected PlayerManagerAbstract constructPlayerManager() { - return new FabricClientPlayerManager(); - } - }; + return new FabricPacketEventsAPI(modid, EnvType.CLIENT); } @Override - public void onPreLaunch() { + public void onPreLaunch() {} + + public void preLaunch() { PacketEvents.setAPI(constructApi(PacketEventsMod.MOD_ID)); PacketEvents.getAPI().load(); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 4e83dd3b5..17c99ae15 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -29,19 +29,23 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { public static final String MOD_ID = "packetevents"; @Override - public void onPreLaunch() { + public void onPreLaunch() {} + + public void preLaunch() { FabricLoader loader = FabricLoader.getInstance(); String entrypoint = switch (loader.getEnvironmentType()) { case CLIENT -> "pePreLaunchClient"; case SERVER -> "pePreLaunchServer"; }; loader.invokeEntrypoints(entrypoint, - PreLaunchEntrypoint.class, - PreLaunchEntrypoint::onPreLaunch); + PreLaunchEntrypoint.class, + PreLaunchEntrypoint::onPreLaunch); } @Override - public void onInitialize() { + public void onInitialize() {} + + public void initialize() { PacketEventsAPI api = PacketEvents.getAPI(); if (api != null) { api.init(); diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java index d575d473d..3e85acb4c 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java @@ -20,6 +20,8 @@ import com.github.retrooper.packetevents.PacketEvents; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import java.util.function.Supplier; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; @@ -30,7 +32,9 @@ public static FabricPacketEventsAPI constructApi(String modid) { } @Override - public void onPreLaunch() { + public void onPreLaunch() {} + + public void preLaunch() { PacketEvents.setAPI(constructApi(PacketEventsMod.MOD_ID)); PacketEvents.getAPI().load(); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 0e506835d..2c63eb00b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -30,6 +30,7 @@ import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import com.github.retrooper.packetevents.settings.PacketEventsSettings; import com.github.retrooper.packetevents.util.LogManager; +import io.github.retrooper.packetevents.LazyHolder; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import net.fabricmc.api.EnvType; @@ -42,6 +43,9 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private static final Logger LOGGER = LoggerFactory.getLogger("PacketEvents"); + // TODO, refactor if booky and retrooper approve, bad design having settable static field, exists to maintain + // 100% backward compatability + public static LazyHolder staticLazyPlayerManagerHolder = () -> null; private final String modId; private final EnvType environment; @@ -49,7 +53,7 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private final ProtocolManager protocolManager; private final ServerManager serverManager; - private final PlayerManagerAbstract playerManager; + private final LazyHolder playerManager; private final ChannelInjector injector; private final NettyManager nettyManager = new NettyManagerImpl(); private final LogManager logManager = new FabricLogger(LOGGER); @@ -69,7 +73,7 @@ public FabricPacketEventsAPI(String modId, EnvType environment, PacketEventsSett this.protocolManager = new FabricProtocolManager(environment); this.serverManager = this.constructServerManager(); - this.playerManager = this.constructPlayerManager(); + this.playerManager = null; this.injector = new FabricChannelInjector(environment); } @@ -77,10 +81,6 @@ protected ServerManager constructServerManager() { return new FabricServerManager(); } - protected PlayerManagerAbstract constructPlayerManager() { - return new FabricPlayerManager(); - } - @Override public void load() { if (this.loaded) { @@ -167,7 +167,7 @@ public LogManager getLogManager() { @Override public PlayerManager getPlayerManager() { - return this.playerManager; + return staticLazyPlayerManagerHolder.get(); } @Override diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java similarity index 100% rename from fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java rename to fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java diff --git a/fabric/src/main/resources/packetevents.accesswidener b/fabric/src/main/resources/packetevents.accesswidener index aba82a9b7..ecb0af57f 100644 --- a/fabric/src/main/resources/packetevents.accesswidener +++ b/fabric/src/main/resources/packetevents.accesswidener @@ -2,9 +2,8 @@ accessWidener v1 named # fields -accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; - +accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; # methods # classes diff --git a/fabric/src/main/resources/packetevents.mixins.json b/fabric/src/main/resources/packetevents.mixins.json index e815929d3..c82991dcc 100644 --- a/fabric/src/main/resources/packetevents.mixins.json +++ b/fabric/src/main/resources/packetevents.mixins.json @@ -3,13 +3,6 @@ "minVersion": "0.8", "package": "io.github.retrooper.packetevents.mixin", "compatibilityLevel": "JAVA_17", - "mixins": [ - "ConnectionMixin", - "PlayerListMixin" - ], - "client": [ - "ClientPacketListenerMixin" - ], "injectors": { "defaultRequire": 1 } diff --git a/settings.gradle.kts b/settings.gradle.kts index 60cf9969b..55f4034c5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,5 +34,7 @@ include("bungeecord") include("velocity") include("sponge") include("fabric") +include(":fabric:mc1201") +include(":fabric:mc1211") // Patch modules include(":patch:adventure-text-serializer-gson") From e202bf0ef5efad0fc79a1f7d4102b224dd3665fe Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 2 Mar 2025 23:11:09 -0500 Subject: [PATCH 05/43] Fix 1.21.X config --- fabric/mc1201/build.gradle.kts | 8 +++++++- fabric/mc1211/build.gradle.kts | 7 +++++++ fabric/mc1211/src/main/resources/fabric.mod.json | 12 ++++++------ .../main/resources/packetevents-mc1211.mixins.json | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts index e795549db..707cd6b47 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1201/build.gradle.kts @@ -38,6 +38,13 @@ tasks { options.release = targetJavaVersion } } + + processResources { + inputs.property("version", project.version) + filesMatching(listOf("fabric.mod.json")) { + expand("version" to project.version) + } + } } loom { @@ -52,7 +59,6 @@ loom { .resolve("${rootProject.name}.accesswidener") } - tasks.compileJava { options.release.set(17) } \ No newline at end of file diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 740e93210..5d4677ddd 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -38,6 +38,13 @@ tasks { options.release = targetJavaVersion } } + + processResources { + inputs.property("version", project.version) + filesMatching(listOf("fabric.mod.json")) { + expand("version" to project.version) + } + } } loom { diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index ff2f30b8a..3c9e2b36f 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "packetevents-mc1201", + "id": "packetevents-mc1211", "version": "${version}", - "name": "PacketEvents for 1.20.1", + "name": "PacketEvents for 1.21.1", "description": "", "authors": [ "retrooper" @@ -12,16 +12,16 @@ "environment": "*", "entrypoints": { "pePreLaunchClient": [ - "io.github.retrooper.packetevents.PacketEventsClientMod" + "io.github.retrooper.packetevents.mc1211.PacketEventsClientMod" ], "pePreLaunchServer": [ - "io.github.retrooper.packetevents.PacketEventsServerMod" + "io.github.retrooper.packetevents.mc1211.PacketEventsServerMod" ], "preLaunch": [ - "io.github.retrooper.packetevents.PacketEventsMod" + "io.github.retrooper.packetevents.mc1211.PacketEventsMod" ], "main": [ - "io.github.retrooper.packetevents.PacketEventsMod" + "io.github.retrooper.packetevents.mc1211.PacketEventsMod" ] }, "mixins": [ diff --git a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json index 7a1b75b2b..bf1d60b78 100644 --- a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json +++ b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json @@ -1,7 +1,7 @@ { "required": true, "minVersion": "0.8", - "package": "io.github.retrooper.packetevents.mc1201.mixin", + "package": "io.github.retrooper.packetevents.mc1211.mixin", "compatibilityLevel": "JAVA_17", "client": [ "ClientPacketListenerMixin" From cc2333145719985be44b04e8d35f375f152727d8 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 3 Mar 2025 01:33:30 -0500 Subject: [PATCH 06/43] Fix 1.20.1 (and untested but < 1.20.5) support --- .../packetevents/handler/PacketDecoder.java | 3 +- .../packetevents/handler/PacketEncoder.java | 93 +++++++++++++++++- .../util/FabricCustomPipelineUtil.java | 95 +++++++++++++++++++ 3 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 4788e6bf4..2bc812704 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -22,6 +22,7 @@ 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; @@ -29,7 +30,7 @@ import java.util.List; -@ApiStatus.Internal +@ApiStatus.Internal @ChannelHandler.Sharable public class PacketDecoder extends MessageToMessageDecoder { private final PacketSide side; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index d0ce3f3ff..f04e5c91b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -24,35 +24,71 @@ import com.github.retrooper.packetevents.exception.CancelPacketException; import com.github.retrooper.packetevents.exception.InvalidDisconnectPacketSend; import com.github.retrooper.packetevents.exception.PacketProcessException; +import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper; import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.protocol.PacketSide; import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.EventCreationUtil; import com.github.retrooper.packetevents.util.ExceptionUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDisconnect; +import io.github.retrooper.packetevents.util.FabricCustomPipelineUtil; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPromise; +import io.netty.util.ReferenceCountUtil; +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import net.minecraft.network.CompressionDecoder; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -@ApiStatus.Internal +@ApiStatus.Internal @ChannelHandler.Sharable public class PacketEncoder extends ChannelOutboundHandlerAdapter { private final PacketSide side; public User user; public Player player; private ChannelPromise promise; + private boolean handledCompression; public PacketEncoder(PacketSide side, User user) { this.side = side; this.user = user; } + public void read(ChannelHandlerContext originalCtx, ByteBuf buffer, ChannelPromise promise) { + ChannelHandlerContext ctx = this.tryFixCompressorOrder(originalCtx, buffer); + int firstReaderIndex = buffer.readerIndex(); + PacketSendEvent packetSendEvent = EventCreationUtil.createSendEvent(ctx.channel(), user, player, + buffer, false); + int readerIndex = buffer.readerIndex(); + PacketEvents.getAPI().getEventManager().callEvent(packetSendEvent, () -> buffer.readerIndex(readerIndex)); + if (!packetSendEvent.isCancelled()) { + if (packetSendEvent.getLastUsedWrapper() != null) { + ByteBufHelper.clear(packetSendEvent.getByteBuf()); + packetSendEvent.getLastUsedWrapper().writeVarInt(packetSendEvent.getPacketId()); + packetSendEvent.getLastUsedWrapper().write(); + } else { + buffer.readerIndex(firstReaderIndex); + } + ctx.write(buffer, promise); + } else { + ReferenceCountUtil.release(packetSendEvent.getByteBuf()); + } + if (packetSendEvent.hasPostTasks()) { + for (Runnable task : packetSendEvent.getPostTasks()) { + task.run(); + } + } + } + @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { if (!(msg instanceof ByteBuf in)) { @@ -72,10 +108,9 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) if (!in.isReadable()) { in.release(); throw CancelPacketException.INSTANCE; + } else { + this.read(ctx, in, promise); } - - // Forward the packet if readable - ctx.write(in, promise); } private @Nullable ProtocolPacketEvent handlePacket(ChannelHandlerContext ctx, ByteBuf buffer, ChannelPromise promise) throws Exception { @@ -155,4 +190,54 @@ private boolean isMinecraftServerInstanceDebugging() { // TODO: Implement Fabric-specific debugging check return false; } + + // TODO this code is shared with bungee, it should really be in cross-platform and not duplicated + private ChannelHandlerContext tryFixCompressorOrder(ChannelHandlerContext ctx, ByteBuf buffer) { + if (this.handledCompression) { + return ctx; + } + ChannelPipeline pipe = ctx.pipeline(); + List pipeNames = pipe.names(); + if (pipeNames.contains("frame-prepender-compress")) { + // "modern" version, no need to handle this here + this.handledCompression = true; + return ctx; + } + int compressorIndex = pipeNames.indexOf("compress"); + if (compressorIndex == -1) { + return ctx; + } + this.handledCompression = true; + if (compressorIndex <= pipeNames.indexOf(PacketEvents.ENCODER_NAME)) { + return ctx; // order already seems to be correct + } + // relocate handlers + ChannelHandler decoder = pipe.remove(PacketEvents.DECODER_NAME); + ChannelHandler encoder = pipe.remove(PacketEvents.ENCODER_NAME); + pipe.addAfter("decompress", PacketEvents.DECODER_NAME, decoder); + pipe.addAfter("compress", PacketEvents.ENCODER_NAME, encoder); + + // manually decompress packet and update context, + // so we don't need to additionally manually re-compress the packet + this.decompress(pipe, buffer); + return pipe.context(PacketEvents.ENCODER_NAME); + } + + private void decompress(ChannelPipeline pipe, ByteBuf buffer) { + ChannelHandler decompressor = pipe.get("decompress"); + ChannelHandlerContext decompressorCtx = pipe.context("decompress"); + + ByteBuf decompressed = null; + try { + decompressed = (ByteBuf) FabricCustomPipelineUtil.callPacketDecodeByteBuf( + decompressor, decompressorCtx, buffer).get(0); + if (buffer != decompressed) { + buffer.clear().writeBytes(decompressed); + } + } catch (InvocationTargetException exception) { + throw new RuntimeException(exception); + } finally { + ReferenceCountUtil.release(decompressed); + } + } } \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java new file mode 100644 index 000000000..c02be4a1f --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java @@ -0,0 +1,95 @@ +package io.github.retrooper.packetevents.util; + +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2022 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.MappingResolver; +import net.minecraft.network.CompressionDecoder; + +public class FabricCustomPipelineUtil { + private static MethodHandle FABRIC_PACKET_DECODE_BYTEBUF; + + static { + try { + // Get the mapping resolver to handle obfuscated names + MappingResolver resolver = FabricLoader.getInstance().getMappingResolver(); + + // Get the runtime (potentially obfuscated) class for CompressionDecoder + Class compressionDecoderClass = CompressionDecoder.class; + + // Map the method name from intermediary to runtime (obfuscated) names + String intermediaryMethodName = "decode"; // Intermediary method name + String intermediaryClassName = compressionDecoderClass.getName(); // Intermediary class name + + // Define the method descriptor in intermediary mappings + // Parameters: ChannelHandlerContext, ByteBuf, List + // Return type: void + String methodDescriptor = "(Lio/netty/channel/ChannelHandlerContext;Lio/netty/buffer/ByteBuf;Ljava/util/List;)V"; + + // Map the method name to the runtime (obfuscated) name + String mappedMethodName = resolver.mapMethodName( + "intermediary", + intermediaryClassName, + intermediaryMethodName, + methodDescriptor + ); + + // Create a MethodHandles.Lookup with private access + MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(compressionDecoderClass, MethodHandles.lookup()); + + // Define the method type for the decode method + MethodType methodType = MethodType.methodType( + void.class, // Return type + ChannelHandlerContext.class, // Parameter 1 + ByteBuf.class, // Parameter 2 + List.class // Parameter 3 + ); + + // Find the MethodHandle for the decode method + FABRIC_PACKET_DECODE_BYTEBUF = lookup.findVirtual( + compressionDecoderClass, + mappedMethodName, + methodType + ); + } catch (IllegalAccessException | NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public static List callPacketDecodeByteBuf(Object decoder, Object ctx, Object msg) throws InvocationTargetException { + List output = new ArrayList<>(1); + try { + FABRIC_PACKET_DECODE_BYTEBUF.invoke(decoder, ctx, msg, output); + } catch (Throwable e) { + e.printStackTrace(); + } + return output; + } +} + + From 62dd0fcef86e484d9d1782d806095995d0c7670a Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:02:23 -0500 Subject: [PATCH 07/43] Optimize MethodHandle setup and usage for FABRIC_PACKET_DECODE_BYTEBUF --- .../packetevents/util/FabricCustomPipelineUtil.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java index c02be4a1f..715084f97 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java @@ -32,7 +32,7 @@ import net.minecraft.network.CompressionDecoder; public class FabricCustomPipelineUtil { - private static MethodHandle FABRIC_PACKET_DECODE_BYTEBUF; + private static final MethodHandle FABRIC_PACKET_DECODE_BYTEBUF; static { try { @@ -77,14 +77,14 @@ public class FabricCustomPipelineUtil { methodType ); } catch (IllegalAccessException | NoSuchMethodException e) { - e.printStackTrace(); + throw new RuntimeException(e); } } - public static List callPacketDecodeByteBuf(Object decoder, Object ctx, Object msg) throws InvocationTargetException { + public static List callPacketDecodeByteBuf(Object decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { List output = new ArrayList<>(1); try { - FABRIC_PACKET_DECODE_BYTEBUF.invoke(decoder, ctx, msg, output); + FABRIC_PACKET_DECODE_BYTEBUF.invokeExact(decoder, ctx, msg, output); } catch (Throwable e) { e.printStackTrace(); } From 7fae545c75b43b4b567d4c033f58276c2b799720 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 9 Mar 2025 01:40:36 -0500 Subject: [PATCH 08/43] Fix adding 1.20.1 support breaking 1.20.5+ encoder support; fix error when calling optimized decode() MethodHandle --- .../retrooper/packetevents/handler/PacketEncoder.java | 11 +++++++++-- .../packetevents/util/FabricCustomPipelineUtil.java | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index f04e5c91b..7baaa0d83 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -24,6 +24,7 @@ import com.github.retrooper.packetevents.exception.CancelPacketException; import com.github.retrooper.packetevents.exception.InvalidDisconnectPacketSend; import com.github.retrooper.packetevents.exception.PacketProcessException; +import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper; import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.protocol.PacketSide; @@ -57,6 +58,8 @@ public class PacketEncoder extends ChannelOutboundHandlerAdapter { public Player player; private ChannelPromise promise; private boolean handledCompression; + private final boolean isPre1_20_5 = PacketEvents.getAPI().getServerManager().getVersion().isOlderThan( + ServerVersion.V_1_20_5); public PacketEncoder(PacketSide side, User user) { this.side = side; @@ -109,7 +112,11 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) in.release(); throw CancelPacketException.INSTANCE; } else { - this.read(ctx, in, promise); + if (isPre1_20_5) { + this.read(ctx, in, promise); + } else { + ctx.write(in, promise); + } } } @@ -224,7 +231,7 @@ private ChannelHandlerContext tryFixCompressorOrder(ChannelHandlerContext ctx, B } private void decompress(ChannelPipeline pipe, ByteBuf buffer) { - ChannelHandler decompressor = pipe.get("decompress"); + CompressionDecoder decompressor = (CompressionDecoder) pipe.get("decompress"); ChannelHandlerContext decompressorCtx = pipe.context("decompress"); ByteBuf decompressed = null; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java index 715084f97..2db5161f6 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java @@ -81,7 +81,7 @@ public class FabricCustomPipelineUtil { } } - public static List callPacketDecodeByteBuf(Object decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { + public static List callPacketDecodeByteBuf(CompressionDecoder decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { List output = new ArrayList<>(1); try { FABRIC_PACKET_DECODE_BYTEBUF.invokeExact(decoder, ctx, msg, output); From 4654d00af52ea1d4664b641c07529fcd9594f367 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 9 Mar 2025 20:54:44 -0400 Subject: [PATCH 09/43] Stash work in fixing via compataiblity --- fabric/build.gradle.kts | 2 + .../mc1201/mixin/ConnectionMixin.java | 4 +- .../mc1211/mixin/ConnectionMixin.java | 52 +++------ .../factory/fabric/FabricPacketEventsAPI.java | 3 +- .../packetevents/handler/PacketDecoder.java | 15 +++ .../packetevents/handler/PacketEncoder.java | 3 +- .../manager/InternalFabricPacketListener.java | 44 +++++++ .../util/FabricInjectionUtil.java | 107 ++++++++++++++++++ .../util/viaversion/ViaVersionAccessor.java | 17 +++ .../viaversion/ViaVersionAccessorImpl.java | 64 +++++++++++ .../util/viaversion/ViaVersionUtil.java | 67 +++++++++++ 11 files changed, 335 insertions(+), 43 deletions(-) create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index e6e454819..28ecd3503 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -5,6 +5,7 @@ plugins { repositories { maven("https://repo.codemc.io/repository/maven-snapshots/") + maven("https://repo.viaversion.com/") maven { name = "ParchmentMC" url = uri("https://maven.parchmentmc.org") @@ -33,6 +34,7 @@ dependencies { }) modImplementation("net.fabricmc:fabric-loader:$loader_version") + compileOnly(libs.via.version) } tasks { diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java index fa15f43d5..76c47a2aa 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java @@ -84,8 +84,8 @@ private static void configureSerialization( return; } - channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); - channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); + channel.pipeline().addBefore("decoder", PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); + channel.pipeline().addBefore("encoder", PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); channel.closeFuture().addListener((ChannelFutureListener) future -> PacketEventsImplHelper.handleDisconnection(user.getChannel(), user.getUUID())); } diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java index cdb1f8bef..deaf11642 100644 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java @@ -29,64 +29,40 @@ import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import io.github.retrooper.packetevents.handler.PacketDecoder; import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.github.retrooper.packetevents.util.FabricCustomPipelineUtil; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import net.minecraft.SharedConstants; import net.minecraft.network.BandwidthDebugMonitor; import net.minecraft.network.protocol.PacketFlow; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(net.minecraft.network.Connection.class) -public class ConnectionMixin { +@Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via +public abstract class ConnectionMixin { - // doesn't account for mods like ViaFabric - @Unique - private static final ClientVersion CLIENT_VERSION = - ClientVersion.getById(SharedConstants.getProtocolVersion()); + @Shadow public abstract void channelActive(ChannelHandlerContext channelHandlerContext) + throws Exception; + + @Shadow public abstract void channelInactive(ChannelHandlerContext channelHandlerContext); + + @Shadow protected abstract void flush(); @Inject( method = "configureSerialization", - at = @At("TAIL") + at = @At("RETURN") ) private static void configureSerialization( ChannelPipeline pipeline, PacketFlow flow, boolean memoryOnly, BandwidthDebugMonitor bandwithDebugMonitor, CallbackInfo ci ) { - PacketSide pipelineSide = switch (flow) { - case CLIENTBOUND -> PacketSide.CLIENT; - case SERVERBOUND -> PacketSide.SERVER; - }; - PacketSide apiSide = PacketEvents.getAPI().getInjector().getPacketSide(); - if (pipelineSide != apiSide) { - // if pipeline side doesn't match api side, don't inject into - // this pipeline - it probably means this is the pipeline from - // integrated server to minecraft client, which is currently unsupported - PacketEvents.getAPI().getLogManager().debug("Skipped pipeline injection on " + pipelineSide); - return; - } - - PacketEvents.getAPI().getLogManager().debug("Game connected!"); - - Channel channel = pipeline.channel(); - User user = new User(channel, ConnectionState.HANDSHAKING, - CLIENT_VERSION, new UserProfile(null, null)); - ProtocolManager.USERS.put(channel.pipeline(), user); - - UserConnectEvent connectEvent = new UserConnectEvent(user); - PacketEvents.getAPI().getEventManager().callEvent(connectEvent); - if (connectEvent.isCancelled()) { - channel.unsafe().closeForcibly(); - return; - } - - channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); - channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); - channel.closeFuture().addListener((ChannelFutureListener) future -> - PacketEventsImplHelper.handleDisconnection(user.getChannel(), user.getUUID())); + FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); } } \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 2c63eb00b..5d59a6611 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -33,6 +33,7 @@ import io.github.retrooper.packetevents.LazyHolder; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import org.slf4j.Logger; @@ -98,7 +99,7 @@ public void load() { // register internal packet listener (should be the first listener) // this listener doesn't do any modifications to the packets, just reads data - this.getEventManager().registerListener(new InternalPacketListener()); + this.getEventManager().registerListener(new InternalFabricPacketListener()); this.loaded = true; } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 2bc812704..0f5732afe 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -21,6 +21,7 @@ import com.github.retrooper.packetevents.protocol.PacketSide; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; @@ -53,4 +54,18 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) out.add(msg.retain()); } } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + boolean kryptonReorder = false; + switch (evt.toString()) { + case "COMPRESSION_THRESHOLD_UPDATED": + case "COMPRESSION_ENABLED": + kryptonReorder = true; + } + if (evt.getClass().getName().equals("com.viaversion.fabric.common.handler.PipelineReorderEvent") || kryptonReorder) { + FabricInjectionUtil.reorderHandlers(ctx); + } + super.userEventTriggered(ctx, evt); + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 7baaa0d83..41262f299 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -108,8 +108,7 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) handlePacket(ctx, in, promise); // Check for empty packets last (matches Spigot) - if (!in.isReadable()) { - in.release(); + if (!ByteBufHelper.isReadable(in)) { throw CancelPacketException.INSTANCE; } else { if (isPre1_20_5) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java new file mode 100644 index 000000000..74a44371d --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java @@ -0,0 +1,44 @@ +package io.github.retrooper.packetevents.manager; + +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.PacketReceiveEvent; +import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.protocol.packettype.PacketType; +import com.github.retrooper.packetevents.protocol.player.ClientVersion; +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.LogManager; +import com.github.retrooper.packetevents.wrapper.handshaking.client.WrapperHandshakingClientHandshake; +import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; + +public class InternalFabricPacketListener extends com.github.retrooper.packetevents.manager.InternalPacketListener { + + @Override + public void onPacketReceive(PacketReceiveEvent event) { + if (event.getPacketType() == PacketType.Handshaking.Client.HANDSHAKE) { + User user = event.getUser(); + WrapperHandshakingClientHandshake packet = new WrapperHandshakingClientHandshake(event); + ClientVersion clientVersion = packet.getClientVersion(); + ConnectionState state = packet.getNextConnectionState(); + + String feature; + if (ViaVersionUtil.isAvailable()) { + clientVersion = ClientVersion.getById(ViaVersionUtil.getProtocolVersion(user)); + feature = "ViaVersion"; + } else { + feature = null; + } + + LogManager logger = PacketEvents.getAPI().getLogManager(); + if (logger.isDebug()) { + logger.debug("Processed handshake for " + event.getAddress() + ": " + + state.name() + " / " + packet.getClientVersion().getReleaseName() + + (feature != null ? " (using " + feature + ")" : "")); + } + + user.setClientVersion(clientVersion); + user.setConnectionState(state); + } else { + super.onPacketReceive(event); + } + } +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java new file mode 100644 index 000000000..e35eb98c6 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -0,0 +1,107 @@ +package io.github.retrooper.packetevents.util; + +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.UserConnectEvent; +import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; +import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.protocol.PacketSide; +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 com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.github.retrooper.packetevents.handler.PacketDecoder; +import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPipeline; +import net.minecraft.SharedConstants; +import net.minecraft.network.protocol.PacketFlow; + +public class FabricInjectionUtil { + private static final String VIA_DECODER_NAME = "via-decoder"; + private static final String VIA_ENCODER_NAME = "via-encoder"; + + private static final ClientVersion CLIENT_VERSION = + ClientVersion.getById(SharedConstants.getProtocolVersion()); + + public static void injectAtPipelineBuilder(ChannelPipeline pipeline, PacketFlow flow) { + PacketSide pipelineSide = switch (flow) { + case CLIENTBOUND -> PacketSide.CLIENT; + case SERVERBOUND -> PacketSide.SERVER; + }; + PacketSide apiSide = PacketEvents.getAPI().getInjector().getPacketSide(); + if (pipelineSide != apiSide) { + // if pipeline side doesn't match api side, don't inject into + // this pipeline - it probably means this is the pipeline from + // integrated server to minecraft client, which is currently unsupported + PacketEvents.getAPI().getLogManager().debug("Skipped pipeline injection on " + pipelineSide); + return; + } + + PacketEvents.getAPI().getLogManager().debug("Game connected!"); + + Channel channel = pipeline.channel(); + User user = new User(channel, ConnectionState.HANDSHAKING, + null, new UserProfile(null, null)); + ProtocolManager.USERS.put(channel.pipeline(), user); + + UserConnectEvent connectEvent = new UserConnectEvent(user); + PacketEvents.getAPI().getEventManager().callEvent(connectEvent); + if (connectEvent.isCancelled()) { + channel.unsafe().closeForcibly(); + return; + } + + String decoderName = channel.pipeline().names().contains("inbound_config") ? "inbound_config" : "decoder"; + channel.pipeline().addBefore(decoderName, PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); + String encoderName = channel.pipeline().names().contains("outbound_config") ? "outbound_config" : "encoder"; + channel.pipeline().addBefore(encoderName, PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); + channel.closeFuture().addListener((ChannelFutureListener) future -> + PacketEventsImplHelper.handleDisconnection(user.getChannel(), user.getUUID())); + } + + // Shared method to remove handlers if they exist + public static void removeIfExists(ChannelPipeline pipeline, String handlerName) { + if (pipeline.get(handlerName) != null) { + pipeline.remove(handlerName); + } + } + + // Shared method to reorder handlers after ViaVersion + public static void reorderHandlers(ChannelHandlerContext ctx) { + ChannelPipeline pipeline = ctx.pipeline(); + + // Re-inject decoder handler + ChannelHandler decoder = pipeline.get(PacketEvents.DECODER_NAME); + removeIfExists(pipeline, PacketEvents.DECODER_NAME); + if (decoder != null) { + if (pipeline.get(VIA_DECODER_NAME) != null) { + // If ViaVersion is present, add our decoder after via-decoder + pipeline.addAfter(VIA_DECODER_NAME, PacketEvents.DECODER_NAME, decoder); + } else { + // If ViaVersion is not present, add our decoder after decompress + String decoderName = pipeline.names().contains("inbound_config") ? "inbound_config" : "decoder"; + pipeline.addBefore(decoderName, PacketEvents.DECODER_NAME, decoder); + } + } + + // Re-inject encoder handler + ChannelHandler encoder = pipeline.get(PacketEvents.ENCODER_NAME); + removeIfExists(pipeline, PacketEvents.ENCODER_NAME); + if (encoder != null) { + if (pipeline.get(VIA_ENCODER_NAME) != null) { + // If ViaVersion is present, add our encoder after via-encoder + pipeline.addAfter(VIA_ENCODER_NAME, PacketEvents.ENCODER_NAME, encoder); + } else { + // If ViaVersion is not present, add our encoder after compress + String encoderName = pipeline.names().contains("outbound_config") ? "outbound_config" : "encoder"; + pipeline.addBefore(encoderName, PacketEvents.ENCODER_NAME, encoder); + } + } + + // Log the pipeline for debugging + PacketEvents.getAPI().getLogManager().debug("Pipeline after reorder: " + pipeline.names()); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java new file mode 100644 index 000000000..86ed29e4f --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java @@ -0,0 +1,17 @@ +package io.github.retrooper.packetevents.util.viaversion; + +import com.github.retrooper.packetevents.protocol.player.User; +import net.minecraft.server.level.ServerPlayer; + +public interface ViaVersionAccessor { + + int getProtocolVersion(ServerPlayer player); + + int getProtocolVersion(User user); + + Class getUserConnectionClass(); + + Class getSpongeDecodeHandlerClass(); + + Class getSpongeEncodeHandlerClass(); +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java new file mode 100644 index 000000000..15c397aef --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java @@ -0,0 +1,64 @@ +package io.github.retrooper.packetevents.util.viaversion; + +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.util.reflection.Reflection; +import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.connection.UserConnection; +import io.netty.channel.Channel; + +import java.lang.reflect.Field; +import net.minecraft.server.level.ServerPlayer; + +public class ViaVersionAccessorImpl implements ViaVersionAccessor { + + private static final Class ENCODE_HANDLER; + private static final Class DECODE_HANDLER; + + static { + try { + ENCODE_HANDLER = Class.forName("com.viaversion.fabric.common.handler.FabricEncodeHandler"); + DECODE_HANDLER = Class.forName("com.viaversion.fabric.common.handler.FabricDecodeHandler"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private static Field CONNECTION_FIELD; + + @Override + public int getProtocolVersion(ServerPlayer player) { + return Via.getAPI().getPlayerVersion(player); + } + + @Override + public int getProtocolVersion(User user) { + try { + Object viaEncoder = ((Channel) user.getChannel()).pipeline().get("via-encoder"); + if (CONNECTION_FIELD == null) { + CONNECTION_FIELD = Reflection.getField(viaEncoder.getClass(), "info"); + } + UserConnection connection = (UserConnection) CONNECTION_FIELD.get(viaEncoder); + return connection.getProtocolInfo().getProtocolVersion(); + } + catch (IllegalAccessException e) { + PacketEvents.getAPI().getLogManager().warn("Unable to grab ViaVersion client version for player!"); + return -1; + } + } + + @Override + public Class getUserConnectionClass() { + return UserConnection.class; + } + + @Override + public Class getSpongeDecodeHandlerClass() { + return DECODE_HANDLER; + } + + @Override + public Class getSpongeEncodeHandlerClass() { + return ENCODE_HANDLER; + } +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java new file mode 100644 index 000000000..045b77f83 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java @@ -0,0 +1,67 @@ +package io.github.retrooper.packetevents.util.viaversion; + +import com.github.retrooper.packetevents.protocol.player.User; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.server.level.ServerPlayer; + +public class ViaVersionUtil { + private static ViaState available = ViaState.UNKNOWN; + private static ViaVersionAccessor viaVersionAccessor; + + private ViaVersionUtil() { + } + + private static void load() { + if (viaVersionAccessor == null) { + try { + Class.forName("com.viaversion.viaversion.api.Via"); + viaVersionAccessor = new ViaVersionAccessorImpl(); + } catch (Exception e) { + viaVersionAccessor = null; + } + } + } + + public static void checkIfViaIsPresent() { + boolean present = FabricLoader.getInstance().getModContainer("viaversion").isPresent(); + available = present ? ViaState.ENABLED : ViaState.DISABLED; + } + + public static boolean isAvailable() { + if (available == ViaState.UNKNOWN) { // Plugins haven't loaded... let's refer to whether we have a class + return getViaVersionAccessor() != null; + } + return available == ViaState.ENABLED; + } + + public static ViaVersionAccessor getViaVersionAccessor() { + load(); + return viaVersionAccessor; + } + + public static int getProtocolVersion(User user) { + return getViaVersionAccessor().getProtocolVersion(user); + } + + public static int getProtocolVersion(ServerPlayer player) { + return getViaVersionAccessor().getProtocolVersion(player); + } + + public static Class getUserConnectionClass() { + return getViaVersionAccessor().getUserConnectionClass(); + } + + public static Class getSpongeDecodeHandlerClass() { + return getViaVersionAccessor().getSpongeDecodeHandlerClass(); + } + + public static Class getSpongeEncodeHandlerClass() { + return getViaVersionAccessor().getSpongeEncodeHandlerClass(); + } +} + +enum ViaState { + UNKNOWN, + DISABLED, + ENABLED +} \ No newline at end of file From fb55263ec73b37ba5a8bd0f4b802adcefc72141e Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 10 Mar 2025 02:24:22 -0400 Subject: [PATCH 10/43] Access widener errors? --- fabric/build.gradle.kts | 11 +++++++++++ .../src/main/resources/packetevents.accesswidener | 2 +- .../src/main/resources/packetevents.accesswidener | 2 +- fabric/src/main/resources/packetevents.accesswidener | 3 +-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 28ecd3503..b290c9e85 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -37,6 +37,17 @@ dependencies { compileOnly(libs.via.version) } +subprojects { + afterEvaluate { + tasks.processResources { + inputs.property("version", project.version) + filesMatching("fabric.mod.json") { + expand("version" to project.version) + } + } + } +} + tasks { withType { val targetJavaVersion = 17 diff --git a/fabric/mc1201/src/main/resources/packetevents.accesswidener b/fabric/mc1201/src/main/resources/packetevents.accesswidener index eae3f36df..aa0919ba0 100644 --- a/fabric/mc1201/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1201/src/main/resources/packetevents.accesswidener @@ -1,4 +1,4 @@ -accessWidener v1 named +accessWidener v2 named # fields diff --git a/fabric/mc1211/src/main/resources/packetevents.accesswidener b/fabric/mc1211/src/main/resources/packetevents.accesswidener index 50f0fb6f9..196849005 100644 --- a/fabric/mc1211/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1211/src/main/resources/packetevents.accesswidener @@ -1,4 +1,4 @@ -accessWidener v1 named +accessWidener v2 named # fields diff --git a/fabric/src/main/resources/packetevents.accesswidener b/fabric/src/main/resources/packetevents.accesswidener index ecb0af57f..a239a3f09 100644 --- a/fabric/src/main/resources/packetevents.accesswidener +++ b/fabric/src/main/resources/packetevents.accesswidener @@ -1,5 +1,4 @@ -accessWidener v1 named - +accessWidener v2 named # fields accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; From 04be038382a0cf7892e76689df7ddda76bfeab2b Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 10 Mar 2025 03:18:59 -0400 Subject: [PATCH 11/43] Fix subproject mappings with access wideners Thanks @Bawnorton --- fabric/mc1201/build.gradle.kts | 2 +- fabric/mc1211/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts index 707cd6b47..d24351dd0 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1201/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { implementation(libs.bundles.adventure) implementation(project(":api")) implementation(project(":netty-common")) - implementation(project(":fabric")) + implementation(project(":fabric", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 5d4677ddd..223b6765b 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -19,7 +19,7 @@ dependencies { compileOnly(libs.bundles.adventure) compileOnly(project(":api")) compileOnly(project(":netty-common")) - compileOnly(project(":fabric")) + compileOnly(project(":fabric", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") From 6982d8ca413221524ff3317f1d2fbdedeea6de25 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 10 Mar 2025 06:55:46 -0400 Subject: [PATCH 12/43] Minor buildscript changes --- fabric/mc1201/build.gradle.kts | 9 +-------- fabric/mc1211/build.gradle.kts | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts index d24351dd0..00e70919b 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1201/build.gradle.kts @@ -38,19 +38,12 @@ tasks { options.release = targetJavaVersion } } - - processResources { - inputs.property("version", project.version) - filesMatching(listOf("fabric.mod.json")) { - expand("version" to project.version) - } - } } loom { splitEnvironmentSourceSets() mods { - register("packetevents") { + register("packetevents-mc1201") { sourceSet(sourceSets.main.get()) sourceSet(sourceSets.maybeCreate("client")) } diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 223b6765b..53a276f8f 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -38,19 +38,12 @@ tasks { options.release = targetJavaVersion } } - - processResources { - inputs.property("version", project.version) - filesMatching(listOf("fabric.mod.json")) { - expand("version" to project.version) - } - } } loom { splitEnvironmentSourceSets() mods { - register("packetevents") { + register("packetevents-mc1211") { sourceSet(sourceSets.main.get()) sourceSet(sourceSets.maybeCreate("client")) } From dfdb4102dba83d8589696d9d64df222ee038fefa Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 11 Mar 2025 00:16:03 -0400 Subject: [PATCH 13/43] Fix Via support; consolidate module code ViaFabric support tested on 1.21.4 server. 1.20.2+ clients work. ViaFabric breaks with 1.20.1 clients on 1.21.4 servers, with the connection timing out. This is a Via issue and occurs without PacketEvents or GrimAC present. --- .../mc1201/mixin/ConnectionMixin.java | 40 +------------------ .../packetevents/handler/PacketDecoder.java | 3 +- .../packetevents/handler/PacketEncoder.java | 2 +- .../util/FabricInjectionUtil.java | 1 - 4 files changed, 5 insertions(+), 41 deletions(-) diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java index 76c47a2aa..13c45fde6 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java @@ -29,13 +29,13 @@ import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import io.github.retrooper.packetevents.handler.PacketDecoder; import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelPipeline; import net.minecraft.SharedConstants; import net.minecraft.network.protocol.PacketFlow; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -44,12 +44,6 @@ @Mixin(net.minecraft.network.Connection.class) public class ConnectionMixin { - @Shadow public Channel channel; - // doesn't account for mods like ViaFabric - @Unique - private static final ClientVersion CLIENT_VERSION = - ClientVersion.getById(SharedConstants.getProtocolVersion()); - @Inject( method = "configureSerialization", at = @At("TAIL") @@ -57,36 +51,6 @@ public class ConnectionMixin { private static void configureSerialization( ChannelPipeline pipeline, PacketFlow flow, CallbackInfo ci ) { - PacketSide pipelineSide = switch (flow) { - case CLIENTBOUND -> PacketSide.CLIENT; - case SERVERBOUND -> PacketSide.SERVER; - }; - PacketSide apiSide = PacketEvents.getAPI().getInjector().getPacketSide(); - if (pipelineSide != apiSide) { - // if pipeline side doesn't match api side, don't inject into - // this pipeline - it probably means this is the pipeline from - // integrated server to minecraft client, which is currently unsupported - PacketEvents.getAPI().getLogManager().debug("Skipped pipeline injection on " + pipelineSide); - return; - } - - PacketEvents.getAPI().getLogManager().debug("Game connected!"); - - Channel channel = pipeline.channel(); - User user = new User(channel, ConnectionState.HANDSHAKING, - CLIENT_VERSION, new UserProfile(null, null)); - PacketEvents.getAPI().getProtocolManager().setUser(channel.pipeline(), user); - - UserConnectEvent connectEvent = new UserConnectEvent(user); - PacketEvents.getAPI().getEventManager().callEvent(connectEvent); - if (connectEvent.isCancelled()) { - channel.unsafe().closeForcibly(); - return; - } - - channel.pipeline().addBefore("decoder", PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); - channel.pipeline().addBefore("encoder", PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); - channel.closeFuture().addListener((ChannelFutureListener) future -> - PacketEventsImplHelper.handleDisconnection(user.getChannel(), user.getUUID())); + FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 0f5732afe..30842fc2c 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -26,6 +26,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; +import java.util.Arrays; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.ApiStatus; @@ -49,7 +50,7 @@ protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) return; } PacketEventsImplHelper.handlePacket(ctx.channel(), this.user, this.player, - msg, false, this.side); + msg, true, this.side); if (msg.isReadable()) { out.add(msg.retain()); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 41262f299..3a9de293d 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -122,7 +122,7 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) private @Nullable ProtocolPacketEvent handlePacket(ChannelHandlerContext ctx, ByteBuf buffer, ChannelPromise promise) throws Exception { // Process the packet using PacketEventsImplHelper (similar to Spigot) ProtocolPacketEvent protocolPacketEvent = PacketEventsImplHelper.handlePacket( - ctx.channel(), this.user, this.player, buffer, false, this.side + ctx.channel(), this.user, this.player, buffer, true, this.side ); // Execute post-send tasks (required for cross-platform support) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index e35eb98c6..38a9538d7 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -101,7 +101,6 @@ public static void reorderHandlers(ChannelHandlerContext ctx) { } } - // Log the pipeline for debugging PacketEvents.getAPI().getLogManager().debug("Pipeline after reorder: " + pipeline.names()); } } From 9bfc1d9afbd7662f0bade60d0e1e20e8d35efe5c Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 11 Mar 2025 02:00:32 -0400 Subject: [PATCH 14/43] Fix Fabric 1.20.1 support --- .../io/github/retrooper/packetevents/handler/PacketEncoder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 3a9de293d..9b84add91 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -70,7 +70,7 @@ public void read(ChannelHandlerContext originalCtx, ByteBuf buffer, ChannelPromi ChannelHandlerContext ctx = this.tryFixCompressorOrder(originalCtx, buffer); int firstReaderIndex = buffer.readerIndex(); PacketSendEvent packetSendEvent = EventCreationUtil.createSendEvent(ctx.channel(), user, player, - buffer, false); + buffer, true); int readerIndex = buffer.readerIndex(); PacketEvents.getAPI().getEventManager().callEvent(packetSendEvent, () -> buffer.readerIndex(readerIndex)); if (!packetSendEvent.isCancelled()) { From a1acbc6167d5dbaf913b39c215f7d8f3d28abd15 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:09:46 -0400 Subject: [PATCH 15/43] Quick and dirty hack to handle custom registered Items with cooldowns on Fabric --- .../packetevents/PacketEventsAPI.java | 18 +++++ .../manager/registry/ItemRegistry.java | 8 +++ .../manager/registry/RegistryManager.java | 5 ++ .../packetevents/FabricItemType.java | 65 +++++++++++++++++++ .../factory/fabric/FabricPacketEventsAPI.java | 8 +++ .../manager/registry/FabricItemRegistry.java | 18 +++++ .../registry/FabricRegistryManager.java | 13 ++++ 7 files changed, 135 insertions(+) create mode 100644 api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java create mode 100644 api/src/main/java/com/github/retrooper/packetevents/manager/registry/RegistryManager.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java diff --git a/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java b/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java index 7a8229f40..25358ade9 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java +++ b/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java @@ -22,8 +22,11 @@ import com.github.retrooper.packetevents.injector.ChannelInjector; import com.github.retrooper.packetevents.manager.player.PlayerManager; import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; +import com.github.retrooper.packetevents.manager.registry.ItemRegistry; +import com.github.retrooper.packetevents.manager.registry.RegistryManager; import com.github.retrooper.packetevents.manager.server.ServerManager; import com.github.retrooper.packetevents.netty.NettyManager; +import com.github.retrooper.packetevents.protocol.item.type.ItemType; import com.github.retrooper.packetevents.settings.PacketEventsSettings; import com.github.retrooper.packetevents.util.LogManager; import com.github.retrooper.packetevents.util.PEVersion; @@ -32,6 +35,7 @@ import com.github.retrooper.packetevents.util.updatechecker.UpdateChecker; import java.util.logging.Logger; +import org.jetbrains.annotations.Nullable; public abstract class PacketEventsAPI { private final EventManager eventManager = new EventManager(); @@ -88,4 +92,18 @@ public LogManager getLogManager() { public abstract NettyManager getNettyManager(); public abstract ChannelInjector getInjector(); + + public RegistryManager getRegistryManager() { + return new RegistryManager() { + @Override + public ItemRegistry getItemRegistry() { + return new ItemRegistry() { + @Override + public @Nullable ItemType getByName(String name) { + return null; + } + }; + } + }; + } } diff --git a/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java b/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java new file mode 100644 index 000000000..48dab1eed --- /dev/null +++ b/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java @@ -0,0 +1,8 @@ +package com.github.retrooper.packetevents.manager.registry; + +import com.github.retrooper.packetevents.protocol.item.type.ItemType; +import org.jetbrains.annotations.Nullable; + +public interface ItemRegistry { + @Nullable ItemType getByName(String name); +} diff --git a/api/src/main/java/com/github/retrooper/packetevents/manager/registry/RegistryManager.java b/api/src/main/java/com/github/retrooper/packetevents/manager/registry/RegistryManager.java new file mode 100644 index 000000000..fff24bf00 --- /dev/null +++ b/api/src/main/java/com/github/retrooper/packetevents/manager/registry/RegistryManager.java @@ -0,0 +1,5 @@ +package com.github.retrooper.packetevents.manager.registry; + +public interface RegistryManager { + ItemRegistry getItemRegistry(); +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java b/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java new file mode 100644 index 000000000..35dd471d4 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java @@ -0,0 +1,65 @@ +package io.github.retrooper.packetevents; + +import com.github.retrooper.packetevents.protocol.item.type.ItemType; +import com.github.retrooper.packetevents.protocol.item.type.ItemTypes; +import com.github.retrooper.packetevents.protocol.player.ClientVersion; +import com.github.retrooper.packetevents.protocol.world.states.type.StateType; +import com.github.retrooper.packetevents.resources.ResourceLocation; +import java.util.Set; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import org.jetbrains.annotations.Nullable; + +public class FabricItemType implements ItemType { + + private final Item item; + + public FabricItemType(Item item) { + this.item = item; + } + + @Override + public int getMaxAmount() { + return item.getMaxStackSize(); + } + + @Override + public int getMaxDurability() { + return item.getMaxDamage(); + } + + @Override + public ItemType getCraftRemainder() { + return new FabricItemType(item.getCraftingRemainingItem()); + } + + @Override + public @Nullable StateType getPlacedType() { + throw new UnsupportedOperationException(); + } + + @Override + public Set getAttributes() { + throw new UnsupportedOperationException(); + } + + @Override + public ResourceLocation getName() { + net.minecraft.resources.ResourceLocation resourceLocation = BuiltInRegistries.ITEM.getKey(item); + return new ResourceLocation(resourceLocation.getNamespace(), resourceLocation.getPath()); + } + + @Override + public int getId(ClientVersion version) { + return BuiltInRegistries.ITEM.getId(item); + } + + @Override + public boolean equals(Object o) { + if (o instanceof FabricItemType) { + FabricItemType fabricItemType = (FabricItemType) o; + return this.item == fabricItemType.item; + } + return false; + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 5d59a6611..b0d5dedc8 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -24,6 +24,7 @@ import com.github.retrooper.packetevents.manager.InternalPacketListener; import com.github.retrooper.packetevents.manager.player.PlayerManager; import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; +import com.github.retrooper.packetevents.manager.registry.RegistryManager; import com.github.retrooper.packetevents.manager.server.ServerManager; import com.github.retrooper.packetevents.netty.NettyManager; import com.github.retrooper.packetevents.protocol.packettype.PacketType; @@ -34,6 +35,7 @@ import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; +import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import org.slf4j.Logger; @@ -58,6 +60,7 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private final ChannelInjector injector; private final NettyManager nettyManager = new NettyManagerImpl(); private final LogManager logManager = new FabricLogger(LOGGER); + private final RegistryManager registryManager = new FabricRegistryManager(); private boolean loaded; private boolean initialized; @@ -185,4 +188,9 @@ public PacketEventsSettings getSettings() { public NettyManager getNettyManager() { return this.nettyManager; } + + @Override + public RegistryManager getRegistryManager() { + return this.registryManager; + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java new file mode 100644 index 000000000..2820e3a79 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java @@ -0,0 +1,18 @@ +package io.github.retrooper.packetevents.manager.registry; + +import com.github.retrooper.packetevents.manager.registry.ItemRegistry; +import com.github.retrooper.packetevents.protocol.item.type.ItemType; +import io.github.retrooper.packetevents.FabricItemType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import org.jetbrains.annotations.Nullable; + +public class FabricItemRegistry implements ItemRegistry { + + @Override + public @Nullable ItemType getByName(String name) { + Item item = BuiltInRegistries.ITEM.get(ResourceLocation.of(name, ':')); + return new FabricItemType(item); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java new file mode 100644 index 000000000..5dba7062c --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java @@ -0,0 +1,13 @@ +package io.github.retrooper.packetevents.manager.registry; + +import com.github.retrooper.packetevents.manager.registry.RegistryManager; + +public class FabricRegistryManager implements RegistryManager { + + private final FabricItemRegistry fabricItemRegistry = new FabricItemRegistry(); + + @Override + public FabricItemRegistry getItemRegistry() { + return fabricItemRegistry; + } +} From 35ea4abaf3caa5dc5306b29e1d3405eb8668cf03 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:10:08 -0400 Subject: [PATCH 16/43] Refactor fabric classes --- .../packetevents/factory/fabric/FabricPacketEventsAPI.java | 4 +++- .../{factory/fabric => manager}/FabricLogger.java | 2 +- .../{factory/fabric => manager}/FabricProtocolManager.java | 2 +- .../{factory/fabric => manager}/FabricServerManager.java | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) rename fabric/src/main/java/io/github/retrooper/packetevents/{factory/fabric => manager}/FabricLogger.java (97%) rename fabric/src/main/java/io/github/retrooper/packetevents/{factory/fabric => manager}/FabricProtocolManager.java (98%) rename fabric/src/main/java/io/github/retrooper/packetevents/{factory/fabric => manager}/FabricServerManager.java (97%) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index b0d5dedc8..3962f5026 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -21,7 +21,6 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.injector.ChannelInjector; -import com.github.retrooper.packetevents.manager.InternalPacketListener; import com.github.retrooper.packetevents.manager.player.PlayerManager; import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; import com.github.retrooper.packetevents.manager.registry.RegistryManager; @@ -34,6 +33,9 @@ import io.github.retrooper.packetevents.LazyHolder; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.manager.FabricLogger; +import io.github.retrooper.packetevents.manager.FabricProtocolManager; +import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import net.fabricmc.api.EnvType; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java similarity index 97% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricLogger.java rename to fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java index 6c6bdaff2..29332298a 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.factory.fabric; +package io.github.retrooper.packetevents.manager; import com.github.retrooper.packetevents.util.LogManager; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricProtocolManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java similarity index 98% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricProtocolManager.java rename to fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java index 299d415bc..0864ec481 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricProtocolManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.factory.fabric; +package io.github.retrooper.packetevents.manager; import com.github.retrooper.packetevents.netty.channel.ChannelHelper; import com.github.retrooper.packetevents.protocol.ProtocolVersion; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricServerManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java similarity index 97% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricServerManager.java rename to fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java index 580c93931..21c2d462c 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricServerManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.factory.fabric; +package io.github.retrooper.packetevents.manager; import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.protocol.player.ClientVersion; From 5ae331ce250b8d8dc0be4c0e7fd3d3afc40cdce2 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Wed, 12 Mar 2025 01:34:51 -0400 Subject: [PATCH 17/43] Implement using Hackfix for getting custom ItemTypes by getByName() on Fabric --- .../packetevents/protocol/item/type/ItemTypes.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java b/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java index 568c42daa..065c64aea 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java +++ b/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java @@ -18,6 +18,7 @@ package com.github.retrooper.packetevents.protocol.item.type; +import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper; import com.github.retrooper.packetevents.netty.buffer.UnpooledByteBufAllocationHelper; import com.github.retrooper.packetevents.protocol.component.ComponentType; @@ -1638,7 +1639,11 @@ public static ItemType define(int maxAmount, String key, ItemType craftRemainder } public static @Nullable ItemType getByName(String name) { - return REGISTRY.getByName(name); + ItemType itemType = REGISTRY.getByName(name); + if (itemType == null) { + return PacketEvents.getAPI().getRegistryManager().getItemRegistry().getByName(name); + } + return itemType; } public static @Nullable ItemType getById(ClientVersion version, int id) { From c5f2bcdb4e31d93e0a9bd2214026a7698acf39c3 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Thu, 13 Mar 2025 00:08:28 -0400 Subject: [PATCH 18/43] Temporary hack to work with custom item registrie entries; refactor multi-version support to be smaller and use chain loading --- fabric/build.gradle.kts | 2 + .../Fabric1201ClientChainLoadEntrypoint.java | 14 ++ .../mc1201/PacketEventsClientMod.java | 33 ----- .../mc1201/Fabric1201ChainLoadEntrypoint.java | 23 ++++ .../packetevents/mc1201/PacketEventsMod.java | 32 ----- .../mc1201/PacketEventsServerMod.java | 32 ----- .../mc1201/mixin/ConnectionMixin.java | 2 +- .../mc1201/mixin/PlayerListMixin.java | 25 ++-- .../mc1201/src/main/resources/fabric.mod.json | 14 +- .../Fabric1211ClientChainLoadEntrypoint.java | 13 ++ .../mc1211/PacketEventsClientMod.java | 33 ----- .../mc1211/Fabric1211ChainLoadEntrypoint.java | 23 ++++ .../packetevents/mc1211/PacketEventsMod.java | 32 ----- .../mc1211/PacketEventsServerMod.java | 32 ----- .../mc1211/mixin/PlayerListMixin.java | 18 +-- .../mc1211/src/main/resources/fabric.mod.json | 14 +- fabric/mc1214/build.gradle.kts | 59 ++++++++ fabric/mc1214/gradle.properties | 10 ++ .../mc1214/Fabric1214ChainLoadEntrypoint.java | 23 ++++ .../registry/Fabric1214ItemRegistry.java | 18 +++ .../mc1214/src/main/resources/fabric.mod.json | 26 ++++ .../resources/packetevents-mc1214.mixins.json | 15 ++ .../main/resources/packetevents.accesswidener | 1 + .../packetevents/PacketEventsMod.java | 130 ++++++++++++++++-- .../factory/fabric/FabricPacketEventsAPI.java | 13 +- .../FabricPacketEventsAPIManagerFactory.java | 25 ++++ .../packetevents/loader/ChainLoadData.java | 31 +++++ .../loader/ChainLoadEntryPoint.java | 8 ++ .../manager/registry/FabricItemRegistry.java | 2 +- .../registry/FabricRegistryManager.java | 11 +- .../util/FabricInjectionUtil.java | 24 ++++ .../packetevents/{ => util}/LazyHolder.java | 2 +- settings.gradle.kts | 1 + 33 files changed, 465 insertions(+), 276 deletions(-) create mode 100644 fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java delete mode 100644 fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java create mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java delete mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java delete mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java create mode 100644 fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java delete mode 100644 fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java create mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java delete mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java delete mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java create mode 100644 fabric/mc1214/build.gradle.kts create mode 100644 fabric/mc1214/gradle.properties create mode 100644 fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java create mode 100644 fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java create mode 100644 fabric/mc1214/src/main/resources/fabric.mod.json create mode 100644 fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json create mode 100644 fabric/mc1214/src/main/resources/packetevents.accesswidener create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java rename fabric/src/main/java/io/github/retrooper/packetevents/{ => util}/LazyHolder.java (96%) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index b290c9e85..fbd7e6267 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -6,6 +6,7 @@ plugins { repositories { maven("https://repo.codemc.io/repository/maven-snapshots/") maven("https://repo.viaversion.com/") + maven("https://jitpack.io") // Conditional Mixin maven { name = "ParchmentMC" url = uri("https://maven.parchmentmc.org") @@ -34,6 +35,7 @@ dependencies { }) modImplementation("net.fabricmc:fabric-loader:$loader_version") + modImplementation("com.github.Fallen-Breath.conditional-mixin:conditional-mixin-fabric:0.6.4") compileOnly(libs.via.version) } diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java new file mode 100644 index 000000000..270c0495f --- /dev/null +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java @@ -0,0 +1,14 @@ +package io.github.retrooper.packetevents.mc1201; + +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ClientPlayerManager; + +public class Fabric1201ClientChainLoadEntrypoint extends Fabric1201ChainLoadEntrypoint { + + @Override + public void initialize(ChainLoadData chainLoadData) { + super.playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1201ClientPlayerManager::new); + super.initialize(chainLoadData); + } +} diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java deleted file mode 100644 index 97b0bff39..000000000 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/PacketEventsClientMod.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1201; - - -import io.github.retrooper.packetevents.LazyHolder; -import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ClientPlayerManager; - -public class PacketEventsClientMod extends io.github.retrooper.packetevents.PacketEventsClientMod { - - @Override - public void onPreLaunch() { - FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1201ClientPlayerManager::new); - super.preLaunch(); - } -} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java new file mode 100644 index 000000000..7628f8698 --- /dev/null +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java @@ -0,0 +1,23 @@ +package io.github.retrooper.packetevents.mc1201; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; +import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; + +public class Fabric1201ChainLoadEntrypoint implements ChainLoadEntryPoint { + + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1201ServerPlayerManager::new); + + @Override + public void initialize(ChainLoadData chainLoadData) { + chainLoadData.setPlayerManagerIfNull(playerManagerAbstractLazyHolder); + } + + @Override + public ServerVersion getNativeVersion() { + return ServerVersion.V_1_20_1; + } +} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java deleted file mode 100644 index 9ab148ea3..000000000 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsMod.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1201; - -public class PacketEventsMod extends io.github.retrooper.packetevents.PacketEventsMod { - - @Override - public void onPreLaunch() { - super.preLaunch(); - } - - @Override - public void onInitialize() { - super.initialize(); - } -} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java deleted file mode 100644 index 6075422b4..000000000 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/PacketEventsServerMod.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1201; - -import io.github.retrooper.packetevents.LazyHolder; -import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; - -public class PacketEventsServerMod extends io.github.retrooper.packetevents.PacketEventsServerMod { - - @Override - public void onPreLaunch() { - FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1201ServerPlayerManager::new); - super.preLaunch(); - } -} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java index 13c45fde6..0c3b5d29e 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java @@ -41,7 +41,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(net.minecraft.network.Connection.class) +@Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via public class ConnectionMixin { @Inject( diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java index 2dfb46404..62eac60a2 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java @@ -23,19 +23,25 @@ import com.github.retrooper.packetevents.event.UserLoginEvent; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.FakeChannelUtil; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.Channel; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PlayerList.class) -public class PlayerListMixin { +public abstract class PlayerListMixin { + + @Shadow public abstract void sendAllPlayerInfo(ServerPlayer player); + + @Shadow public abstract void placeNewPlayer(Connection netManager, ServerPlayer player); /** * @reason Associate connection instance with player instance @@ -66,22 +72,7 @@ private void onPlayerLogin( Connection connection, ServerPlayer player, CallbackInfo ci ) { - PacketEventsAPI api = PacketEvents.getAPI(); - - User user = api.getPlayerManager().getUser(player); - if (user == null) { - Object channelObj = api.getPlayerManager().getChannel(player); - - // Check if it's a fake connection - if (!FakeChannelUtil.isFakeChannel(channelObj) && - (!api.isTerminated() || api.getSettings().isKickIfTerminated())) { - // Kick the player if they're not a fake player - player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); - } - return; - } - - api.getEventManager().callEvent(new UserLoginEvent(user, player)); + FabricInjectionUtil.fireUserLoginEvent(player); } /** diff --git a/fabric/mc1201/src/main/resources/fabric.mod.json b/fabric/mc1201/src/main/resources/fabric.mod.json index ab904685c..f3d6e643d 100644 --- a/fabric/mc1201/src/main/resources/fabric.mod.json +++ b/fabric/mc1201/src/main/resources/fabric.mod.json @@ -11,17 +11,11 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "pePreLaunchClient": [ - "io.github.retrooper.packetevents.mc1201.PacketEventsClientMod" + "mainChainLoad": [ + "io.github.retrooper.packetevents.mc1201.Fabric1201ChainLoadEntrypoint" ], - "pePreLaunchServer": [ - "io.github.retrooper.packetevents.mc1201.PacketEventsServerMod" - ], - "preLaunch": [ - "io.github.retrooper.packetevents.mc1201.PacketEventsMod" - ], - "main": [ - "io.github.retrooper.packetevents.mc1201.PacketEventsMod" + "clientChainLoad": [ + "io.github.retrooper.packetevents.mc1201.Fabric1201ClientChainLoadEntrypoint" ] }, "mixins": [ diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java new file mode 100644 index 000000000..c7f445292 --- /dev/null +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java @@ -0,0 +1,13 @@ +package io.github.retrooper.packetevents.mc1211; + +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ClientPlayerManager; + +public class Fabric1211ClientChainLoadEntrypoint extends Fabric1211ChainLoadEntrypoint { + @Override + public void initialize(ChainLoadData chainLoadData) { + super.playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1211ClientPlayerManager::new); + super.initialize(chainLoadData); + } +} diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java deleted file mode 100644 index c31dc1326..000000000 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/PacketEventsClientMod.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1211; - - -import io.github.retrooper.packetevents.LazyHolder; -import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ClientPlayerManager; - -public class PacketEventsClientMod extends io.github.retrooper.packetevents.PacketEventsClientMod { - - @Override - public void onPreLaunch() { - FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1211ClientPlayerManager::new); - super.preLaunch(); - } -} diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java new file mode 100644 index 000000000..253d1e2c8 --- /dev/null +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java @@ -0,0 +1,23 @@ +package io.github.retrooper.packetevents.mc1211; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; +import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ServerPlayerManager; + +public class Fabric1211ChainLoadEntrypoint implements ChainLoadEntryPoint { + + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1211ServerPlayerManager::new); + + @Override + public void initialize(ChainLoadData chainLoadData) { + chainLoadData.setPlayerManagerIfNull(playerManagerAbstractLazyHolder); + } + + @Override + public ServerVersion getNativeVersion() { + return ServerVersion.V_1_21_1; + } +} diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java deleted file mode 100644 index bb482b89b..000000000 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsMod.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1211; - -public class PacketEventsMod extends io.github.retrooper.packetevents.PacketEventsMod { - - @Override - public void onPreLaunch() { - super.preLaunch(); - } - - @Override - public void onInitialize() { - super.initialize(); - } -} diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java deleted file mode 100644 index 074810dd9..000000000 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/PacketEventsServerMod.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1211; - -import io.github.retrooper.packetevents.LazyHolder; -import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ServerPlayerManager; - -public class PacketEventsServerMod extends io.github.retrooper.packetevents.PacketEventsServerMod { - - @Override - public void onPreLaunch() { - FabricPacketEventsAPI.staticLazyPlayerManagerHolder = LazyHolder.simple(Fabric1211ServerPlayerManager::new); - super.preLaunch(); - } -} diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java index f557a4bbf..4b80d6a88 100644 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java @@ -23,6 +23,7 @@ import com.github.retrooper.packetevents.event.UserLoginEvent; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.FakeChannelUtil; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.Channel; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; @@ -67,22 +68,7 @@ private void onPlayerLogin( Connection connection, ServerPlayer player, CommonListenerCookie cookie, CallbackInfo ci ) { - PacketEventsAPI api = PacketEvents.getAPI(); - - User user = api.getPlayerManager().getUser(player); - if (user == null) { - Object channelObj = api.getPlayerManager().getChannel(player); - - // Check if it's a fake connection - if (!FakeChannelUtil.isFakeChannel(channelObj) && - (!api.isTerminated() || api.getSettings().isKickIfTerminated())) { - // Kick the player if they're not a fake player - player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); - } - return; - } - - api.getEventManager().callEvent(new UserLoginEvent(user, player)); + FabricInjectionUtil.fireUserLoginEvent(player); } /** diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index 3c9e2b36f..e1ecd4e33 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -11,17 +11,11 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "pePreLaunchClient": [ - "io.github.retrooper.packetevents.mc1211.PacketEventsClientMod" + "mainChainLoad": [ + "io.github.retrooper.packetevents.mc1211.Fabric1211ChainLoadEntrypoint" ], - "pePreLaunchServer": [ - "io.github.retrooper.packetevents.mc1211.PacketEventsServerMod" - ], - "preLaunch": [ - "io.github.retrooper.packetevents.mc1211.PacketEventsMod" - ], - "main": [ - "io.github.retrooper.packetevents.mc1211.PacketEventsMod" + "clientChainLoad": [ + "io.github.retrooper.packetevents.mc1211.Fabric1211ClientChainLoadEntrypoint" ] }, "mixins": [ diff --git a/fabric/mc1214/build.gradle.kts b/fabric/mc1214/build.gradle.kts new file mode 100644 index 000000000..5e90fe7db --- /dev/null +++ b/fabric/mc1214/build.gradle.kts @@ -0,0 +1,59 @@ +plugins { + alias(libs.plugins.fabric.loom) +} + +repositories { + maven("https://repo.codemc.io/repository/maven-snapshots/") + maven { + name = "ParchmentMC" + url = uri("https://maven.parchmentmc.org") + } +} + +val minecraft_version: String by project +val parchment_minecraft_version: String by project +val parchment_mappings: String by project +val loader_version: String by project + +dependencies { + compileOnly(libs.bundles.adventure) + compileOnly(project(":api")) + compileOnly(project(":netty-common")) + compileOnly(project(":fabric", configuration = "namedElements")) + compileOnly(project(":fabric:mc1211", configuration = "namedElements")) + + // To change the versions, see the gradle.properties file + minecraft("com.mojang:minecraft:$minecraft_version") + mappings(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") + }) + + modImplementation("net.fabricmc:fabric-loader:$loader_version") +} + +tasks { + withType { + val targetJavaVersion = 17 + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { + options.release = targetJavaVersion + } + } +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-mc1214") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } + accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() + .resolve("${rootProject.name}.accesswidener") +} + + +tasks.compileJava { + options.release.set(17) +} \ No newline at end of file diff --git a/fabric/mc1214/gradle.properties b/fabric/mc1214/gradle.properties new file mode 100644 index 000000000..287de4351 --- /dev/null +++ b/fabric/mc1214/gradle.properties @@ -0,0 +1,10 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.21.1 +parchment_mappings=2024.11.17 +parchment_minecraft_version=1.21.1 +loader_version=0.15.11 \ No newline at end of file diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java new file mode 100644 index 000000000..598da55b5 --- /dev/null +++ b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java @@ -0,0 +1,23 @@ +package io.github.retrooper.packetevents.mc1214; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; +import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; +import io.github.retrooper.packetevents.mc1214.manager.registry.Fabric1214ItemRegistry; + +public class Fabric1214ChainLoadEntrypoint implements ChainLoadEntryPoint { + + @Override + public void initialize(ChainLoadData chainLoadData) { + chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> + new FabricRegistryManager(new Fabric1214ItemRegistry()) + )); + } + + @Override + public ServerVersion getNativeVersion() { + return ServerVersion.V_1_21_4; + } +} diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java new file mode 100644 index 000000000..85c8dbbd5 --- /dev/null +++ b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java @@ -0,0 +1,18 @@ +package io.github.retrooper.packetevents.mc1214.manager.registry; + +import com.github.retrooper.packetevents.manager.registry.ItemRegistry; +import com.github.retrooper.packetevents.protocol.item.type.ItemType; +import io.github.retrooper.packetevents.FabricItemType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import org.jetbrains.annotations.Nullable; + +public class Fabric1214ItemRegistry implements ItemRegistry { + + @Override + public @Nullable ItemType getByName(String name) { + Item item = BuiltInRegistries.ITEM.get(ResourceLocation.parse(name)); + return new FabricItemType(item); + } +} \ No newline at end of file diff --git a/fabric/mc1214/src/main/resources/fabric.mod.json b/fabric/mc1214/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..837ec8664 --- /dev/null +++ b/fabric/mc1214/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "packetevents-mc1214", + "version": "${version}", + "name": "PacketEvents dependency for 1.21.2+, built against 1.21.4", + "description": "", + "authors": [ + "retrooper" + ], + "contact": {}, + "license": "GPL-3.0", + "environment": "*", + "entrypoints": { + "mainChainLoad": [ + "io.github.retrooper.packetevents.mc1214.Fabric1214ChainLoadEntrypoint" + ] + }, + "mixins": [ + "packetevents-mc1214.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "fabricloader": ">=0.15.11", + "minecraft": ">=1.21.2" + } +} diff --git a/fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json b/fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json new file mode 100644 index 000000000..4f1116171 --- /dev/null +++ b/fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.retrooper.packetevents.mc1214.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + + ], + "mixins": [ + + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric/mc1214/src/main/resources/packetevents.accesswidener b/fabric/mc1214/src/main/resources/packetevents.accesswidener new file mode 100644 index 000000000..9ab217396 --- /dev/null +++ b/fabric/mc1214/src/main/resources/packetevents.accesswidener @@ -0,0 +1 @@ +accessWidener v2 named diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 17c99ae15..a58f0f5db 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -20,32 +20,136 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPIManagerFactory; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; +import io.github.retrooper.packetevents.manager.registry.FabricItemRegistry; +import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; +import io.github.retrooper.packetevents.util.LazyHolder; +import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; +import net.minecraft.SharedConstants; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { public static final String MOD_ID = "packetevents"; @Override - public void onPreLaunch() {} - - public void preLaunch() { + public void onPreLaunch() { FabricLoader loader = FabricLoader.getInstance(); - String entrypoint = switch (loader.getEnvironmentType()) { - case CLIENT -> "pePreLaunchClient"; - case SERVER -> "pePreLaunchServer"; - }; - loader.invokeEntrypoints(entrypoint, - PreLaunchEntrypoint.class, - PreLaunchEntrypoint::onPreLaunch); + ServerVersion currentVersion = ServerVersion.valueOf(SharedConstants.getCurrentVersion().getName()); + + String peEntryPointName = null; + String chainLoadEntryPointName = null; + String clientChainLoadEntryPointName = null; // For client-specific entrypoints + switch (loader.getEnvironmentType()) { + case CLIENT -> { + peEntryPointName = "pePreLaunchClient"; + chainLoadEntryPointName = "mainChainLoad"; + clientChainLoadEntryPointName = "clientChainLoad"; + } + case SERVER -> { + peEntryPointName = "pePreLaunchServer"; + chainLoadEntryPointName = "mainChainLoad"; + } + } + + // Collect mainChainLoad entrypoints (always present) + List mainChainLoadEntryPoints = loader.getEntrypoints(chainLoadEntryPointName, ChainLoadEntryPoint.class); + + // Collect clientChainLoad entrypoints (only on client, might be empty) + List clientChainLoadEntryPoints = loader.getEnvironmentType() == EnvType.CLIENT + ? loader.getEntrypoints(clientChainLoadEntryPointName, ChainLoadEntryPoint.class) + : Collections.emptyList(); + + // If on client, interleave the entrypoints; otherwise, use only mainChainLoad + List allEntryPoints; + if (loader.getEnvironmentType() == EnvType.SERVER) { + allEntryPoints = interleaveEntryPoints(mainChainLoadEntryPoints, clientChainLoadEntryPoints); + } else { + allEntryPoints = new ArrayList<>(mainChainLoadEntryPoints); + // Sort mainChainLoad entrypoints by version (newest first) + allEntryPoints.sort((a, b) -> b.getNativeVersion().getProtocolVersion() - a.getNativeVersion().getProtocolVersion()); + } + + // Initialize single chainload data instance + ChainLoadData chainLoadData = new ChainLoadData(); + + // Execute all entrypoints in the sorted, interleaved order using the same ChainLoadData instance + for (ChainLoadEntryPoint chainLoadEntryPoint : allEntryPoints) { + try { + chainLoadEntryPoint.initialize(chainLoadData); + } catch (Exception e) { + // Log error but continue with next entrypoint + System.err.println("Error processing entrypoint for version " + + chainLoadEntryPoint.getNativeVersion() + ": " + e.getMessage()); + e.printStackTrace(); + } + } + + // Set default registry manager if not already set by any entrypoint + chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> new FabricRegistryManager( + new FabricItemRegistry() + ))); + + // Ordinarily I wouldn't be using a static here but since we need to maintain compile-time backwards compatibility + // We need to preserve the ABI of FactoryPacketEventsAPI and do this static awfulness + FabricPacketEventsAPIManagerFactory.init(chainLoadData); + + // Invoke pre-launch entrypoints + loader.invokeEntrypoints(peEntryPointName, + PreLaunchEntrypoint.class, + PreLaunchEntrypoint::onPreLaunch); } - @Override - public void onInitialize() {} + /** + * Interleaves mainChainLoad and clientChainLoad entrypoints, sorting by version (newest first). + * If a clientChainLoad entrypoint is missing for a version, only the mainChainLoad entrypoint is included. + * @param mainEntryPoints List of mainChainLoad entrypoints + * @param clientEntryPoints List of clientChainLoad entrypoints + * @return Interleaved and sorted list of entrypoints + */ + private List interleaveEntryPoints( + List mainEntryPoints, + List clientEntryPoints + ) { + // Use a TreeMap to group entrypoints by version, sorted newest first + Map> versionToEntryPoints = new TreeMap<>( + (v1, v2) -> v2.getProtocolVersion() - v1.getProtocolVersion() + ); + + // Populate the map with mainChainLoad entrypoints + for (ChainLoadEntryPoint mainEntry : mainEntryPoints) { + versionToEntryPoints.computeIfAbsent(mainEntry.getNativeVersion(), k -> new ArrayList<>(2)) + .add(mainEntry); + } + + // Add clientChainLoad entrypoints to the same version buckets + for (ChainLoadEntryPoint clientEntry : clientEntryPoints) { + versionToEntryPoints.computeIfAbsent(clientEntry.getNativeVersion(), k -> new ArrayList<>(2)) + .add(0, clientEntry); // Insert client entrypoint before main entrypoint + } + + // Flatten the map into a single list, preserving version order and interleaving + List interleaved = new ArrayList<>(mainEntryPoints.size() + clientEntryPoints.size()); + for (List entryPoints : versionToEntryPoints.values()) { + interleaved.addAll(entryPoints); + } - public void initialize() { + return interleaved; + } + + @Override + public void onInitialize() { PacketEventsAPI api = PacketEvents.getAPI(); if (api != null) { api.init(); diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 3962f5026..e5de32a2f 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -30,14 +30,11 @@ import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import com.github.retrooper.packetevents.settings.PacketEventsSettings; import com.github.retrooper.packetevents.util.LogManager; -import io.github.retrooper.packetevents.LazyHolder; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.manager.FabricLogger; import io.github.retrooper.packetevents.manager.FabricProtocolManager; import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; -import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import org.slf4j.Logger; @@ -48,9 +45,6 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private static final Logger LOGGER = LoggerFactory.getLogger("PacketEvents"); - // TODO, refactor if booky and retrooper approve, bad design having settable static field, exists to maintain - // 100% backward compatability - public static LazyHolder staticLazyPlayerManagerHolder = () -> null; private final String modId; private final EnvType environment; @@ -58,11 +52,9 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private final ProtocolManager protocolManager; private final ServerManager serverManager; - private final LazyHolder playerManager; private final ChannelInjector injector; private final NettyManager nettyManager = new NettyManagerImpl(); private final LogManager logManager = new FabricLogger(LOGGER); - private final RegistryManager registryManager = new FabricRegistryManager(); private boolean loaded; private boolean initialized; @@ -79,7 +71,6 @@ public FabricPacketEventsAPI(String modId, EnvType environment, PacketEventsSett this.protocolManager = new FabricProtocolManager(environment); this.serverManager = this.constructServerManager(); - this.playerManager = null; this.injector = new FabricChannelInjector(environment); } @@ -173,7 +164,7 @@ public LogManager getLogManager() { @Override public PlayerManager getPlayerManager() { - return staticLazyPlayerManagerHolder.get(); + return FabricPacketEventsAPIManagerFactory.getLazyPlayerManagerHolder().get(); } @Override @@ -193,6 +184,6 @@ public NettyManager getNettyManager() { @Override public RegistryManager getRegistryManager() { - return this.registryManager; + return FabricPacketEventsAPIManagerFactory.getLazyRegistryManagerHolder().get(); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java new file mode 100644 index 000000000..447aa5633 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java @@ -0,0 +1,25 @@ +package io.github.retrooper.packetevents.factory.fabric; + +import com.github.retrooper.packetevents.manager.registry.RegistryManager; +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.loader.ChainLoadData; + +public class FabricPacketEventsAPIManagerFactory { + // TODO, refactor if booky and retrooper approve, bad design having settable static field, exists to maintain + // 100% backward compatability + private static LazyHolder lazyPlayerManagerHolder = () -> null; + private static LazyHolder registryManagerLazyHolder = () -> null; + + public static LazyHolder getLazyPlayerManagerHolder() { + return lazyPlayerManagerHolder; + } + public static LazyHolder getLazyRegistryManagerHolder() { + return registryManagerLazyHolder; + } + + public static void init(ChainLoadData chainLoadData) { + FabricPacketEventsAPIManagerFactory.lazyPlayerManagerHolder = chainLoadData.getPlayerManagerAbstractLazyHolder(); + FabricPacketEventsAPIManagerFactory.registryManagerLazyHolder = chainLoadData.getRegistryManagerLazyHolder(); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java new file mode 100644 index 000000000..160c3a0a8 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java @@ -0,0 +1,31 @@ +package io.github.retrooper.packetevents.loader; + +import com.github.retrooper.packetevents.manager.registry.RegistryManager; +import io.github.retrooper.packetevents.util.LazyHolder; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; + +public class ChainLoadData { + + private LazyHolder registryManagerLazyHolder = null; + private LazyHolder playerManagerAbstractLazyHolder = null; + + public void setRegistryManagerIfNull(LazyHolder registryManagerLazyHolder) { + if (this.registryManagerLazyHolder == null) { + this.registryManagerLazyHolder = registryManagerLazyHolder; + } + } + + public LazyHolder getRegistryManagerLazyHolder() { + return this.registryManagerLazyHolder; + } + + public void setPlayerManagerIfNull(LazyHolder playerManagerAbstractLazyHolder) { + if (playerManagerAbstractLazyHolder == null) { + this.playerManagerAbstractLazyHolder = playerManagerAbstractLazyHolder; + } + } + + public LazyHolder getPlayerManagerAbstractLazyHolder() { + return this.playerManagerAbstractLazyHolder; + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java new file mode 100644 index 000000000..7b89bd3d9 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java @@ -0,0 +1,8 @@ +package io.github.retrooper.packetevents.loader; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; + +public interface ChainLoadEntryPoint { + void initialize(ChainLoadData chainLoadData); + ServerVersion getNativeVersion(); +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java index 2820e3a79..dd0ea6ac1 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java @@ -12,7 +12,7 @@ public class FabricItemRegistry implements ItemRegistry { @Override public @Nullable ItemType getByName(String name) { - Item item = BuiltInRegistries.ITEM.get(ResourceLocation.of(name, ':')); + Item item = BuiltInRegistries.ITEM.get(ResourceLocation.tryParse(name)); return new FabricItemType(item); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java index 5dba7062c..0e6f1b2c3 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java @@ -1,13 +1,20 @@ package io.github.retrooper.packetevents.manager.registry; +import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.manager.registry.RegistryManager; public class FabricRegistryManager implements RegistryManager { - private final FabricItemRegistry fabricItemRegistry = new FabricItemRegistry(); + private final ItemRegistry fabricItemRegistry; + + public FabricRegistryManager( + ItemRegistry fabricItemRegistry + ) { + this.fabricItemRegistry = fabricItemRegistry; + } @Override - public FabricItemRegistry getItemRegistry() { + public ItemRegistry getItemRegistry() { return fabricItemRegistry; } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index 38a9538d7..550f988f5 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -1,13 +1,16 @@ package io.github.retrooper.packetevents.util; import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.event.UserConnectEvent; +import com.github.retrooper.packetevents.event.UserLoginEvent; import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.protocol.PacketSide; 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 com.github.retrooper.packetevents.util.FakeChannelUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import io.github.retrooper.packetevents.handler.PacketDecoder; import io.github.retrooper.packetevents.handler.PacketEncoder; @@ -17,7 +20,9 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import net.minecraft.SharedConstants; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.server.level.ServerPlayer; public class FabricInjectionUtil { private static final String VIA_DECODER_NAME = "via-decoder"; @@ -103,4 +108,23 @@ public static void reorderHandlers(ChannelHandlerContext ctx) { PacketEvents.getAPI().getLogManager().debug("Pipeline after reorder: " + pipeline.names()); } + + public static void fireUserLoginEvent(ServerPlayer player) { + PacketEventsAPI api = PacketEvents.getAPI(); + + User user = api.getPlayerManager().getUser(player); + if (user == null) { + Object channelObj = api.getPlayerManager().getChannel(player); + + // Check if it's a fake connection + if (!FakeChannelUtil.isFakeChannel(channelObj) && + (!api.isTerminated() || api.getSettings().isKickIfTerminated())) { + // Kick the player if they're not a fake player + player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); + } + return; + } + + api.getEventManager().callEvent(new UserLoginEvent(user, player)); + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java similarity index 96% rename from fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java rename to fabric/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java index a1aebabe8..327c49dc5 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/LazyHolder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents; +package io.github.retrooper.packetevents.util; import java.util.function.Supplier; diff --git a/settings.gradle.kts b/settings.gradle.kts index 55f4034c5..0f329bd5e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,5 +36,6 @@ include("sponge") include("fabric") include(":fabric:mc1201") include(":fabric:mc1211") +include(":fabric:mc1214") // Patch modules include(":patch:adventure-text-serializer-gson") From 64a692fb55d44d5d1dd0e52e0e23b4fd3c218b47 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Thu, 13 Mar 2025 00:38:59 -0400 Subject: [PATCH 19/43] temporarily remove conditional mixin dep --- fabric/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index fbd7e6267..12fd084a6 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -35,7 +35,6 @@ dependencies { }) modImplementation("net.fabricmc:fabric-loader:$loader_version") - modImplementation("com.github.Fallen-Breath.conditional-mixin:conditional-mixin-fabric:0.6.4") compileOnly(libs.via.version) } From 5a4c9535adf5ea3a4dfb1da89eee943ef9b94119 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Thu, 13 Mar 2025 01:41:39 -0400 Subject: [PATCH 20/43] Chainloader impl patches (we really need lombok) --- .../java/io/github/retrooper/packetevents/PacketEventsMod.java | 1 - .../io/github/retrooper/packetevents/loader/ChainLoadData.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index a58f0f5db..0dbd106b3 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -46,7 +46,6 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { @Override public void onPreLaunch() { FabricLoader loader = FabricLoader.getInstance(); - ServerVersion currentVersion = ServerVersion.valueOf(SharedConstants.getCurrentVersion().getName()); String peEntryPointName = null; String chainLoadEntryPointName = null; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java index 160c3a0a8..0eea8824c 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java @@ -20,7 +20,7 @@ public LazyHolder getRegistryManagerLazyHolder() { } public void setPlayerManagerIfNull(LazyHolder playerManagerAbstractLazyHolder) { - if (playerManagerAbstractLazyHolder == null) { + if (this.playerManagerAbstractLazyHolder == null) { this.playerManagerAbstractLazyHolder = playerManagerAbstractLazyHolder; } } From 76be695a2c952f4a759d5a33eec32431eddea6c5 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Thu, 13 Mar 2025 02:11:29 -0400 Subject: [PATCH 21/43] Fix native registry handling --- fabric/mc1214/gradle.properties | 6 +++--- .../mc1214/manager/registry/Fabric1214ItemRegistry.java | 7 +++++-- .../packetevents/manager/registry/FabricItemRegistry.java | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/fabric/mc1214/gradle.properties b/fabric/mc1214/gradle.properties index 287de4351..c623cf837 100644 --- a/fabric/mc1214/gradle.properties +++ b/fabric/mc1214/gradle.properties @@ -4,7 +4,7 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.1 -parchment_mappings=2024.11.17 -parchment_minecraft_version=1.21.1 +minecraft_version=1.21.4 +parchment_mappings=2025.02.16 +parchment_minecraft_version=1.21.4 loader_version=0.15.11 \ No newline at end of file diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java index 85c8dbbd5..eca68954d 100644 --- a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java +++ b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java @@ -3,16 +3,19 @@ import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; import io.github.retrooper.packetevents.FabricItemType; +import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import org.jetbrains.annotations.Nullable; +import java.util.Optional; + public class Fabric1214ItemRegistry implements ItemRegistry { @Override public @Nullable ItemType getByName(String name) { - Item item = BuiltInRegistries.ITEM.get(ResourceLocation.parse(name)); - return new FabricItemType(item); + Optional> optionalItemReference = BuiltInRegistries.ITEM.get(ResourceLocation.parse(name)); + return optionalItemReference.isPresent() ? new FabricItemType(optionalItemReference.get().value()) : null; } } \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java index dd0ea6ac1..c0fdcc1e1 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java @@ -8,11 +8,13 @@ import net.minecraft.world.item.Item; import org.jetbrains.annotations.Nullable; +import java.util.Optional; + public class FabricItemRegistry implements ItemRegistry { @Override public @Nullable ItemType getByName(String name) { - Item item = BuiltInRegistries.ITEM.get(ResourceLocation.tryParse(name)); - return new FabricItemType(item); + Optional item = BuiltInRegistries.ITEM.getOptional(ResourceLocation.tryParse(name)); + return item.isPresent() ? new FabricItemType(item.get()) : null; } } From 16c28dc6ad52114e01fb9a371ff64ba1eb478351 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 23 Mar 2025 02:56:49 -0400 Subject: [PATCH 22/43] Initialize PacketEventsAPI inside PE mod onPreLaunch() (once!) instead of relying on external mod intialization --- .../github/retrooper/packetevents/PacketEventsClientMod.java | 4 +--- .../io/github/retrooper/packetevents/PacketEventsMod.java | 1 - .../github/retrooper/packetevents/PacketEventsServerMod.java | 4 +--- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java index 1104a98a4..6303df4f4 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java @@ -30,9 +30,7 @@ public static FabricPacketEventsAPI constructApi(String modid) { } @Override - public void onPreLaunch() {} - - public void preLaunch() { + public void onPreLaunch() { PacketEvents.setAPI(constructApi(PacketEventsMod.MOD_ID)); PacketEvents.getAPI().load(); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 0dbd106b3..14b01d79b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -31,7 +31,6 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -import net.minecraft.SharedConstants; import java.util.ArrayList; import java.util.Collections; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java index 3e85acb4c..64295d8e1 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java @@ -32,9 +32,7 @@ public static FabricPacketEventsAPI constructApi(String modid) { } @Override - public void onPreLaunch() {} - - public void preLaunch() { + public void onPreLaunch() { PacketEvents.setAPI(constructApi(PacketEventsMod.MOD_ID)); PacketEvents.getAPI().load(); } From d648f273f8236c46bfd1136eccf9bf8c2cb44e24 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 23 Mar 2025 07:25:27 -0400 Subject: [PATCH 23/43] Build instance of FabricPacketEventsAPI through single entrypoint; legacy classes remain with constructAPI methods for backwards compat --- .../retrooper/packetevents/PacketEventsClientMod.java | 9 ++------- .../github/retrooper/packetevents/PacketEventsMod.java | 10 +++------- .../retrooper/packetevents/PacketEventsServerMod.java | 9 ++------- .../factory/fabric/FabricPacketEventsBuilder.java | 3 ++- fabric/src/main/resources/fabric.mod.json | 6 ------ 5 files changed, 9 insertions(+), 28 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java index 6303df4f4..84acbca4b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java @@ -23,15 +23,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -public class PacketEventsClientMod implements PreLaunchEntrypoint { +public class PacketEventsClientMod { + // Exists solely for backwards compatability for mods that may have used this internal method public static FabricPacketEventsAPI constructApi(String modid) { return new FabricPacketEventsAPI(modid, EnvType.CLIENT); } - - @Override - public void onPreLaunch() { - PacketEvents.setAPI(constructApi(PacketEventsMod.MOD_ID)); - PacketEvents.getAPI().load(); - } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 14b01d79b..0024657c4 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -21,6 +21,7 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPIManagerFactory; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; @@ -46,17 +47,14 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { public void onPreLaunch() { FabricLoader loader = FabricLoader.getInstance(); - String peEntryPointName = null; String chainLoadEntryPointName = null; String clientChainLoadEntryPointName = null; // For client-specific entrypoints switch (loader.getEnvironmentType()) { case CLIENT -> { - peEntryPointName = "pePreLaunchClient"; chainLoadEntryPointName = "mainChainLoad"; clientChainLoadEntryPointName = "clientChainLoad"; } case SERVER -> { - peEntryPointName = "pePreLaunchServer"; chainLoadEntryPointName = "mainChainLoad"; } } @@ -103,10 +101,8 @@ public void onPreLaunch() { // We need to preserve the ABI of FactoryPacketEventsAPI and do this static awfulness FabricPacketEventsAPIManagerFactory.init(chainLoadData); - // Invoke pre-launch entrypoints - loader.invokeEntrypoints(peEntryPointName, - PreLaunchEntrypoint.class, - PreLaunchEntrypoint::onPreLaunch); + PacketEvents.setAPI(new FabricPacketEventsAPI(PacketEventsMod.MOD_ID, loader.getEnvironmentType())); + PacketEvents.getAPI().load(); } /** diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java index 64295d8e1..9f8453b58 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java @@ -25,15 +25,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -public class PacketEventsServerMod implements PreLaunchEntrypoint { +public class PacketEventsServerMod { + // Exists solely for backwards compatability for mods that may have used this internal method public static FabricPacketEventsAPI constructApi(String modid) { return new FabricPacketEventsAPI(modid, EnvType.SERVER); } - - @Override - public void onPreLaunch() { - PacketEvents.setAPI(constructApi(PacketEventsMod.MOD_ID)); - PacketEvents.getAPI().load(); - } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java index e9aab1696..9e56f9750 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java @@ -21,6 +21,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.settings.PacketEventsSettings; import io.github.retrooper.packetevents.PacketEventsClientMod; +import net.fabricmc.api.EnvType; /** * You should, if possible, never construct a packetevents instance on your own @@ -54,6 +55,6 @@ public static PacketEventsAPI buildNoCache(String modId) { } public static PacketEventsAPI buildNoCache(String modId, PacketEventsSettings inSettings) { - return PacketEventsClientMod.constructApi(modId); + return new FabricPacketEventsAPI(modId, EnvType.CLIENT); } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index ada6672aa..78cfeb311 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -12,12 +12,6 @@ "icon": "assets/packetevents/icon.png", "environment": "*", "entrypoints": { - "pePreLaunchClient": [ - "io.github.retrooper.packetevents.PacketEventsClientMod" - ], - "pePreLaunchServer": [ - "io.github.retrooper.packetevents.PacketEventsServerMod" - ], "preLaunch": [ "io.github.retrooper.packetevents.PacketEventsMod" ], From c0464a4e2acd1413a16e146dd3cf8174bcd745b2 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sun, 23 Mar 2025 07:46:32 -0400 Subject: [PATCH 24/43] Refactor FabricPacketEventsAPI to return ModInitializer on getPlugin() --- .../retrooper/packetevents/PacketEventsMod.java | 2 ++ .../factory/fabric/FabricPacketEventsAPI.java | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 0024657c4..300fa94dd 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -41,10 +41,12 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { + public static PacketEventsMod INSTANCE; public static final String MOD_ID = "packetevents"; @Override public void onPreLaunch() { + INSTANCE = this; FabricLoader loader = FabricLoader.getInstance(); String chainLoadEntryPointName = null; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index e5de32a2f..610a1c68e 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -30,19 +30,20 @@ import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import com.github.retrooper.packetevents.settings.PacketEventsSettings; import com.github.retrooper.packetevents.util.LogManager; +import io.github.retrooper.packetevents.PacketEventsMod; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.manager.FabricLogger; import io.github.retrooper.packetevents.manager.FabricProtocolManager; import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.api.ModInitializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Locale; -public class FabricPacketEventsAPI extends PacketEventsAPI { +public class FabricPacketEventsAPI extends PacketEventsAPI { private static final Logger LOGGER = LoggerFactory.getLogger("PacketEvents"); @@ -68,7 +69,6 @@ public FabricPacketEventsAPI(String modId, EnvType environment, PacketEventsSett this.modId = modId; this.environment = environment; this.settings = settings; - this.protocolManager = new FabricProtocolManager(environment); this.serverManager = this.constructServerManager(); this.injector = new FabricChannelInjector(environment); @@ -142,9 +142,11 @@ public boolean isTerminated() { return this.terminated; } + // Returning ModInitializer instance makes getClass().getClassLoader() return KnotClassLoader + // Which allows us to correctly check for existence of Via, Geyser, etc... @Override - public FabricLoader getPlugin() { - return FabricLoader.getInstance(); + public ModInitializer getPlugin() { + return PacketEventsMod.INSTANCE; } @Override From a53e3cb486e0071fc77bd2263d9e07e33b9d5f70 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 24 Mar 2025 08:40:14 -0400 Subject: [PATCH 25/43] Fix and test Fabric 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21 support - Refactor build scripts to share more code and better JiJ support - Reintroduce client source set to parent :fabric subproject - Give Fabric version-specific subprojects a fabric.mod.json version --- fabric/build.gradle.kts | 76 ++++++++++++++----- fabric/mc1201/build.gradle.kts | 31 -------- fabric/mc1201/gradle.properties | 1 - .../fabric/Fabric1201ClientPlayerManager.java | 1 + .../mixin/ClientPacketListenerMixin.java | 3 +- .../mc1201/mixin/ConnectionMixin.java | 22 ++---- .../mc1201/mixin/PlayerListMixin.java | 17 ++--- .../mc1201/src/main/resources/fabric.mod.json | 2 +- .../resources/packetevents-mc1201.mixins.json | 3 +- fabric/mc1202/build.gradle.kts | 27 +++++++ fabric/mc1202/gradle.properties | 9 +++ .../Fabric1202ChainLoadEntrypoint.java} | 10 +-- .../Fabric1202ServerPlayerManager.java} | 6 +- .../mc1202/mixin/ConnectionMixin.java | 64 ++++++++++++++++ .../mc1202}/mixin/PlayerListMixin.java | 55 +++++--------- .../mc1202/mixin/PlayerListRespawnMixin.java | 34 +++++++++ .../mc1202/src/main/resources/fabric.mod.json | 26 +++++++ .../resources/packetevents-mc1202.mixins.json | 15 ++++ .../main/resources/packetevents.accesswidener | 11 +++ fabric/mc1211/build.gradle.kts | 34 +-------- fabric/mc1211/gradle.properties | 3 +- .../Fabric1211ClientChainLoadEntrypoint.java | 16 +++- .../fabric/Fabric1211ClientPlayerManager.java | 4 +- .../mc1211/mixin/ConnectionMixin.java | 23 ++---- .../mc1211/src/main/resources/fabric.mod.json | 5 +- .../resources/packetevents-mc1211.mixins.json | 6 +- fabric/mc1214/build.gradle.kts | 32 -------- fabric/mc1214/gradle.properties | 3 +- .../mc1214/Fabric1214ChainLoadEntrypoint.java | 2 +- .../packetevents/PacketEventsClientMod.java | 2 - .../fabric/FabricPacketEventsBuilder.java | 3 +- .../manager/PacketEventsMixinManager.java | 20 +++++ netty-common/build.gradle.kts | 3 +- settings.gradle.kts | 1 + 34 files changed, 345 insertions(+), 225 deletions(-) create mode 100644 fabric/mc1202/build.gradle.kts create mode 100644 fabric/mc1202/gradle.properties rename fabric/{mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java => mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java} (68%) rename fabric/{mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java => mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java} (85%) create mode 100644 fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java rename fabric/{mc1211/src/main/java/io/github/retrooper/packetevents/mc1211 => mc1202/src/main/java/io/github/retrooper/packetevents/mc1202}/mixin/PlayerListMixin.java (56%) create mode 100644 fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java create mode 100644 fabric/mc1202/src/main/resources/fabric.mod.json create mode 100644 fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json create mode 100644 fabric/mc1202/src/main/resources/packetevents.accesswidener rename fabric/src/{main => client}/java/io/github/retrooper/packetevents/PacketEventsClientMod.java (91%) rename fabric/src/{main => client}/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java (93%) create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 12fd084a6..cdf5efdfe 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,16 +1,12 @@ plugins { packetevents.`library-conventions` alias(libs.plugins.fabric.loom) + id("idea") } repositories { - maven("https://repo.codemc.io/repository/maven-snapshots/") maven("https://repo.viaversion.com/") maven("https://jitpack.io") // Conditional Mixin - maven { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } } val minecraft_version: String by project @@ -22,10 +18,12 @@ dependencies { api(libs.bundles.adventure) api(project(":api", "shadow")) api(project(":netty-common")) + modApi("com.github.Fallen-Breath.conditional-mixin:conditional-mixin-fabric:0.6.4") include(libs.bundles.adventure) include(project(":api", "shadow")) include(project(":netty-common")) + include("com.github.Fallen-Breath.conditional-mixin:conditional-mixin-fabric:0.6.4") // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") @@ -34,13 +32,62 @@ dependencies { parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) - modImplementation("net.fabricmc:fabric-loader:$loader_version") compileOnly(libs.via.version) } +allprojects { + apply(plugin = "fabric-loom") + + repositories { + maven("https://repo.codemc.io/repository/maven-snapshots/") + maven { + name = "ParchmentMC" + url = uri("https://maven.parchmentmc.org") + } + } + + dependencies { + modImplementation("net.fabricmc:fabric-loader:$loader_version") + } + + tasks { + withType { + val targetJavaVersion = 17 + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { + options.release = targetJavaVersion + } + } + + remapSourcesJar { + archiveVersion = rootProject.ext["versionNoHash"] as String + } + } + + apply(plugin = "idea") + idea { + module { + isDownloadJavadoc = true + isDownloadSources = true + } + } +} + subprojects { - afterEvaluate { - tasks.processResources { + version = rootProject.version + + dependencies { + compileOnly(project(":api", "shadow")) + compileOnly(project(":netty-common")) + compileOnly(project(":fabric", configuration = "namedElements")) + } + + tasks { + remapJar { + archiveBaseName = "${rootProject.name}-fabric-${project.name}" + archiveVersion = rootProject.ext["versionNoHash"] as String + } + + processResources { inputs.property("version", project.version) filesMatching("fabric.mod.json") { expand("version" to project.version) @@ -50,27 +97,18 @@ subprojects { } tasks { - withType { - val targetJavaVersion = 17 - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { - options.release = targetJavaVersion - } - } - remapJar { archiveBaseName = "${rootProject.name}-fabric" archiveVersion = rootProject.ext["versionNoHash"] as String } - - remapSourcesJar { - archiveVersion = rootProject.ext["versionNoHash"] as String - } } loom { + splitEnvironmentSourceSets() mods { register("packetevents") { sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) } } accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts index 00e70919b..bf8989616 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1201/build.gradle.kts @@ -1,25 +1,9 @@ -plugins { - alias(libs.plugins.fabric.loom) -} - -repositories { - maven("https://repo.codemc.io/repository/maven-snapshots/") - maven { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } -} - val minecraft_version: String by project val parchment_minecraft_version: String by project val parchment_mappings: String by project -val loader_version: String by project dependencies { implementation(libs.bundles.adventure) - implementation(project(":api")) - implementation(project(":netty-common")) - implementation(project(":fabric", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") @@ -27,17 +11,6 @@ dependencies { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) - - modImplementation("net.fabricmc:fabric-loader:$loader_version") -} - -tasks { - withType { - val targetJavaVersion = 17 - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { - options.release = targetJavaVersion - } - } } loom { @@ -50,8 +23,4 @@ loom { } accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() .resolve("${rootProject.name}.accesswidener") -} - -tasks.compileJava { - options.release.set(17) } \ No newline at end of file diff --git a/fabric/mc1201/gradle.properties b/fabric/mc1201/gradle.properties index a27726efb..6fbde2dc7 100644 --- a/fabric/mc1201/gradle.properties +++ b/fabric/mc1201/gradle.properties @@ -7,4 +7,3 @@ org.gradle.parallel=true minecraft_version=1.20.1 parchment_mappings=2023.09.03 parchment_minecraft_version=1.20.1 -loader_version=0.15.11 diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java index b2703a86d..dda503576 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java @@ -18,6 +18,7 @@ package io.github.retrooper.packetevents.mc1201.factory.fabric; +import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.LocalPlayer; import org.jetbrains.annotations.NotNull; diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java index 1cc0e5900..659b8ac6e 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java @@ -38,7 +38,6 @@ public abstract class ClientPacketListenerMixin implements TickablePacketListener, ClientGamePacketListener { - @Final @Shadow public Minecraft minecraft; @Shadow public abstract Connection getConnection(); /** * @reason Associate connection instance with player instance @@ -53,7 +52,7 @@ public abstract class ClientPacketListenerMixin implements TickablePacketListene ) ) private void postLoginPlayerConstruct(CallbackInfo ci) { - PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, this.minecraft.player); + PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, Minecraft.getInstance().player); } /** diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java index 0c3b5d29e..2b768058a 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java @@ -18,29 +18,21 @@ package io.github.retrooper.packetevents.mc1201.mixin; -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.UserConnectEvent; -import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; -import com.github.retrooper.packetevents.protocol.ConnectionState; -import com.github.retrooper.packetevents.protocol.PacketSide; -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 com.github.retrooper.packetevents.util.PacketEventsImplHelper; -import io.github.retrooper.packetevents.handler.PacketDecoder; -import io.github.retrooper.packetevents.handler.PacketEncoder; import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelPipeline; -import net.minecraft.SharedConstants; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.protocol.PacketFlow; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), + } +) @Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via public class ConnectionMixin { diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java index 62eac60a2..f3c0f71ac 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java @@ -19,30 +19,27 @@ package io.github.retrooper.packetevents.mc1201.mixin; import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.PacketEventsAPI; -import com.github.retrooper.packetevents.event.UserLoginEvent; -import com.github.retrooper.packetevents.protocol.player.User; -import com.github.retrooper.packetevents.util.FakeChannelUtil; import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.Channel; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.Connection; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), + } +) @Mixin(PlayerList.class) public abstract class PlayerListMixin { - @Shadow public abstract void sendAllPlayerInfo(ServerPlayer player); - - @Shadow public abstract void placeNewPlayer(Connection netManager, ServerPlayer player); - /** * @reason Associate connection instance with player instance */ diff --git a/fabric/mc1201/src/main/resources/fabric.mod.json b/fabric/mc1201/src/main/resources/fabric.mod.json index f3d6e643d..441816ad8 100644 --- a/fabric/mc1201/src/main/resources/fabric.mod.json +++ b/fabric/mc1201/src/main/resources/fabric.mod.json @@ -24,6 +24,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": ">=0.15.11", - "minecraft": ">=1.20 <1.21" + "minecraft": ">=1.20" } } diff --git a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json index 7a1b75b2b..70f8f9362 100644 --- a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json +++ b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json @@ -12,5 +12,6 @@ ], "injectors": { "defaultRequire": 1 - } + }, + "plugin": "io.github.retrooper.packetevents.manager.PacketEventsMixinManager" } diff --git a/fabric/mc1202/build.gradle.kts b/fabric/mc1202/build.gradle.kts new file mode 100644 index 000000000..78c499a00 --- /dev/null +++ b/fabric/mc1202/build.gradle.kts @@ -0,0 +1,27 @@ +val minecraft_version: String by project +val parchment_minecraft_version: String by project +val parchment_mappings: String by project + +dependencies { + implementation(libs.bundles.adventure) + compileOnly(project(":fabric:mc1201", configuration = "namedElements")) + + // To change the versions, see the gradle.properties file + minecraft("com.mojang:minecraft:$minecraft_version") + mappings(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") + }) +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-mc1201") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } + accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() + .resolve("${rootProject.name}.accesswidener") +} \ No newline at end of file diff --git a/fabric/mc1202/gradle.properties b/fabric/mc1202/gradle.properties new file mode 100644 index 000000000..360c58ea3 --- /dev/null +++ b/fabric/mc1202/gradle.properties @@ -0,0 +1,9 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.2 +parchment_mappings=2023.12.10 +parchment_minecraft_version=1.20.2 diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java similarity index 68% rename from fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java rename to fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java index 253d1e2c8..2328283cf 100644 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/Fabric1211ChainLoadEntrypoint.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java @@ -1,15 +1,15 @@ -package io.github.retrooper.packetevents.mc1211; +package io.github.retrooper.packetevents.mc1202; import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; -import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ServerPlayerManager; +import io.github.retrooper.packetevents.mc1202.factory.fabric.Fabric1202ServerPlayerManager; -public class Fabric1211ChainLoadEntrypoint implements ChainLoadEntryPoint { +public class Fabric1202ChainLoadEntrypoint implements ChainLoadEntryPoint { - protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1211ServerPlayerManager::new); + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1202ServerPlayerManager::new); @Override public void initialize(ChainLoadData chainLoadData) { @@ -18,6 +18,6 @@ public void initialize(ChainLoadData chainLoadData) { @Override public ServerVersion getNativeVersion() { - return ServerVersion.V_1_21_1; + return ServerVersion.V_1_20_2; } } diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java similarity index 85% rename from fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java rename to fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java index a26d1ded8..f4f569830 100644 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ServerPlayerManager.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mc1211.factory.fabric; +package io.github.retrooper.packetevents.mc1202.factory.fabric; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; -public class Fabric1211ServerPlayerManager extends PlayerManagerAbstract { +public class Fabric1202ServerPlayerManager extends Fabric1201ServerPlayerManager { @Override public int getPing(@NotNull Object player) { diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java new file mode 100644 index 000000000..f0b155554 --- /dev/null +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java @@ -0,0 +1,64 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1202.mixin; + +import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.UserConnectEvent; +import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; +import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.protocol.PacketSide; +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 com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.github.retrooper.packetevents.handler.PacketDecoder; +import io.github.retrooper.packetevents.handler.PacketEncoder; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelPipeline; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; +import net.minecraft.SharedConstants; +import net.minecraft.network.BandwidthDebugMonitor; +import net.minecraft.network.protocol.PacketFlow; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {">=1.20.2 <1.20.5"}), + } +) +@Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via +public class ConnectionMixin { + + @Inject( + method = "configureSerialization", + at = @At("RETURN") + ) + private static void configureSerialization( + ChannelPipeline pipeline, PacketFlow flow, BandwidthDebugMonitor bandwithMonitor, CallbackInfo ci + ) { + FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); + } +} diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java similarity index 56% rename from fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java rename to fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java index 4b80d6a88..f19577a11 100644 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/PlayerListMixin.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java @@ -16,17 +16,13 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mc1211.mixin; +package io.github.retrooper.packetevents.mc1202.mixin; import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.PacketEventsAPI; -import com.github.retrooper.packetevents.event.UserLoginEvent; -import com.github.retrooper.packetevents.protocol.player.User; -import com.github.retrooper.packetevents.util.FakeChannelUtil; import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import io.netty.channel.Channel; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.Connection; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.server.players.PlayerList; @@ -34,8 +30,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {">=1.20.2"}), + } +) @Mixin(PlayerList.class) public class PlayerListMixin { @@ -43,12 +43,12 @@ public class PlayerListMixin { * @reason Associate connection instance with player instance */ @Inject( - method = "placeNewPlayer", - at = @At("HEAD") + method = "placeNewPlayer", + at = @At("HEAD") ) private void preNewPlayerPlace( - Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci + Connection connection, ServerPlayer player, + CommonListenerCookie cookie, CallbackInfo ci ) { PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); } @@ -57,30 +57,17 @@ private void preNewPlayerPlace( * @reason Associate connection instance with player instance and handle login event */ @Inject( - method = "placeNewPlayer", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V", - shift = At.Shift.AFTER - ) + method = "placeNewPlayer", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V", + shift = At.Shift.AFTER + ) ) private void onPlayerLogin( - Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci + Connection connection, ServerPlayer player, + CommonListenerCookie cookie, CallbackInfo ci ) { FabricInjectionUtil.fireUserLoginEvent(player); } - - /** - * @reason Minecraft creates a new player instance on respawn - */ - @Inject( - method = "respawn", - at = @At("RETURN") - ) - private void postRespawn(CallbackInfoReturnable cir) { - ServerPlayer player = cir.getReturnValue(); - Channel channel = player.connection.connection.channel; - PacketEvents.getAPI().getInjector().setPlayer(channel, player); - } -} \ No newline at end of file +} diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java new file mode 100644 index 000000000..ff98dd050 --- /dev/null +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java @@ -0,0 +1,34 @@ +package io.github.retrooper.packetevents.mc1202.mixin; + +import com.github.retrooper.packetevents.PacketEvents; +import io.netty.channel.Channel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PlayerList.class) +public class PlayerListRespawnMixin { + /** + * @reason Minecraft creates a new player instance on respawn + */ + // Intermediary name for respawnPlayer() is method_14556 + // We use this and disable remapping because the method signature changes in 1.21 + // This allows the same code to inject into (in theory) very version and + @Dynamic + @Inject( + method = "method_14556*", + at = @At("RETURN"), + remap = false + ) + private void postRespawn(CallbackInfoReturnable cir) { + ServerPlayer player = cir.getReturnValue(); + Channel channel = player.connection.connection.channel; + PacketEvents.getAPI().getInjector().setPlayer(channel, player); + } +} + + diff --git a/fabric/mc1202/src/main/resources/fabric.mod.json b/fabric/mc1202/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..b958694fa --- /dev/null +++ b/fabric/mc1202/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "packetevents-mc1202", + "version": "${version}", + "name": "PacketEvents for 1.20.2", + "description": "", + "authors": [ + "retrooper" + ], + "contact": {}, + "license": "GPL-3.0", + "environment": "*", + "entrypoints": { + "mainChainLoad": [ + "io.github.retrooper.packetevents.mc1202.Fabric1202ChainLoadEntrypoint" + ] + }, + "mixins": [ + "packetevents-mc1202.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "fabricloader": ">=0.15.11", + "minecraft": ">=1.20.2" + } +} diff --git a/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json b/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json new file mode 100644 index 000000000..9d832b44b --- /dev/null +++ b/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.retrooper.packetevents.mc1202.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "ConnectionMixin", + "PlayerListMixin", + "PlayerListRespawnMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "plugin": "io.github.retrooper.packetevents.manager.PacketEventsMixinManager" +} diff --git a/fabric/mc1202/src/main/resources/packetevents.accesswidener b/fabric/mc1202/src/main/resources/packetevents.accesswidener new file mode 100644 index 000000000..ef1bac2f9 --- /dev/null +++ b/fabric/mc1202/src/main/resources/packetevents.accesswidener @@ -0,0 +1,11 @@ +accessWidener v2 named + + +# fields +#accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; +accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; +accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; +#accessible field net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; +# methods + +# classes diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 53a276f8f..25f1387ac 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -1,25 +1,11 @@ -plugins { - alias(libs.plugins.fabric.loom) -} - -repositories { - maven("https://repo.codemc.io/repository/maven-snapshots/") - maven { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } -} - val minecraft_version: String by project val parchment_minecraft_version: String by project val parchment_mappings: String by project -val loader_version: String by project dependencies { compileOnly(libs.bundles.adventure) - compileOnly(project(":api")) - compileOnly(project(":netty-common")) - compileOnly(project(":fabric", configuration = "namedElements")) + compileOnly(project(":fabric:mc1202", configuration = "namedElements")) + compileOnly(project(":fabric:mc1201", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") @@ -27,17 +13,6 @@ dependencies { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) - - modImplementation("net.fabricmc:fabric-loader:$loader_version") -} - -tasks { - withType { - val targetJavaVersion = 17 - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { - options.release = targetJavaVersion - } - } } loom { @@ -50,9 +25,4 @@ loom { } accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() .resolve("${rootProject.name}.accesswidener") -} - - -tasks.compileJava { - options.release.set(17) } \ No newline at end of file diff --git a/fabric/mc1211/gradle.properties b/fabric/mc1211/gradle.properties index 287de4351..cb75a95ac 100644 --- a/fabric/mc1211/gradle.properties +++ b/fabric/mc1211/gradle.properties @@ -6,5 +6,4 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.21.1 parchment_mappings=2024.11.17 -parchment_minecraft_version=1.21.1 -loader_version=0.15.11 \ No newline at end of file +parchment_minecraft_version=1.21.1 \ No newline at end of file diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java index c7f445292..47029c120 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java @@ -1,13 +1,23 @@ package io.github.retrooper.packetevents.mc1211; +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ClientPlayerManager; -public class Fabric1211ClientChainLoadEntrypoint extends Fabric1211ChainLoadEntrypoint { +public class Fabric1211ClientChainLoadEntrypoint implements ChainLoadEntryPoint { + + private final LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1211ClientPlayerManager::new); + @Override public void initialize(ChainLoadData chainLoadData) { - super.playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1211ClientPlayerManager::new); - super.initialize(chainLoadData); + chainLoadData.setPlayerManagerIfNull(playerManagerAbstractLazyHolder); + } + + @Override + public ServerVersion getNativeVersion() { + return ServerVersion.V_1_21_1; } } diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java index f46f7f045..a739592b0 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java @@ -18,12 +18,13 @@ package io.github.retrooper.packetevents.mc1211.factory.fabric; +import io.github.retrooper.packetevents.mc1202.factory.fabric.Fabric1202ServerPlayerManager; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.LocalPlayer; import org.jetbrains.annotations.NotNull; -public class Fabric1211ClientPlayerManager extends Fabric1211ServerPlayerManager { +public class Fabric1211ClientPlayerManager extends Fabric1202ServerPlayerManager { @Override public int getPing(@NotNull Object playerObj) { @@ -35,7 +36,6 @@ public int getPing(@NotNull Object playerObj) { // if the server doesn't show the player info of // the player itself, try to fall back to potential // latency sampling data - which is often not present - // TODO fix later for 1.20.1 return (int) Minecraft.getInstance().getDebugOverlay().getPingLogger().get(0); } return super.getPing(playerObj); diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java index deaf11642..d62155d6f 100644 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java +++ b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java @@ -18,33 +18,24 @@ package io.github.retrooper.packetevents.mc1211.mixin; -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.UserConnectEvent; -import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; -import com.github.retrooper.packetevents.protocol.ConnectionState; -import com.github.retrooper.packetevents.protocol.PacketSide; -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 com.github.retrooper.packetevents.util.PacketEventsImplHelper; -import io.github.retrooper.packetevents.handler.PacketDecoder; -import io.github.retrooper.packetevents.handler.PacketEncoder; -import io.github.retrooper.packetevents.util.FabricCustomPipelineUtil; import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import net.minecraft.SharedConstants; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.BandwidthDebugMonitor; import net.minecraft.network.protocol.PacketFlow; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {">=1.20.5"}), + } +) @Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via public abstract class ConnectionMixin { diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index e1ecd4e33..8df1330a2 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -11,9 +11,6 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "mainChainLoad": [ - "io.github.retrooper.packetevents.mc1211.Fabric1211ChainLoadEntrypoint" - ], "clientChainLoad": [ "io.github.retrooper.packetevents.mc1211.Fabric1211ClientChainLoadEntrypoint" ] @@ -24,6 +21,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": ">=0.15.11", - "minecraft": ">=1.21" + "minecraft": ">=1.20.5" } } diff --git a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json index bf1d60b78..965ac10bb 100644 --- a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json +++ b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json @@ -7,10 +7,10 @@ "ClientPacketListenerMixin" ], "mixins": [ - "ConnectionMixin", - "PlayerListMixin" + "ConnectionMixin" ], "injectors": { "defaultRequire": 1 - } + }, + "plugin": "io.github.retrooper.packetevents.manager.PacketEventsMixinManager" } diff --git a/fabric/mc1214/build.gradle.kts b/fabric/mc1214/build.gradle.kts index 5e90fe7db..ead5fc57f 100644 --- a/fabric/mc1214/build.gradle.kts +++ b/fabric/mc1214/build.gradle.kts @@ -1,25 +1,9 @@ -plugins { - alias(libs.plugins.fabric.loom) -} - -repositories { - maven("https://repo.codemc.io/repository/maven-snapshots/") - maven { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } -} - val minecraft_version: String by project val parchment_minecraft_version: String by project val parchment_mappings: String by project -val loader_version: String by project dependencies { compileOnly(libs.bundles.adventure) - compileOnly(project(":api")) - compileOnly(project(":netty-common")) - compileOnly(project(":fabric", configuration = "namedElements")) compileOnly(project(":fabric:mc1211", configuration = "namedElements")) // To change the versions, see the gradle.properties file @@ -28,17 +12,6 @@ dependencies { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) - - modImplementation("net.fabricmc:fabric-loader:$loader_version") -} - -tasks { - withType { - val targetJavaVersion = 17 - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { - options.release = targetJavaVersion - } - } } loom { @@ -51,9 +24,4 @@ loom { } accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() .resolve("${rootProject.name}.accesswidener") -} - - -tasks.compileJava { - options.release.set(17) } \ No newline at end of file diff --git a/fabric/mc1214/gradle.properties b/fabric/mc1214/gradle.properties index c623cf837..85a8363ff 100644 --- a/fabric/mc1214/gradle.properties +++ b/fabric/mc1214/gradle.properties @@ -6,5 +6,4 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop minecraft_version=1.21.4 parchment_mappings=2025.02.16 -parchment_minecraft_version=1.21.4 -loader_version=0.15.11 \ No newline at end of file +parchment_minecraft_version=1.21.4 \ No newline at end of file diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java index 598da55b5..a8cd82990 100644 --- a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java +++ b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java @@ -18,6 +18,6 @@ public void initialize(ChainLoadData chainLoadData) { @Override public ServerVersion getNativeVersion() { - return ServerVersion.V_1_21_4; + return ServerVersion.V_1_21_1; } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java b/fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java similarity index 91% rename from fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java rename to fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java index 84acbca4b..d0852d039 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java +++ b/fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java @@ -18,10 +18,8 @@ package io.github.retrooper.packetevents; -import com.github.retrooper.packetevents.PacketEvents; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; public class PacketEventsClientMod { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java similarity index 93% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java rename to fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java index 9e56f9750..3ee72c4d3 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java +++ b/fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java @@ -20,7 +20,6 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.settings.PacketEventsSettings; -import io.github.retrooper.packetevents.PacketEventsClientMod; import net.fabricmc.api.EnvType; /** @@ -28,7 +27,7 @@ * and preferable jar-in-jar the packetevents fabric platform. *

* If you still want to create your own packetevents instance, which is not - * recommended, use {@link PacketEventsClientMod#constructApi(String)} or + * recommended, use {@link io.github.retrooper.packetevents.PacketEventsClientMod#constructApi(String)} or * {@link io.github.retrooper.packetevents.PacketEventsServerMod#constructApi(String)}. * * @deprecated flawed concept and doesn't support both client and server diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java new file mode 100644 index 000000000..428abb5f0 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java @@ -0,0 +1,20 @@ +package io.github.retrooper.packetevents.manager; + +import me.fallenbreath.conditionalmixin.api.mixin.RestrictiveMixinConfigPlugin; + +import java.util.List; +import java.util.Set; + +public class PacketEventsMixinManager extends RestrictiveMixinConfigPlugin { + @Override public String getRefMapperConfig() { + return ""; + } + + @Override public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override public List getMixins() { + return List.of(); + } +} diff --git a/netty-common/build.gradle.kts b/netty-common/build.gradle.kts index d8db1ca10..bab0850c0 100644 --- a/netty-common/build.gradle.kts +++ b/netty-common/build.gradle.kts @@ -1,9 +1,8 @@ plugins { - packetevents.`shadow-conventions` packetevents.`library-conventions` } dependencies { compileOnly(libs.netty) - shadow(project(":api", "shadow")) + implementation(project(":api", "shadow")) } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 0f329bd5e..73f016971 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,6 +35,7 @@ include("velocity") include("sponge") include("fabric") include(":fabric:mc1201") +include(":fabric:mc1202") include(":fabric:mc1211") include(":fabric:mc1214") // Patch modules From 154e4ff5b1eb579c1bf7fb6a6f489d0f6a559eb4 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 29 Mar 2025 00:39:09 -0400 Subject: [PATCH 26/43] Reduce Fabric jar size even further - Use mixins that match to multiple versions even across changing method signatures --- fabric/build.gradle.kts | 49 +++++------ fabric/mc1201/build.gradle.kts | 14 --- .../mc1201/mixin/ConnectionMixin.java | 17 ++-- .../mc1201/mixin/PlayerListMixin.java | 32 ++----- .../mc1201/mixin/PlayerListRespawnMixin.java | 36 ++++++++ .../resources/packetevents-mc1201.mixins.json | 3 +- fabric/mc1202/build.gradle.kts | 13 --- .../mc1202/mixin/ConnectionMixin.java | 64 -------------- .../mc1202/mixin/PlayerListMixin.java | 73 ---------------- .../mc1202/mixin/PlayerListRespawnMixin.java | 14 ++- .../resources/packetevents-mc1202.mixins.json | 2 - fabric/mc1211/build.gradle.kts | 13 --- .../mc1211/mixin/ConnectionMixin.java | 59 ------------- .../resources/packetevents-mc1211.mixins.json | 1 - fabric/mc1214/build.gradle.kts | 13 --- .../packetevents/PacketEventsMod.java | 86 ++++--------------- 16 files changed, 101 insertions(+), 388 deletions(-) create mode 100644 fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java delete mode 100644 fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java delete mode 100644 fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java delete mode 100644 fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index cdf5efdfe..fd37e8c9c 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -58,11 +58,35 @@ allprojects { } } + remapJar { + archiveBaseName = "${rootProject.name}-fabric${if (project.name != "fabric") "-${project.name}" else ""}" + archiveVersion = rootProject.ext["versionNoHash"] as String + } + remapSourcesJar { archiveVersion = rootProject.ext["versionNoHash"] as String } } + loom { + mixin { + // Replaces strings in annotations instead of using refmap + // This allows us to write mixins that target methodName* and have them work across versions + // Even as the signature changes without having to use @Dynamic and intermeediary names + // This preserves some compile-time safety, reduces jar size but be careful to not inject into wrong methods + useLegacyMixinAp = false + } + splitEnvironmentSourceSets() + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } + accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() + .resolve("${rootProject.name}.accesswidener") + } + apply(plugin = "idea") idea { module { @@ -81,12 +105,8 @@ subprojects { compileOnly(project(":fabric", configuration = "namedElements")) } + // version replacement already processed by packetevents.`library-conventions` tasks { - remapJar { - archiveBaseName = "${rootProject.name}-fabric-${project.name}" - archiveVersion = rootProject.ext["versionNoHash"] as String - } - processResources { inputs.property("version", project.version) filesMatching("fabric.mod.json") { @@ -96,25 +116,6 @@ subprojects { } } -tasks { - remapJar { - archiveBaseName = "${rootProject.name}-fabric" - archiveVersion = rootProject.ext["versionNoHash"] as String - } -} - -loom { - splitEnvironmentSourceSets() - mods { - register("packetevents") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } - accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() - .resolve("${rootProject.name}.accesswidener") -} - subprojects.forEach { tasks.named("remapJar").configure { dependsOn("${it.path}:remapJar") diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts index bf8989616..fa098c109 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1201/build.gradle.kts @@ -3,24 +3,10 @@ val parchment_minecraft_version: String by project val parchment_mappings: String by project dependencies { - implementation(libs.bundles.adventure) - // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") mappings(loom.layered { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) -} - -loom { - splitEnvironmentSourceSets() - mods { - register("packetevents-mc1201") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } - accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() - .resolve("${rootProject.name}.accesswidener") } \ No newline at end of file diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java index 2b768058a..8a5b5f755 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java @@ -18,30 +18,27 @@ package io.github.retrooper.packetevents.mc1201.mixin; +import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.ChannelPipeline; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.protocol.PacketFlow; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Restriction( - require = { - @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), - } -) @Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via public class ConnectionMixin { @Inject( - method = "configureSerialization", - at = @At("TAIL") + method = "configureSerialization*", + at = @At("TAIL"), + require = 1 ) private static void configureSerialization( - ChannelPipeline pipeline, PacketFlow flow, CallbackInfo ci + CallbackInfo ci, + @Local(ordinal = 0, argsOnly = true) ChannelPipeline pipeline, + @Local(ordinal = 0, argsOnly = true) PacketFlow flow ) { FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java index f3c0f71ac..3ebc0d8e5 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java @@ -19,10 +19,8 @@ package io.github.retrooper.packetevents.mc1201.mixin; import com.github.retrooper.packetevents.PacketEvents; +import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import io.netty.channel.Channel; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.Connection; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; @@ -30,13 +28,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Restriction( - require = { - @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), - } -) @Mixin(PlayerList.class) public abstract class PlayerListMixin { @@ -48,8 +40,9 @@ public abstract class PlayerListMixin { at = @At("HEAD") ) private void preNewPlayerPlace( - Connection connection, ServerPlayer player, - CallbackInfo ci + CallbackInfo ci, + @Local(ordinal = 0, argsOnly = true) Connection connection, + @Local(ordinal = 0, argsOnly = true) ServerPlayer player ) { PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); } @@ -66,22 +59,9 @@ private void preNewPlayerPlace( ) ) private void onPlayerLogin( - Connection connection, ServerPlayer player, - CallbackInfo ci + CallbackInfo ci, + @Local(ordinal = 0, argsOnly = true) ServerPlayer player ) { FabricInjectionUtil.fireUserLoginEvent(player); } - - /** - * @reason Minecraft creates a new player instance on respawn - */ - @Inject( - method = "respawn", - at = @At("RETURN") - ) - private void postRespawn(CallbackInfoReturnable cir) { - ServerPlayer player = cir.getReturnValue(); - Channel channel = player.connection.connection.channel; - PacketEvents.getAPI().getInjector().setPlayer(channel, player); - } } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java new file mode 100644 index 000000000..b26b217ab --- /dev/null +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java @@ -0,0 +1,36 @@ +package io.github.retrooper.packetevents.mc1201.mixin; + +import com.github.retrooper.packetevents.PacketEvents; +import io.netty.channel.Channel; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), + } +) +@Mixin(PlayerList.class) +public class PlayerListRespawnMixin { + /** Handles grabbing new player object on respawns for 1.20.1-, a separate mixin is required + * because the location of the field player.connection.connection changes + * from inheritance ServerGamePacketListenerImpl -> ServerCommonPacketListenerImpl thus breaking intermediary compatability + * + * @reason Minecraft creates a new player instance on respawn + */ + @Inject( + method = "respawn", + at = @At("RETURN") + ) + private void postRespawn(CallbackInfoReturnable cir) { + ServerPlayer player = cir.getReturnValue(); + Channel channel = player.connection.connection.channel; + PacketEvents.getAPI().getInjector().setPlayer(channel, player); + } +} diff --git a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json index 70f8f9362..45b3cc644 100644 --- a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json +++ b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json @@ -8,7 +8,8 @@ ], "mixins": [ "ConnectionMixin", - "PlayerListMixin" + "PlayerListMixin", + "PlayerListRespawnMixin" ], "injectors": { "defaultRequire": 1 diff --git a/fabric/mc1202/build.gradle.kts b/fabric/mc1202/build.gradle.kts index 78c499a00..b8539e152 100644 --- a/fabric/mc1202/build.gradle.kts +++ b/fabric/mc1202/build.gradle.kts @@ -3,7 +3,6 @@ val parchment_minecraft_version: String by project val parchment_mappings: String by project dependencies { - implementation(libs.bundles.adventure) compileOnly(project(":fabric:mc1201", configuration = "namedElements")) // To change the versions, see the gradle.properties file @@ -12,16 +11,4 @@ dependencies { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) -} - -loom { - splitEnvironmentSourceSets() - mods { - register("packetevents-mc1201") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } - accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() - .resolve("${rootProject.name}.accesswidener") } \ No newline at end of file diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java deleted file mode 100644 index f0b155554..000000000 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/ConnectionMixin.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1202.mixin; - -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.UserConnectEvent; -import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; -import com.github.retrooper.packetevents.protocol.ConnectionState; -import com.github.retrooper.packetevents.protocol.PacketSide; -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 com.github.retrooper.packetevents.util.PacketEventsImplHelper; -import io.github.retrooper.packetevents.handler.PacketDecoder; -import io.github.retrooper.packetevents.handler.PacketEncoder; -import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelPipeline; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.SharedConstants; -import net.minecraft.network.BandwidthDebugMonitor; -import net.minecraft.network.protocol.PacketFlow; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Restriction( - require = { - @Condition(value = "minecraft", versionPredicates = {">=1.20.2 <1.20.5"}), - } -) -@Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via -public class ConnectionMixin { - - @Inject( - method = "configureSerialization", - at = @At("RETURN") - ) - private static void configureSerialization( - ChannelPipeline pipeline, PacketFlow flow, BandwidthDebugMonitor bandwithMonitor, CallbackInfo ci - ) { - FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); - } -} diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java deleted file mode 100644 index f19577a11..000000000 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListMixin.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1202.mixin; - -import com.github.retrooper.packetevents.PacketEvents; -import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.network.Connection; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.CommonListenerCookie; -import net.minecraft.server.players.PlayerList; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Restriction( - require = { - @Condition(value = "minecraft", versionPredicates = {">=1.20.2"}), - } -) -@Mixin(PlayerList.class) -public class PlayerListMixin { - - /** - * @reason Associate connection instance with player instance - */ - @Inject( - method = "placeNewPlayer", - at = @At("HEAD") - ) - private void preNewPlayerPlace( - Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci - ) { - PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); - } - - /** - * @reason Associate connection instance with player instance and handle login event - */ - @Inject( - method = "placeNewPlayer", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V", - shift = At.Shift.AFTER - ) - ) - private void onPlayerLogin( - Connection connection, ServerPlayer player, - CommonListenerCookie cookie, CallbackInfo ci - ) { - FabricInjectionUtil.fireUserLoginEvent(player); - } -} diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java index ff98dd050..985363a8d 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java @@ -4,7 +4,6 @@ import io.netty.channel.Channel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; -import org.spongepowered.asm.mixin.Dynamic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -12,17 +11,16 @@ @Mixin(PlayerList.class) public class PlayerListRespawnMixin { - /** + /** Handles grabbing new player object on respawns for 1.20.2+, a separate mixin is required + * because the location of the field player.connection.connection changes + * from inheritance ServerGamePacketListenerImpl <- ServerCommonPacketListenerImpl thus breaking intermediary compatability + * * @reason Minecraft creates a new player instance on respawn */ - // Intermediary name for respawnPlayer() is method_14556 - // We use this and disable remapping because the method signature changes in 1.21 - // This allows the same code to inject into (in theory) very version and - @Dynamic @Inject( - method = "method_14556*", + method = "respawn*", at = @At("RETURN"), - remap = false + require = 1 ) private void postRespawn(CallbackInfoReturnable cir) { ServerPlayer player = cir.getReturnValue(); diff --git a/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json b/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json index 9d832b44b..ef940b092 100644 --- a/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json +++ b/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json @@ -4,8 +4,6 @@ "package": "io.github.retrooper.packetevents.mc1202.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "ConnectionMixin", - "PlayerListMixin", "PlayerListRespawnMixin" ], "injectors": { diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 25f1387ac..8bdc1a569 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -3,7 +3,6 @@ val parchment_minecraft_version: String by project val parchment_mappings: String by project dependencies { - compileOnly(libs.bundles.adventure) compileOnly(project(":fabric:mc1202", configuration = "namedElements")) compileOnly(project(":fabric:mc1201", configuration = "namedElements")) @@ -13,16 +12,4 @@ dependencies { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) -} - -loom { - splitEnvironmentSourceSets() - mods { - register("packetevents-mc1211") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } - accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() - .resolve("${rootProject.name}.accesswidener") } \ No newline at end of file diff --git a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java b/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java deleted file mode 100644 index d62155d6f..000000000 --- a/fabric/mc1211/src/main/java/io/github/retrooper/packetevents/mc1211/mixin/ConnectionMixin.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1211.mixin; - -import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPipeline; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.network.BandwidthDebugMonitor; -import net.minecraft.network.protocol.PacketFlow; -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; - -@Restriction( - require = { - @Condition(value = "minecraft", versionPredicates = {">=1.20.5"}), - } -) -@Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via -public abstract class ConnectionMixin { - - @Shadow public abstract void channelActive(ChannelHandlerContext channelHandlerContext) - throws Exception; - - @Shadow public abstract void channelInactive(ChannelHandlerContext channelHandlerContext); - - @Shadow protected abstract void flush(); - - @Inject( - method = "configureSerialization", - at = @At("RETURN") - ) - private static void configureSerialization( - ChannelPipeline pipeline, PacketFlow flow, boolean memoryOnly, - BandwidthDebugMonitor bandwithDebugMonitor, CallbackInfo ci - ) { - FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); - } -} \ No newline at end of file diff --git a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json index 965ac10bb..9ce82718e 100644 --- a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json +++ b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json @@ -7,7 +7,6 @@ "ClientPacketListenerMixin" ], "mixins": [ - "ConnectionMixin" ], "injectors": { "defaultRequire": 1 diff --git a/fabric/mc1214/build.gradle.kts b/fabric/mc1214/build.gradle.kts index ead5fc57f..9926d7f42 100644 --- a/fabric/mc1214/build.gradle.kts +++ b/fabric/mc1214/build.gradle.kts @@ -3,7 +3,6 @@ val parchment_minecraft_version: String by project val parchment_mappings: String by project dependencies { - compileOnly(libs.bundles.adventure) compileOnly(project(":fabric:mc1211", configuration = "namedElements")) // To change the versions, see the gradle.properties file @@ -12,16 +11,4 @@ dependencies { officialMojangMappings() parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") }) -} - -loom { - splitEnvironmentSourceSets() - mods { - register("packetevents-mc1214") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } - accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() - .resolve("${rootProject.name}.accesswidener") } \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 300fa94dd..099c01c3b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -20,7 +20,6 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; -import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPIManagerFactory; import io.github.retrooper.packetevents.loader.ChainLoadData; @@ -28,16 +27,11 @@ import io.github.retrooper.packetevents.manager.registry.FabricItemRegistry; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import io.github.retrooper.packetevents.util.LazyHolder; -import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.TreeMap; public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { @@ -49,40 +43,35 @@ public void onPreLaunch() { INSTANCE = this; FabricLoader loader = FabricLoader.getInstance(); - String chainLoadEntryPointName = null; - String clientChainLoadEntryPointName = null; // For client-specific entrypoints + String chainLoadEntryPointName = "mainChainLoad"; + String clientChainLoadEntryPointName = "clientChainLoad"; // For client-specific entrypoints + + // Collect mainChainLoad entrypoints (always present) and sort by version + List mainChainLoadEntryPoints = loader.getEntrypoints(chainLoadEntryPointName, ChainLoadEntryPoint.class); + mainChainLoadEntryPoints.sort((a, b) -> b.getNativeVersion().getProtocolVersion() - a.getNativeVersion().getProtocolVersion()); + + List allEntryPoints; switch (loader.getEnvironmentType()) { case CLIENT -> { - chainLoadEntryPointName = "mainChainLoad"; - clientChainLoadEntryPointName = "clientChainLoad"; + // Collect clientChainLoad entrypoints (only on client, might be empty) and sort by version then append main entry points + List clientChainLoadEntryPoints = loader.getEntrypoints(clientChainLoadEntryPointName, ChainLoadEntryPoint.class); + clientChainLoadEntryPoints.sort((a, b) -> b.getNativeVersion().getProtocolVersion() - a.getNativeVersion().getProtocolVersion()); + clientChainLoadEntryPoints.addAll(mainChainLoadEntryPoints); + + // 1.21.1 Client -> 1.20.1 Client -> 1.21.4 Main -> 1.21.1 Main -> 1.20.1 Main + allEntryPoints = clientChainLoadEntryPoints; } case SERVER -> { - chainLoadEntryPointName = "mainChainLoad"; + // 1.21.4 Main -> 1.21.1 Main -> 1.20.1 Main + allEntryPoints = mainChainLoadEntryPoints; } - } - - // Collect mainChainLoad entrypoints (always present) - List mainChainLoadEntryPoints = loader.getEntrypoints(chainLoadEntryPointName, ChainLoadEntryPoint.class); - - // Collect clientChainLoad entrypoints (only on client, might be empty) - List clientChainLoadEntryPoints = loader.getEnvironmentType() == EnvType.CLIENT - ? loader.getEntrypoints(clientChainLoadEntryPointName, ChainLoadEntryPoint.class) - : Collections.emptyList(); - - // If on client, interleave the entrypoints; otherwise, use only mainChainLoad - List allEntryPoints; - if (loader.getEnvironmentType() == EnvType.SERVER) { - allEntryPoints = interleaveEntryPoints(mainChainLoadEntryPoints, clientChainLoadEntryPoints); - } else { - allEntryPoints = new ArrayList<>(mainChainLoadEntryPoints); - // Sort mainChainLoad entrypoints by version (newest first) - allEntryPoints.sort((a, b) -> b.getNativeVersion().getProtocolVersion() - a.getNativeVersion().getProtocolVersion()); + default -> throw new IllegalStateException("Unexpected value: " + loader.getEnvironmentType()); } // Initialize single chainload data instance ChainLoadData chainLoadData = new ChainLoadData(); - // Execute all entrypoints in the sorted, interleaved order using the same ChainLoadData instance + // Execute all entrypoints using the same ChainLoadData instance for (ChainLoadEntryPoint chainLoadEntryPoint : allEntryPoints) { try { chainLoadEntryPoint.initialize(chainLoadData); @@ -107,43 +96,6 @@ public void onPreLaunch() { PacketEvents.getAPI().load(); } - /** - * Interleaves mainChainLoad and clientChainLoad entrypoints, sorting by version (newest first). - * If a clientChainLoad entrypoint is missing for a version, only the mainChainLoad entrypoint is included. - * @param mainEntryPoints List of mainChainLoad entrypoints - * @param clientEntryPoints List of clientChainLoad entrypoints - * @return Interleaved and sorted list of entrypoints - */ - private List interleaveEntryPoints( - List mainEntryPoints, - List clientEntryPoints - ) { - // Use a TreeMap to group entrypoints by version, sorted newest first - Map> versionToEntryPoints = new TreeMap<>( - (v1, v2) -> v2.getProtocolVersion() - v1.getProtocolVersion() - ); - - // Populate the map with mainChainLoad entrypoints - for (ChainLoadEntryPoint mainEntry : mainEntryPoints) { - versionToEntryPoints.computeIfAbsent(mainEntry.getNativeVersion(), k -> new ArrayList<>(2)) - .add(mainEntry); - } - - // Add clientChainLoad entrypoints to the same version buckets - for (ChainLoadEntryPoint clientEntry : clientEntryPoints) { - versionToEntryPoints.computeIfAbsent(clientEntry.getNativeVersion(), k -> new ArrayList<>(2)) - .add(0, clientEntry); // Insert client entrypoint before main entrypoint - } - - // Flatten the map into a single list, preserving version order and interleaving - List interleaved = new ArrayList<>(mainEntryPoints.size() + clientEntryPoints.size()); - for (List entryPoints : versionToEntryPoints.values()) { - interleaved.addAll(entryPoints); - } - - return interleaved; - } - @Override public void onInitialize() { PacketEventsAPI api = PacketEvents.getAPI(); From c84ba36a0bfd81fab6c25611a81582999977e610 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:08:39 -0400 Subject: [PATCH 27/43] Performance improvements and full client-side support (Integrated server) - Rebase on top of LazyLoading patches - Now support 1.20.1-1.21.4 Server, Client (Client-side on external server and on internal server/singleplayer) --- .../Fabric1201ClientChainLoadEntrypoint.java | 3 +- .../mixin/ClientPacketListenerMixin.java | 5 +- .../mc1201/Fabric1201ChainLoadEntrypoint.java | 6 ++ .../mc1201/mixin/PlayerListMixin.java | 8 +- .../mc1201/mixin/PlayerListRespawnMixin.java | 5 +- .../registry/Fabric1201ItemRegistry.java} | 4 +- .../mc1202/mixin/PlayerListRespawnMixin.java | 3 +- .../Fabric1211ClientChainLoadEntrypoint.java | 4 +- .../mixin/ClientPacketListenerMixin.java | 75 ------------------- .../resources/packetevents-mc1211.mixins.json | 3 - .../packetevents/PacketEventsMod.java | 24 +++--- .../factory/fabric/FabricChannelInjector.java | 8 +- .../factory/fabric/FabricPacketEventsAPI.java | 48 ++++++++++-- .../FabricPacketEventsAPIManagerFactory.java | 11 ++- .../packetevents/handler/PacketDecoder.java | 2 +- .../packetevents/loader/ChainLoadData.java | 11 +++ .../manager/FabricProtocolManager.java | 74 +++++++++++++++++- .../manager/InternalFabricPacketListener.java | 4 +- .../util/FabricInjectionUtil.java | 27 +++---- .../util/viaversion/ViaVersionAccessor.java | 8 -- .../viaversion/ViaVersionAccessorImpl.java | 35 +-------- .../util/viaversion/ViaVersionUtil.java | 49 ++++++------ 22 files changed, 213 insertions(+), 204 deletions(-) rename fabric/{src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java => mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java} (84%) delete mode 100644 fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java index 270c0495f..09f20660a 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java @@ -8,7 +8,6 @@ public class Fabric1201ClientChainLoadEntrypoint extends Fabric1201ChainLoadEntr @Override public void initialize(ChainLoadData chainLoadData) { - super.playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1201ClientPlayerManager::new); - super.initialize(chainLoadData); + chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(Fabric1201ClientPlayerManager::new)); } } diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java index 659b8ac6e..f784a20c5 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java @@ -20,6 +20,7 @@ import com.github.retrooper.packetevents.PacketEvents; import com.llamalad7.mixinextras.sugar.Local; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; @@ -52,7 +53,7 @@ public abstract class ClientPacketListenerMixin implements TickablePacketListene ) ) private void postLoginPlayerConstruct(CallbackInfo ci) { - PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, Minecraft.getInstance().player); + FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.getConnection().channel, Minecraft.getInstance().player); } /** @@ -67,6 +68,6 @@ private void postLoginPlayerConstruct(CallbackInfo ci) { ) ) private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) LocalPlayer player) { - PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, player); + FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.getConnection().channel, player); } } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java index 7628f8698..315557bb5 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java @@ -1,6 +1,8 @@ package io.github.retrooper.packetevents.mc1201; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; +import io.github.retrooper.packetevents.mc1201.registry.Fabric1201ItemRegistry; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; @@ -14,6 +16,10 @@ public class Fabric1201ChainLoadEntrypoint implements ChainLoadEntryPoint { @Override public void initialize(ChainLoadData chainLoadData) { chainLoadData.setPlayerManagerIfNull(playerManagerAbstractLazyHolder); + // Set default registry manager if not already set by any entrypoint + chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> new FabricRegistryManager( + new Fabric1201ItemRegistry() + ))); } @Override diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java index 3ebc0d8e5..4a2db8fac 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java @@ -18,8 +18,8 @@ package io.github.retrooper.packetevents.mc1201.mixin; -import com.github.retrooper.packetevents.PacketEvents; import com.llamalad7.mixinextras.sugar.Local; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.util.FabricInjectionUtil; import net.minecraft.network.Connection; import net.minecraft.server.level.ServerPlayer; @@ -36,7 +36,7 @@ public abstract class PlayerListMixin { * @reason Associate connection instance with player instance */ @Inject( - method = "placeNewPlayer", + method = "placeNewPlayer*", at = @At("HEAD") ) private void preNewPlayerPlace( @@ -44,14 +44,14 @@ private void preNewPlayerPlace( @Local(ordinal = 0, argsOnly = true) Connection connection, @Local(ordinal = 0, argsOnly = true) ServerPlayer player ) { - PacketEvents.getAPI().getInjector().setPlayer(connection.channel, player); + FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(connection.channel, player); } /** * @reason Associate connection instance with player instance and handle login event */ @Inject( - method = "placeNewPlayer", + method = "placeNewPlayer*", at = @At( value = "INVOKE", target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V", diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java index b26b217ab..42f762bbb 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java @@ -1,6 +1,7 @@ package io.github.retrooper.packetevents.mc1201.mixin; import com.github.retrooper.packetevents.PacketEvents; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.netty.channel.Channel; import me.fallenbreath.conditionalmixin.api.annotation.Condition; import me.fallenbreath.conditionalmixin.api.annotation.Restriction; @@ -25,12 +26,12 @@ public class PlayerListRespawnMixin { * @reason Minecraft creates a new player instance on respawn */ @Inject( - method = "respawn", + method = "respawn*", at = @At("RETURN") ) private void postRespawn(CallbackInfoReturnable cir) { ServerPlayer player = cir.getReturnValue(); Channel channel = player.connection.connection.channel; - PacketEvents.getAPI().getInjector().setPlayer(channel, player); + FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(channel, player); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java similarity index 84% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java rename to fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java index c0fdcc1e1..ca4556cf3 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricItemRegistry.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents.manager.registry; +package io.github.retrooper.packetevents.mc1201.registry; import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; @@ -10,7 +10,7 @@ import java.util.Optional; -public class FabricItemRegistry implements ItemRegistry { +public class Fabric1201ItemRegistry implements ItemRegistry { @Override public @Nullable ItemType getByName(String name) { diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java index 985363a8d..da5ab9b6d 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java @@ -1,6 +1,7 @@ package io.github.retrooper.packetevents.mc1202.mixin; import com.github.retrooper.packetevents.PacketEvents; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.netty.channel.Channel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; @@ -25,7 +26,7 @@ public class PlayerListRespawnMixin { private void postRespawn(CallbackInfoReturnable cir) { ServerPlayer player = cir.getReturnValue(); Channel channel = player.connection.connection.channel; - PacketEvents.getAPI().getInjector().setPlayer(channel, player); + FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(channel, player); } } diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java index 47029c120..38c00d6ed 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java @@ -9,11 +9,9 @@ public class Fabric1211ClientChainLoadEntrypoint implements ChainLoadEntryPoint { - private final LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1211ClientPlayerManager::new); - @Override public void initialize(ChainLoadData chainLoadData) { - chainLoadData.setPlayerManagerIfNull(playerManagerAbstractLazyHolder); + chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(Fabric1211ClientPlayerManager::new)); } @Override diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java deleted file mode 100644 index 034291b9c..000000000 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/mixin/ClientPacketListenerMixin.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1211.mixin; - -import com.github.retrooper.packetevents.PacketEvents; -import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.client.multiplayer.CommonListenerCookie; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.Connection; -import org.objectweb.asm.Opcodes; -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; - -@Mixin(ClientPacketListener.class) -public abstract class ClientPacketListenerMixin extends ClientCommonPacketListenerImpl { - - @Shadow public abstract Connection getConnection(); - - public ClientPacketListenerMixin(Minecraft minecraft, Connection connection, CommonListenerCookie cookie) { - super(minecraft, connection, cookie); // dummy ctor - } - - /** - * @reason Associate connection instance with player instance - */ - @Inject( - method = "handleLogin", - at = @At( - value = "FIELD", - opcode = Opcodes.PUTFIELD, - target = "Lnet/minecraft/client/Minecraft;player:Lnet/minecraft/client/player/LocalPlayer;", - shift = At.Shift.AFTER - ) - ) - private void postLoginPlayerConstruct(CallbackInfo ci) { - PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, this.minecraft.player); - } - - /** - * @reason Minecraft creates a new player instance on respawn - */ - @Inject( - method = "handleRespawn", - at = @At( - // inject immediately after new player instance has been created - value = "INVOKE", - target = "Lnet/minecraft/client/multiplayer/ClientPacketListener;startWaitingForNewLevel(Lnet/minecraft/client/player/LocalPlayer;Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/gui/screens/ReceivingLevelScreen$Reason;)V" - ) - ) - private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) LocalPlayer player) { - PacketEvents.getAPI().getInjector().setPlayer(this.getConnection().channel, player); - } -} diff --git a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json index 9ce82718e..6727d618e 100644 --- a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json +++ b/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json @@ -3,9 +3,6 @@ "minVersion": "0.8", "package": "io.github.retrooper.packetevents.mc1211.mixin", "compatibilityLevel": "JAVA_17", - "client": [ - "ClientPacketListenerMixin" - ], "mixins": [ ], "injectors": { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 099c01c3b..3de037e67 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -24,9 +24,7 @@ import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPIManagerFactory; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; -import io.github.retrooper.packetevents.manager.registry.FabricItemRegistry; -import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; -import io.github.retrooper.packetevents.util.LazyHolder; +import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; @@ -83,17 +81,24 @@ public void onPreLaunch() { } } - // Set default registry manager if not already set by any entrypoint - chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> new FabricRegistryManager( - new FabricItemRegistry() - ))); - // Ordinarily I wouldn't be using a static here but since we need to maintain compile-time backwards compatibility // We need to preserve the ABI of FactoryPacketEventsAPI and do this static awfulness FabricPacketEventsAPIManagerFactory.init(chainLoadData); - PacketEvents.setAPI(new FabricPacketEventsAPI(PacketEventsMod.MOD_ID, loader.getEnvironmentType())); + FabricPacketEventsAPI fabricPacketEventsAPI = new FabricPacketEventsAPI(PacketEventsMod.MOD_ID, loader.getEnvironmentType()); + + PacketEvents.setAPI(fabricPacketEventsAPI); PacketEvents.getAPI().load(); + + switch (loader.getEnvironmentType()) { + case CLIENT -> { + FabricPacketEventsAPI.setClientAPI(fabricPacketEventsAPI); + FabricPacketEventsAPI fabricServerPacketEventsAPI = new FabricPacketEventsAPI(PacketEventsMod.MOD_ID, EnvType.SERVER); + FabricPacketEventsAPI.setServerAPI(fabricPacketEventsAPI); + fabricServerPacketEventsAPI.load(); + } + case SERVER -> FabricPacketEventsAPI.setServerAPI(fabricPacketEventsAPI); + } } @Override @@ -102,5 +107,6 @@ public void onInitialize() { if (api != null) { api.init(); } + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) FabricPacketEventsAPI.getClientAPI().init(); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java index 0a9570148..9a90ab40f 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java @@ -36,8 +36,10 @@ public class FabricChannelInjector implements ChannelInjector { private final PacketSide packetSide; + private final FabricPacketEventsAPI fabricPacketEventsAPI; - public FabricChannelInjector(EnvType environment) { + public FabricChannelInjector(FabricPacketEventsAPI fabricPacketEventsAPI, EnvType environment) { + this.fabricPacketEventsAPI = fabricPacketEventsAPI; this.packetSide = switch (environment) { case SERVER -> PacketSide.SERVER; case CLIENT -> PacketSide.CLIENT; @@ -67,7 +69,7 @@ public boolean isPlayerSet(Object ch) { @Override public void updateUser(Object channel, User user) { - if (!PacketEvents.getAPI().getProtocolManager().hasChannel(channel)) { + if (!fabricPacketEventsAPI.getProtocolManager().hasChannel(channel)) { return; // this channel isn't injected by packetevents } Channel ch = (Channel) channel; @@ -77,7 +79,7 @@ public void updateUser(Object channel, User user) { @Override public void setPlayer(Object channel, Object player) { - if (!PacketEvents.getAPI().getProtocolManager().hasChannel(channel)) { + if (!fabricPacketEventsAPI.getProtocolManager().hasChannel(channel)) { return; // this channel isn't injected by packetevents } Channel ch = (Channel) channel; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 610a1c68e..7d297d600 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -26,6 +26,7 @@ import com.github.retrooper.packetevents.manager.registry.RegistryManager; import com.github.retrooper.packetevents.manager.server.ServerManager; import com.github.retrooper.packetevents.netty.NettyManager; +import com.github.retrooper.packetevents.protocol.PacketSide; import com.github.retrooper.packetevents.protocol.packettype.PacketType; import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import com.github.retrooper.packetevents.settings.PacketEventsSettings; @@ -36,6 +37,7 @@ import io.github.retrooper.packetevents.manager.FabricProtocolManager; import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; +import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import org.slf4j.Logger; @@ -44,7 +46,6 @@ import java.util.Locale; public class FabricPacketEventsAPI extends PacketEventsAPI { - private static final Logger LOGGER = LoggerFactory.getLogger("PacketEvents"); private final String modId; @@ -61,17 +62,16 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private boolean initialized; private boolean terminated; - public FabricPacketEventsAPI(String modId, EnvType environment) { - this(modId, environment, new PacketEventsSettings()); - } + private static FabricPacketEventsAPI serverFabricAPI; + private static FabricPacketEventsAPI clientFabricAPI; public FabricPacketEventsAPI(String modId, EnvType environment, PacketEventsSettings settings) { this.modId = modId; this.environment = environment; this.settings = settings; - this.protocolManager = new FabricProtocolManager(environment); + this.protocolManager = new FabricProtocolManager(this, environment); this.serverManager = this.constructServerManager(); - this.injector = new FabricChannelInjector(environment); + this.injector = new FabricChannelInjector(this, environment); } protected ServerManager constructServerManager() { @@ -119,9 +119,19 @@ public void init() { PacketType.Play.Client.load(); PacketType.Play.Server.load(); + + // Let people override this, at their own risk + if (!"true".equalsIgnoreCase(System.getenv("PE_IGNORE_INCOMPATIBILITY"))) { + checkCompatibility(); + } + this.initialized = true; } + private void checkCompatibility() { + ViaVersionUtil.checkIfViaIsPresent(); + } + @Override public boolean isInitialized() { return this.initialized; @@ -166,7 +176,7 @@ public LogManager getLogManager() { @Override public PlayerManager getPlayerManager() { - return FabricPacketEventsAPIManagerFactory.getLazyPlayerManagerHolder().get(); + return this.environment == EnvType.SERVER ? FabricPacketEventsAPIManagerFactory.getLazyPlayerManagerHolder().get() : FabricPacketEventsAPIManagerFactory.getClientLazyPlayerManagerHolder().get(); } @Override @@ -188,4 +198,28 @@ public NettyManager getNettyManager() { public RegistryManager getRegistryManager() { return FabricPacketEventsAPIManagerFactory.getLazyRegistryManagerHolder().get(); } + + public static FabricPacketEventsAPI getAPI(PacketSide pipelineSide) { + return pipelineSide == PacketSide.CLIENT ? clientFabricAPI : serverFabricAPI; + } + + public static void setClientAPI(FabricPacketEventsAPI fabricPacketEventsAPI) { + clientFabricAPI = fabricPacketEventsAPI; + } + + public static void setServerAPI(FabricPacketEventsAPI fabricPacketEventsAPI) { + serverFabricAPI = fabricPacketEventsAPI; + } + + public static FabricPacketEventsAPI getClientAPI() { + return clientFabricAPI; + } + + public static FabricPacketEventsAPI getServerAPI() { + return serverFabricAPI; + } + + public FabricPacketEventsAPI(String modId, EnvType environment) { + this(modId, environment, new PacketEventsSettings()); + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java index 447aa5633..33faed742 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java @@ -6,20 +6,27 @@ import io.github.retrooper.packetevents.loader.ChainLoadData; public class FabricPacketEventsAPIManagerFactory { - // TODO, refactor if booky and retrooper approve, bad design having settable static field, exists to maintain - // 100% backward compatability + // TODO, refactor if booky and retrooper approve, bad design having settable static field + // exists to maintain 100% backward compatability private static LazyHolder lazyPlayerManagerHolder = () -> null; + private static LazyHolder lazyClientPlayerManagerHolder = () -> null; private static LazyHolder registryManagerLazyHolder = () -> null; public static LazyHolder getLazyPlayerManagerHolder() { return lazyPlayerManagerHolder; } + + public static LazyHolder getClientLazyPlayerManagerHolder() { + return lazyClientPlayerManagerHolder; + } + public static LazyHolder getLazyRegistryManagerHolder() { return registryManagerLazyHolder; } public static void init(ChainLoadData chainLoadData) { FabricPacketEventsAPIManagerFactory.lazyPlayerManagerHolder = chainLoadData.getPlayerManagerAbstractLazyHolder(); + FabricPacketEventsAPIManagerFactory.lazyClientPlayerManagerHolder = chainLoadData.getClientPlayerManagerAbstractLazyHolder(); FabricPacketEventsAPIManagerFactory.registryManagerLazyHolder = chainLoadData.getRegistryManagerLazyHolder(); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 30842fc2c..09fdeaf22 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -65,7 +65,7 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc kryptonReorder = true; } if (evt.getClass().getName().equals("com.viaversion.fabric.common.handler.PipelineReorderEvent") || kryptonReorder) { - FabricInjectionUtil.reorderHandlers(ctx); + FabricInjectionUtil.reorderHandlers(ctx, side); } super.userEventTriggered(ctx, evt); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java index 0eea8824c..3b0cb6354 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java @@ -8,6 +8,7 @@ public class ChainLoadData { private LazyHolder registryManagerLazyHolder = null; private LazyHolder playerManagerAbstractLazyHolder = null; + private LazyHolder clientPlayerManagerAbstractLazyHolder = null; public void setRegistryManagerIfNull(LazyHolder registryManagerLazyHolder) { if (this.registryManagerLazyHolder == null) { @@ -28,4 +29,14 @@ public void setPlayerManagerIfNull(LazyHolder playerManag public LazyHolder getPlayerManagerAbstractLazyHolder() { return this.playerManagerAbstractLazyHolder; } + + public void setClientPlayerManagerIfNull(LazyHolder clientPlayerManagerAbstractLazyHolder) { + if (this.clientPlayerManagerAbstractLazyHolder == null) { + this.clientPlayerManagerAbstractLazyHolder = clientPlayerManagerAbstractLazyHolder; + } + } + + public LazyHolder getClientPlayerManagerAbstractLazyHolder() { + return this.clientPlayerManagerAbstractLazyHolder; + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java index 0864ec481..7761e5dae 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java @@ -18,17 +18,29 @@ package io.github.retrooper.packetevents.manager; +import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.netty.channel.ChannelHelper; import com.github.retrooper.packetevents.protocol.ProtocolVersion; +import com.github.retrooper.packetevents.protocol.player.User; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.impl.netty.manager.protocol.ProtocolManagerAbstract; import io.netty.buffer.ByteBuf; import net.fabricmc.api.EnvType; +import java.util.Collection; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + public class FabricProtocolManager extends ProtocolManagerAbstract { + private final Map channels = new ConcurrentHashMap<>(); + private final Map users = new ConcurrentHashMap<>(); private final boolean invert; + private final FabricPacketEventsAPI fabricPacketEventsAPI; - public FabricProtocolManager(EnvType environment) { + public FabricProtocolManager(FabricPacketEventsAPI fabricPacketEventsAPI, EnvType environment) { + this.fabricPacketEventsAPI = fabricPacketEventsAPI; this.invert = environment == EnvType.CLIENT; } @@ -88,7 +100,7 @@ public void writePacketSilently(Object channel, Object byteBuf) { @Override public void receivePacket(Object channel, Object byteBuf) { if (this.invert) { - // no way to specify wether to flush or not, so just don't + // no way to specify whether to flush or not, so just don't super.writePacket(channel, byteBuf); } else { this.receivePacket0(channel, byteBuf); @@ -98,10 +110,66 @@ public void receivePacket(Object channel, Object byteBuf) { @Override public void receivePacketSilently(Object channel, Object byteBuf) { if (this.invert) { - // no way to specify wether to flush or not, so just don't + // no way to specify whether to flush or not, so just don't super.writePacketSilently(channel, byteBuf); } else { super.receivePacketSilently(channel, byteBuf); } } + + @Override + public Collection getUsers() { + return users.values(); + } + + @Override + public Collection getChannels() { + return channels.values(); + } + + @Override + public Collection> getChannelEntries() { + return channels.entrySet(); + } + + @Override + public User getUser(Object channel) { + Object pipeline = ChannelHelper.getPipeline(channel); + return users.get(pipeline); + } + + @Override + public User removeUser(Object channel) { + Object pipeline = ChannelHelper.getPipeline(channel); + return users.remove(pipeline); + } + + @Override + public void setUser(Object channel, User user) { + synchronized (channel) { + Object pipeline = ChannelHelper.getPipeline(channel); + users.put(pipeline, user); + } + fabricPacketEventsAPI.getInjector().updateUser(channel, user); + } + + @Override + public Object getChannel(UUID uuid) { + return channels.get(uuid); + } + + @Override + public void setChannel(UUID uuid, Object channel) { + channels.put(uuid, channel); + } + + @Override + public void removeChannel(UUID uuid) { + channels.remove(uuid); + } + + @Override + public boolean hasChannel(Object channel) { + return channels.containsValue(channel); + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java index 74a44371d..33d030eed 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java @@ -10,6 +10,8 @@ import com.github.retrooper.packetevents.wrapper.handshaking.client.WrapperHandshakingClientHandshake; import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; +import java.nio.channels.Channel; + public class InternalFabricPacketListener extends com.github.retrooper.packetevents.manager.InternalPacketListener { @Override @@ -21,7 +23,7 @@ public void onPacketReceive(PacketReceiveEvent event) { ConnectionState state = packet.getNextConnectionState(); String feature; - if (ViaVersionUtil.isAvailable()) { + if (ViaVersionUtil.isAvailable(user)) { clientVersion = ClientVersion.getById(ViaVersionUtil.getProtocolVersion(user)); feature = "ViaVersion"; } else { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index 550f988f5..40f8d764d 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -12,6 +12,7 @@ import com.github.retrooper.packetevents.protocol.player.UserProfile; import com.github.retrooper.packetevents.util.FakeChannelUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.handler.PacketDecoder; import io.github.retrooper.packetevents.handler.PacketEncoder; import io.netty.channel.Channel; @@ -36,33 +37,27 @@ public static void injectAtPipelineBuilder(ChannelPipeline pipeline, PacketFlow case CLIENTBOUND -> PacketSide.CLIENT; case SERVERBOUND -> PacketSide.SERVER; }; - PacketSide apiSide = PacketEvents.getAPI().getInjector().getPacketSide(); - if (pipelineSide != apiSide) { - // if pipeline side doesn't match api side, don't inject into - // this pipeline - it probably means this is the pipeline from - // integrated server to minecraft client, which is currently unsupported - PacketEvents.getAPI().getLogManager().debug("Skipped pipeline injection on " + pipelineSide); - return; - } - PacketEvents.getAPI().getLogManager().debug("Game connected!"); + FabricPacketEventsAPI fabricPacketEventsAPI = FabricPacketEventsAPI.getAPI(pipelineSide); + fabricPacketEventsAPI.getLogManager().debug("Game connected!"); Channel channel = pipeline.channel(); User user = new User(channel, ConnectionState.HANDSHAKING, null, new UserProfile(null, null)); - ProtocolManager.USERS.put(channel.pipeline(), user); + + fabricPacketEventsAPI.getProtocolManager().setUser(channel, user); UserConnectEvent connectEvent = new UserConnectEvent(user); - PacketEvents.getAPI().getEventManager().callEvent(connectEvent); + fabricPacketEventsAPI.getEventManager().callEvent(connectEvent); if (connectEvent.isCancelled()) { channel.unsafe().closeForcibly(); return; } String decoderName = channel.pipeline().names().contains("inbound_config") ? "inbound_config" : "decoder"; - channel.pipeline().addBefore(decoderName, PacketEvents.DECODER_NAME, new PacketDecoder(apiSide, user)); + channel.pipeline().addBefore(decoderName, PacketEvents.DECODER_NAME, new PacketDecoder(pipelineSide, user)); String encoderName = channel.pipeline().names().contains("outbound_config") ? "outbound_config" : "encoder"; - channel.pipeline().addBefore(encoderName, PacketEvents.ENCODER_NAME, new PacketEncoder(apiSide, user)); + channel.pipeline().addBefore(encoderName, PacketEvents.ENCODER_NAME, new PacketEncoder(pipelineSide, user)); channel.closeFuture().addListener((ChannelFutureListener) future -> PacketEventsImplHelper.handleDisconnection(user.getChannel(), user.getUUID())); } @@ -75,7 +70,7 @@ public static void removeIfExists(ChannelPipeline pipeline, String handlerName) } // Shared method to reorder handlers after ViaVersion - public static void reorderHandlers(ChannelHandlerContext ctx) { + public static void reorderHandlers(ChannelHandlerContext ctx, PacketSide side) { ChannelPipeline pipeline = ctx.pipeline(); // Re-inject decoder handler @@ -106,11 +101,11 @@ public static void reorderHandlers(ChannelHandlerContext ctx) { } } - PacketEvents.getAPI().getLogManager().debug("Pipeline after reorder: " + pipeline.names()); + FabricPacketEventsAPI.getAPI(side).getLogManager().debug("Pipeline after reorder: " + pipeline.names()); } public static void fireUserLoginEvent(ServerPlayer player) { - PacketEventsAPI api = PacketEvents.getAPI(); + FabricPacketEventsAPI api = FabricPacketEventsAPI.getServerAPI(); User user = api.getPlayerManager().getUser(player); if (user == null) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java index 86ed29e4f..2b3ec6c8b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java @@ -5,13 +5,5 @@ public interface ViaVersionAccessor { - int getProtocolVersion(ServerPlayer player); - int getProtocolVersion(User user); - - Class getUserConnectionClass(); - - Class getSpongeDecodeHandlerClass(); - - Class getSpongeEncodeHandlerClass(); } \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java index 15c397aef..675672550 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java @@ -12,25 +12,8 @@ public class ViaVersionAccessorImpl implements ViaVersionAccessor { - private static final Class ENCODE_HANDLER; - private static final Class DECODE_HANDLER; - - static { - try { - ENCODE_HANDLER = Class.forName("com.viaversion.fabric.common.handler.FabricEncodeHandler"); - DECODE_HANDLER = Class.forName("com.viaversion.fabric.common.handler.FabricDecodeHandler"); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - private static Field CONNECTION_FIELD; - @Override - public int getProtocolVersion(ServerPlayer player) { - return Via.getAPI().getPlayerVersion(player); - } - @Override public int getProtocolVersion(User user) { try { @@ -40,25 +23,9 @@ public int getProtocolVersion(User user) { } UserConnection connection = (UserConnection) CONNECTION_FIELD.get(viaEncoder); return connection.getProtocolInfo().getProtocolVersion(); - } - catch (IllegalAccessException e) { + } catch (IllegalAccessException e) { PacketEvents.getAPI().getLogManager().warn("Unable to grab ViaVersion client version for player!"); return -1; } } - - @Override - public Class getUserConnectionClass() { - return UserConnection.class; - } - - @Override - public Class getSpongeDecodeHandlerClass() { - return DECODE_HANDLER; - } - - @Override - public Class getSpongeEncodeHandlerClass() { - return ENCODE_HANDLER; - } } \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java index 045b77f83..a1d30f340 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java @@ -1,21 +1,27 @@ package io.github.retrooper.packetevents.util.viaversion; import com.github.retrooper.packetevents.protocol.player.User; +import io.netty.channel.Channel; +import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.server.level.ServerPlayer; public class ViaVersionUtil { private static ViaState available = ViaState.UNKNOWN; private static ViaVersionAccessor viaVersionAccessor; + private static final FabricLoader loader = FabricLoader.getInstance(); + private static final EnvType envType = loader.getEnvironmentType(); private ViaVersionUtil() { } - private static void load() { + private static void load(User user) { if (viaVersionAccessor == null) { try { Class.forName("com.viaversion.viaversion.api.Via"); + // Possible for ViaFabricPlus to be loaded but not be activated + if (envType == EnvType.CLIENT && ((Channel) user.getChannel()).pipeline().get("via-encoder") == null) return; viaVersionAccessor = new ViaVersionAccessorImpl(); + available = ViaState.ENABLED; } catch (Exception e) { viaVersionAccessor = null; } @@ -23,40 +29,31 @@ private static void load() { } public static void checkIfViaIsPresent() { - boolean present = FabricLoader.getInstance().getModContainer("viaversion").isPresent(); - available = present ? ViaState.ENABLED : ViaState.DISABLED; + boolean present = loader.getModContainer("viaversion").isPresent(); + if (!present) { + available = ViaState.DISABLED; + } else if (envType == EnvType.SERVER) { + available = ViaState.ENABLED; + } else if (envType == EnvType.CLIENT) { + // ViaFabricPlus can be unloaded client side! + available = ViaState.UNKNOWN; + } } - public static boolean isAvailable() { - if (available == ViaState.UNKNOWN) { // Plugins haven't loaded... let's refer to whether we have a class - return getViaVersionAccessor() != null; + public static boolean isAvailable(User user) { + if (available == ViaState.UNKNOWN) { + return getViaVersionAccessor(user) != null; } return available == ViaState.ENABLED; } - public static ViaVersionAccessor getViaVersionAccessor() { - load(); + public static ViaVersionAccessor getViaVersionAccessor(User user) { + load(user); return viaVersionAccessor; } public static int getProtocolVersion(User user) { - return getViaVersionAccessor().getProtocolVersion(user); - } - - public static int getProtocolVersion(ServerPlayer player) { - return getViaVersionAccessor().getProtocolVersion(player); - } - - public static Class getUserConnectionClass() { - return getViaVersionAccessor().getUserConnectionClass(); - } - - public static Class getSpongeDecodeHandlerClass() { - return getViaVersionAccessor().getSpongeDecodeHandlerClass(); - } - - public static Class getSpongeEncodeHandlerClass() { - return getViaVersionAccessor().getSpongeEncodeHandlerClass(); + return getViaVersionAccessor(user).getProtocolVersion(user); } } From e652d39b745ef8eb247fdd2d130d66f42fedbed3 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:29:26 -0400 Subject: [PATCH 28/43] Fix sending packets potential going to wrong side on internal server --- fabric/build.gradle.kts | 9 --- .../Fabric1201ClientChainLoadEntrypoint.java | 3 +- .../fabric/Fabric1201ClientPlayerManager.java | 5 ++ .../mc1201/Fabric1201ChainLoadEntrypoint.java | 3 +- .../fabric/Fabric1201ServerPlayerManager.java | 8 +- .../mc1202/Fabric1202ChainLoadEntrypoint.java | 3 +- .../fabric/Fabric1202ServerPlayerManager.java | 5 ++ .../Fabric1211ClientChainLoadEntrypoint.java | 3 +- .../fabric/Fabric1211ClientPlayerManager.java | 5 ++ .../factory/fabric/FabricChannelInjector.java | 11 ++- .../manager/AbstractFabricPlayerManager.java | 80 +++++++++++++++++++ .../manager/FabricProtocolManager.java | 11 ++- .../manager/InternalFabricPacketListener.java | 3 + 13 files changed, 123 insertions(+), 26 deletions(-) create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index fd37e8c9c..5d663d20d 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,7 +1,6 @@ plugins { packetevents.`library-conventions` alias(libs.plugins.fabric.loom) - id("idea") } repositories { @@ -86,14 +85,6 @@ allprojects { accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() .resolve("${rootProject.name}.accesswidener") } - - apply(plugin = "idea") - idea { - module { - isDownloadJavadoc = true - isDownloadSources = true - } - } } subprojects { diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java index 09f20660a..30fccef12 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java @@ -1,5 +1,6 @@ package io.github.retrooper.packetevents.mc1201; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ClientPlayerManager; @@ -8,6 +9,6 @@ public class Fabric1201ClientChainLoadEntrypoint extends Fabric1201ChainLoadEntr @Override public void initialize(ChainLoadData chainLoadData) { - chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(Fabric1201ClientPlayerManager::new)); + chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1201ClientPlayerManager(FabricPacketEventsAPI.getClientAPI()))); } } diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java index dda503576..18c57fe4c 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java @@ -18,6 +18,7 @@ package io.github.retrooper.packetevents.mc1201.factory.fabric; +import com.github.retrooper.packetevents.PacketEventsAPI; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.LocalPlayer; @@ -25,6 +26,10 @@ public class Fabric1201ClientPlayerManager extends Fabric1201ServerPlayerManager { + public Fabric1201ClientPlayerManager(PacketEventsAPI packetEventsAPI) { + super(packetEventsAPI); + } + @Override public int getPing(@NotNull Object playerObj) { if (playerObj instanceof LocalPlayer player) { diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java index 315557bb5..bfe36a527 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java @@ -1,6 +1,7 @@ package io.github.retrooper.packetevents.mc1201; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import io.github.retrooper.packetevents.mc1201.registry.Fabric1201ItemRegistry; import io.github.retrooper.packetevents.util.LazyHolder; @@ -11,7 +12,7 @@ public class Fabric1201ChainLoadEntrypoint implements ChainLoadEntryPoint { - protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1201ServerPlayerManager::new); + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1201ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); @Override public void initialize(ChainLoadData chainLoadData) { diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java index 899b06fc7..a527e0498 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java @@ -18,11 +18,17 @@ package io.github.retrooper.packetevents.mc1201.factory.fabric; +import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; -public class Fabric1201ServerPlayerManager extends PlayerManagerAbstract { +public class Fabric1201ServerPlayerManager extends AbstractFabricPlayerManager { + + public Fabric1201ServerPlayerManager(PacketEventsAPI packetEventsAPI) { + super(packetEventsAPI); + } @Override public int getPing(@NotNull Object player) { diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java index 2328283cf..36c02f04f 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java @@ -1,6 +1,7 @@ package io.github.retrooper.packetevents.mc1202; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; @@ -9,7 +10,7 @@ public class Fabric1202ChainLoadEntrypoint implements ChainLoadEntryPoint { - protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(Fabric1202ServerPlayerManager::new); + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1202ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); @Override public void initialize(ChainLoadData chainLoadData) { diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java index f4f569830..6994c1cea 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java @@ -18,12 +18,17 @@ package io.github.retrooper.packetevents.mc1202.factory.fabric; +import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.NotNull; public class Fabric1202ServerPlayerManager extends Fabric1201ServerPlayerManager { + public Fabric1202ServerPlayerManager(PacketEventsAPI packetEventsAPI) { + super(packetEventsAPI); + } + @Override public int getPing(@NotNull Object player) { if (player instanceof ServerPlayer) { diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java index 38c00d6ed..a00844642 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java @@ -1,6 +1,7 @@ package io.github.retrooper.packetevents.mc1211; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.util.LazyHolder; @@ -11,7 +12,7 @@ public class Fabric1211ClientChainLoadEntrypoint implements ChainLoadEntryPoint @Override public void initialize(ChainLoadData chainLoadData) { - chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(Fabric1211ClientPlayerManager::new)); + chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1211ClientPlayerManager(FabricPacketEventsAPI.getClientAPI()))); } @Override diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java index a739592b0..55e062031 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java @@ -18,6 +18,7 @@ package io.github.retrooper.packetevents.mc1211.factory.fabric; +import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.mc1202.factory.fabric.Fabric1202ServerPlayerManager; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; @@ -26,6 +27,10 @@ public class Fabric1211ClientPlayerManager extends Fabric1202ServerPlayerManager { + public Fabric1211ClientPlayerManager(PacketEventsAPI packetEventsAPI) { + super(packetEventsAPI); + } + @Override public int getPing(@NotNull Object playerObj) { if (playerObj instanceof LocalPlayer player) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java index 9a90ab40f..55f9f1943 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java @@ -18,7 +18,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.PacketEvents; import com.github.retrooper.packetevents.injector.ChannelInjector; @@ -36,10 +35,10 @@ public class FabricChannelInjector implements ChannelInjector { private final PacketSide packetSide; - private final FabricPacketEventsAPI fabricPacketEventsAPI; + private final PacketEventsAPI packetEventsAPI; - public FabricChannelInjector(FabricPacketEventsAPI fabricPacketEventsAPI, EnvType environment) { - this.fabricPacketEventsAPI = fabricPacketEventsAPI; + public FabricChannelInjector(PacketEventsAPI packetEventsAPI, EnvType environment) { + this.packetEventsAPI = packetEventsAPI; this.packetSide = switch (environment) { case SERVER -> PacketSide.SERVER; case CLIENT -> PacketSide.CLIENT; @@ -69,7 +68,7 @@ public boolean isPlayerSet(Object ch) { @Override public void updateUser(Object channel, User user) { - if (!fabricPacketEventsAPI.getProtocolManager().hasChannel(channel)) { + if (!packetEventsAPI.getProtocolManager().hasChannel(channel)) { return; // this channel isn't injected by packetevents } Channel ch = (Channel) channel; @@ -79,7 +78,7 @@ public void updateUser(Object channel, User user) { @Override public void setPlayer(Object channel, Object player) { - if (!fabricPacketEventsAPI.getProtocolManager().hasChannel(channel)) { + if (!packetEventsAPI.getProtocolManager().hasChannel(channel)) { return; // this channel isn't injected by packetevents } Channel ch = (Channel) channel; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java new file mode 100644 index 000000000..ef8a69ee9 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java @@ -0,0 +1,80 @@ +package io.github.retrooper.packetevents.manager; + +import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import org.jetbrains.annotations.NotNull; + +public abstract class AbstractFabricPlayerManager extends PlayerManagerAbstract { + + private final PacketEventsAPI packetEventsAPI; + + public AbstractFabricPlayerManager(PacketEventsAPI packetEventsAPI) { + this.packetEventsAPI = packetEventsAPI; + } + + @Override + public ConnectionState getConnectionState(@NotNull Object player) throws IllegalStateException { + return getUser(player).getConnectionState(); + } + + @Override + public void sendPacket(@NotNull Object player, @NotNull Object byteBuf) { + packetEventsAPI.getProtocolManager().sendPacket(getChannel(player), byteBuf); + } + @Override + public void sendPacket(@NotNull Object player, @NotNull PacketWrapper wrapper) { + packetEventsAPI.getProtocolManager().sendPacket(getChannel(player), wrapper); + } + + @Override + public void sendPacketSilently(@NotNull Object player, @NotNull Object byteBuf) { + packetEventsAPI.getProtocolManager().sendPacketSilently(getChannel(player), byteBuf); + } + + @Override + public void sendPacketSilently(@NotNull Object player, @NotNull PacketWrapper wrapper) { + packetEventsAPI.getProtocolManager().sendPacketSilently(getChannel(player), wrapper); + } + + @Override + public void writePacket(@NotNull Object player, @NotNull Object byteBuf) { + packetEventsAPI.getProtocolManager().writePacket(getChannel(player), byteBuf); + } + + @Override + public void writePacket(@NotNull Object player, @NotNull PacketWrapper wrapper) { + packetEventsAPI.getProtocolManager().writePacket(getChannel(player), wrapper); + } + + @Override + public void writePacketSilently(@NotNull Object player, @NotNull Object byteBuf) { + packetEventsAPI.getProtocolManager().writePacketSilently(getChannel(player), byteBuf); + } + + @Override + public void writePacketSilently(@NotNull Object player, @NotNull PacketWrapper wrapper) { + packetEventsAPI.getProtocolManager().writePacketSilently(getChannel(player), wrapper); + } + + @Override + public void receivePacket(Object player, Object byteBuf) { + packetEventsAPI.getProtocolManager().receivePacket(getChannel(player), byteBuf); + } + + @Override + public void receivePacket(Object player, PacketWrapper wrapper) { + packetEventsAPI.getProtocolManager().receivePacket(getChannel(player), wrapper); + } + + @Override + public void receivePacketSilently(Object player, Object byteBuf) { + packetEventsAPI.getProtocolManager().receivePacketSilently(getChannel(player), byteBuf); + } + + @Override + public void receivePacketSilently(Object player, PacketWrapper wrapper) { + packetEventsAPI.getProtocolManager().receivePacketSilently(getChannel(player), wrapper); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java index 7761e5dae..e764f2c21 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java @@ -18,11 +18,10 @@ package io.github.retrooper.packetevents.manager; -import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.netty.channel.ChannelHelper; import com.github.retrooper.packetevents.protocol.ProtocolVersion; import com.github.retrooper.packetevents.protocol.player.User; -import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.impl.netty.manager.protocol.ProtocolManagerAbstract; import io.netty.buffer.ByteBuf; import net.fabricmc.api.EnvType; @@ -37,10 +36,10 @@ public class FabricProtocolManager extends ProtocolManagerAbstract { private final Map channels = new ConcurrentHashMap<>(); private final Map users = new ConcurrentHashMap<>(); private final boolean invert; - private final FabricPacketEventsAPI fabricPacketEventsAPI; + private final PacketEventsAPI packetEventsAPI; - public FabricProtocolManager(FabricPacketEventsAPI fabricPacketEventsAPI, EnvType environment) { - this.fabricPacketEventsAPI = fabricPacketEventsAPI; + public FabricProtocolManager(PacketEventsAPI packetEventsAPI, EnvType environment) { + this.packetEventsAPI = packetEventsAPI; this.invert = environment == EnvType.CLIENT; } @@ -150,7 +149,7 @@ public void setUser(Object channel, User user) { Object pipeline = ChannelHelper.getPipeline(channel); users.put(pipeline, user); } - fabricPacketEventsAPI.getInjector().updateUser(channel, user); + packetEventsAPI.getInjector().updateUser(channel, user); } @Override diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java index 33d030eed..6cd468668 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java @@ -2,12 +2,15 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.event.PacketReceiveEvent; +import com.github.retrooper.packetevents.event.PacketSendEvent; import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.protocol.item.ItemStack; import com.github.retrooper.packetevents.protocol.packettype.PacketType; import com.github.retrooper.packetevents.protocol.player.ClientVersion; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.LogManager; import com.github.retrooper.packetevents.wrapper.handshaking.client.WrapperHandshakingClientHandshake; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetCursorItem; import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; import java.nio.channels.Channel; From 9c0e82303efa0b93abaf8f685f3cb0797813c5ec Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Mon, 31 Mar 2025 08:26:48 -0400 Subject: [PATCH 29/43] Add comprehensive test to ensure integrity of all StateType mappings and WrappedBlockStates --- api/build.gradle.kts | 3 + .../world/states/defaulttags/BlockTags.java | 28 +++ .../world/states/type/StateTypes.java | 1 - .../test/StateTypeMappingTest.java | 207 ++++++++++++++++++ .../test/base/TestPacketEventsBuilder.java | 8 +- testlibs.versions.toml | 2 +- 6 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 api/src/test/java/com/github/retrooper/packetevents/test/StateTypeMappingTest.java diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 03a8c8359..ab15839af 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -40,6 +40,9 @@ dependencies { testImplementation(testlibs.bundles.junit) testImplementation(libs.netty) testImplementation(libs.classgraph) + testImplementation(project(":spigot")) + testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.2") + testImplementation("org.junit.jupiter:junit-jupiter-params:5.11.2") } mappingCompression { diff --git a/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/defaulttags/BlockTags.java b/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/defaulttags/BlockTags.java index 45bfe0449..92ea8c86a 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/defaulttags/BlockTags.java +++ b/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/defaulttags/BlockTags.java @@ -335,6 +335,30 @@ public class BlockTags { */ public static final BlockTags DEAD_CORAL_PLANTS = bind("dead_coral_plants"); + /** + * Unofficial tag for all blocks added in 1.20.5 + */ + @VisibleForTesting @ApiStatus.Internal + public static final BlockTags V_1_20_5 = bind("V_1_20_5"); + + /** + * Unofficial tag for all blocks added in 1.21.2 + */ + @VisibleForTesting @ApiStatus.Internal + public static final BlockTags V_1_21_2 = bind("V_1_21_2"); + + /** + * Unofficial tag for all blocks added in 1.21.4 + */ + @VisibleForTesting @ApiStatus.Internal + public static final BlockTags V_1_21_4 = bind("V_1_21_4"); + + /** + * Unofficial tag for all blocks added in 1.21.5 + */ + @VisibleForTesting @ApiStatus.Internal + public static final BlockTags V_1_21_5 = bind("V_1_21_5"); + static { BlockTags.WOOL.add(StateTypes.WHITE_WOOL, StateTypes.ORANGE_WOOL, StateTypes.MAGENTA_WOOL, StateTypes.LIGHT_BLUE_WOOL, StateTypes.YELLOW_WOOL, StateTypes.LIME_WOOL, StateTypes.PINK_WOOL, StateTypes.GRAY_WOOL, StateTypes.LIGHT_GRAY_WOOL, StateTypes.CYAN_WOOL, StateTypes.PURPLE_WOOL, StateTypes.BLUE_WOOL, StateTypes.BROWN_WOOL, StateTypes.GREEN_WOOL, StateTypes.RED_WOOL, StateTypes.BLACK_WOOL); BlockTags.PLANKS.add(StateTypes.OAK_PLANKS, StateTypes.SPRUCE_PLANKS, StateTypes.BIRCH_PLANKS, StateTypes.JUNGLE_PLANKS, StateTypes.ACACIA_PLANKS, StateTypes.DARK_OAK_PLANKS, StateTypes.PALE_OAK_PLANKS, StateTypes.CRIMSON_PLANKS, StateTypes.WARPED_PLANKS, StateTypes.MANGROVE_PLANKS, StateTypes.BAMBOO_PLANKS, StateTypes.CHERRY_PLANKS); @@ -536,6 +560,10 @@ public class BlockTags { BlockTags.GLASS_PANES.add(StateTypes.GLASS_PANE, StateTypes.WHITE_STAINED_GLASS_PANE, StateTypes.ORANGE_STAINED_GLASS_PANE, StateTypes.MAGENTA_STAINED_GLASS_PANE, StateTypes.LIGHT_BLUE_STAINED_GLASS_PANE, StateTypes.YELLOW_STAINED_GLASS_PANE, StateTypes.LIME_STAINED_GLASS_PANE, StateTypes.PINK_STAINED_GLASS_PANE, StateTypes.GRAY_STAINED_GLASS_PANE, StateTypes.LIGHT_GRAY_STAINED_GLASS_PANE, StateTypes.CYAN_STAINED_GLASS_PANE, StateTypes.PURPLE_STAINED_GLASS_PANE, StateTypes.BLUE_STAINED_GLASS_PANE, StateTypes.BROWN_STAINED_GLASS_PANE, StateTypes.GREEN_STAINED_GLASS_PANE, StateTypes.RED_STAINED_GLASS_PANE, StateTypes.BLACK_STAINED_GLASS_PANE); BlockTags.ALL_CORAL_PLANTS.add(StateTypes.TUBE_CORAL, StateTypes.BRAIN_CORAL, StateTypes.BUBBLE_CORAL, StateTypes.FIRE_CORAL, StateTypes.HORN_CORAL, StateTypes.DEAD_TUBE_CORAL, StateTypes.DEAD_BRAIN_CORAL, StateTypes.DEAD_BUBBLE_CORAL, StateTypes.DEAD_FIRE_CORAL, StateTypes.DEAD_HORN_CORAL); BlockTags.DEAD_CORAL_PLANTS.add(StateTypes.DEAD_TUBE_CORAL, StateTypes.DEAD_BRAIN_CORAL, StateTypes.DEAD_BUBBLE_CORAL, StateTypes.DEAD_FIRE_CORAL, StateTypes.DEAD_HORN_CORAL); + BlockTags.V_1_20_5.add(StateTypes.VAULT, StateTypes.HEAVY_CORE); + BlockTags.V_1_21_2.add(StateTypes.PALE_OAK_WOOD, StateTypes.PALE_OAK_PLANKS, StateTypes.PALE_OAK_SAPLING, StateTypes.PALE_OAK_LOG, StateTypes.STRIPPED_PALE_OAK_LOG, StateTypes.STRIPPED_PALE_OAK_WOOD, StateTypes.PALE_OAK_LEAVES, StateTypes.CREAKING_HEART, StateTypes.PALE_OAK_SIGN, StateTypes.PALE_OAK_WALL_SIGN, StateTypes.PALE_OAK_HANGING_SIGN, StateTypes.PALE_OAK_WALL_HANGING_SIGN, StateTypes.PALE_OAK_PRESSURE_PLATE, StateTypes.PALE_OAK_TRAPDOOR, StateTypes.POTTED_PALE_OAK_SAPLING, StateTypes.PALE_OAK_BUTTON, StateTypes.PALE_OAK_STAIRS, StateTypes.PALE_OAK_SLAB, StateTypes.PALE_OAK_FENCE_GATE, StateTypes.PALE_OAK_FENCE, StateTypes.PALE_OAK_DOOR, StateTypes.PALE_MOSS_BLOCK, StateTypes.PALE_MOSS_CARPET, StateTypes.PALE_HANGING_MOSS); + BlockTags.V_1_21_4.add(StateTypes.RESIN_CLUMP, StateTypes.RESIN_BLOCK, StateTypes.RESIN_BRICKS, StateTypes.RESIN_BRICK_STAIRS, StateTypes.RESIN_BRICK_SLAB, StateTypes.RESIN_BRICK_WALL, StateTypes.CHISELED_RESIN_BRICKS, StateTypes.OPEN_EYEBLOSSOM, StateTypes.CLOSED_EYEBLOSSOM, StateTypes.POTTED_OPEN_EYEBLOSSOM, StateTypes.POTTED_CLOSED_EYEBLOSSOM); + BlockTags.V_1_21_5.add(StateTypes.BUSH, StateTypes.FIREFLY_BUSH, StateTypes.SHORT_DRY_GRASS, StateTypes.TALL_DRY_GRASS, StateTypes.WILDFLOWERS, StateTypes.LEAF_LITTER, StateTypes.CACTUS_FLOWER, StateTypes.TEST_BLOCK, StateTypes.TEST_INSTANCE_BLOCK); } String name; diff --git a/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java b/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java index 513edd384..625309db6 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java +++ b/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java @@ -528,7 +528,6 @@ public static StateType.Mapped getMappedById(ClientVersion version, int id) { public static StateType PACKED_ICE = StateTypes.builder().name("PACKED_ICE").blastResistance(0.5f).hardness(0.5f).isBlocking(true).requiresCorrectTool(false).isSolid(true).setMaterial(MaterialType.ICE_SOLID).build(); @ApiStatus.Obsolete @RuntimeObsolete public static StateType GRASS_PATH = StateTypes.builder().name("GRASS_PATH").blastResistance(0.65f).hardness(0.65f).isBlocking(true).requiresCorrectTool(false).isSolid(true).setMaterial(MaterialType.DIRT).build(); - public static StateType DIRT_PATH = StateTypes.builder().name("DIRT_PATH").blastResistance(0.65f).hardness(0.65f).isBlocking(true).requiresCorrectTool(false).isSolid(true).setMaterial(MaterialType.DIRT).build(); public static StateType SUNFLOWER = StateTypes.builder().name("SUNFLOWER").blastResistance(0.0f).hardness(0.0f).isBlocking(false).requiresCorrectTool(false).isSolid(false).setMaterial(MaterialType.REPLACEABLE_PLANT).build(); public static StateType LILAC = StateTypes.builder().name("LILAC").blastResistance(0.0f).hardness(0.0f).isBlocking(false).requiresCorrectTool(false).isSolid(false).setMaterial(MaterialType.REPLACEABLE_PLANT).build(); public static StateType ROSE_BUSH = StateTypes.builder().name("ROSE_BUSH").blastResistance(0.0f).hardness(0.0f).isBlocking(false).requiresCorrectTool(false).isSolid(false).setMaterial(MaterialType.REPLACEABLE_PLANT).build(); diff --git a/api/src/test/java/com/github/retrooper/packetevents/test/StateTypeMappingTest.java b/api/src/test/java/com/github/retrooper/packetevents/test/StateTypeMappingTest.java new file mode 100644 index 000000000..722642faf --- /dev/null +++ b/api/src/test/java/com/github/retrooper/packetevents/test/StateTypeMappingTest.java @@ -0,0 +1,207 @@ +package com.github.retrooper.packetevents.test; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.protocol.player.ClientVersion; +import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; +import com.github.retrooper.packetevents.protocol.world.states.defaulttags.BlockTags; +import com.github.retrooper.packetevents.protocol.world.states.type.StateType; +import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes; +import com.github.retrooper.packetevents.test.base.BaseDummyAPITest; +import io.github.retrooper.packetevents.util.SpigotConversionUtil; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Function; + +import com.github.retrooper.packetevents.PacketEvents; +import org.bukkit.Material; +import org.bukkit.material.MaterialData; //Needed for 1.12 and below support. +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class StateTypeMappingTest extends BaseDummyAPITest { + + private Collection cachedStateValues = null; + + private Collection getNonObsoleteStateTypes() { + if (cachedStateValues == null) { + cachedStateValues = computeNonObsoleteStateTypes(); + } + return cachedStateValues; + } + + private Collection computeNonObsoleteStateTypes() { + Collection all = StateTypes.values(); + List filtered = new ArrayList<>(all); + // Case 0: Ignore obsolete entries (temporary workaround to GRASS_PATH rename/fix) + Set EXEMPT_STATE_TYPES = new HashSet<>(Arrays.asList( + StateTypes.GRASS_PATH + )); + filtered.removeAll(EXEMPT_STATE_TYPES); + return filtered; + } + + @ParameterizedTest + @EnumSource(ClientVersion.class) + @DisplayName("Verify StateType mappings for all client versions") + public void testStateTypeMappings(ClientVersion version) { + testStateTypeMappings(version, false); + } + + @Test + @DisplayName("Verify StateType mappings (fail fast)") + public void testStateTypeMappingsFailFast() { + // Use the server version. + ServerVersion serverVersion = PacketEvents.getAPI().getServerManager().getVersion(); + ClientVersion version = serverVersion.toClientVersion(); + testStateTypeMappings(version, true); + } + + public void testStateTypeMappings(ClientVersion version, boolean failFast) { + final ServerVersion serverVersion = PacketEvents.getAPI().getServerManager().getVersion(); + Function blockStateFunction = getBlockStateFunction(serverVersion); + + StringBuilder errorMessages = new StringBuilder(); // Accumulate error messages for diagnostic mode + + int found = 0; + int idsMatched = 0; + + + Collection stateValues = getNonObsoleteStateTypes(); + + // Get all BlockTags for versions newer than the server version + List newerBlockTags = getVersionBlockTagsNewerThan(serverVersion); + int expected = stateValues.size(); + + // Check if the client version is newer than the server version + ClientVersion serverClientVersion = serverVersion.toClientVersion(); + boolean isClientNewer = version.isNewerThan(serverClientVersion); + + for (StateType value : stateValues) { + String name = value.getName(); + int id = value.getMapped().getId(version); + + // Case 1: Block is from a newer version than the server (id == -1) + if (id == -1 && isBlockFromNewerVersion(value, newerBlockTags)) { + // Skip validation for blocks from newer versions and mark as found so there is no count error at the end + expected--; + continue; + } + + Material material = Material.matchMaterial(name); // This will return null for materials like potted_open_eyeblossom (added in 1.21.4) on 1.21 server + + // Case 2: Client is newer, block exists in client (id != -1), but not in server (material == null) + if (isClientNewer && id != -1 && material == null && isBlockFromNewerVersion(value, newerBlockTags)) { + // This is expected behavior: the client knows the block, but the server does not + expected--; + continue; + } + + // Case 3: Material is missing unexpectedly (not from a newer version) + if (material == null) { + String errorMessage = String.format("Material not found for statetype %s, id=%d", name, id); + if (failFast) { + fail(errorMessage); + return; // Just to make sure it exits. + } else { + errorMessages.append(errorMessage).append("\n"); + } + continue; + } + found++; + + WrappedBlockState state = blockStateFunction.apply(material); + if (state == null) { + String errorMessage = String.format("Failed to create BlockState from material %s, id=%d", material.name(), id); + if (failFast) { + fail(errorMessage); + return; + } else { + errorMessages.append(errorMessage).append("\n"); + } + continue; + } + + if (state.getType() != value) { + String errorMessage = String.format("State type mismatch for material %s, type=%s, value=%s", material.name(), state.getType(), value); + if (failFast) { + fail(errorMessage); + return; + } else { + errorMessages.append(errorMessage).append("\n"); + } + continue; + } + idsMatched++; + } + + final int missing = expected - found; + + // Diagnostic output (non-fail-fast mode) + if (!failFast && errorMessages.length() > 0) { + System.err.println("StateType Mapping Errors:"); + System.err.println(errorMessages); + + // Output summary + System.err.println(String.format("%d/%d statetypes found", found, expected)); + if (missing > 0) { + double percent = ((double) found / expected) * 100; + System.err.println(String.format("%d missing (%.2f%%)", missing, percent)); + } + System.err.println(String.format("%d/%d ids matched", idsMatched, found)); + } + + // Only fail the test if there are unexpected missing StateTypes + assertEquals(expected, found, String.format("Not all StateTypes found for version %s. Missing: %d. See error log for details.", version.getReleaseName(), missing)); + assertEquals(found, idsMatched, String.format("Not all StateType IDs matched for version %s. See error log for details.", version.getReleaseName())); + } + + private Function getBlockStateFunction(ServerVersion serverVersion) { + if (serverVersion.isOlderThanOrEquals(ServerVersion.V_1_12)) { + return material -> SpigotConversionUtil.fromBukkitMaterialData(new MaterialData(material)); + } else { + return material -> SpigotConversionUtil.fromBukkitBlockData(material.createBlockData()); + } + } + + /** + * Gets all BlockTags for versions newer than the server version. + * Relies on BlockTags existing with names V_1_20_5, V_1_21_2, V_1_21_4, etc... + * for versions newer than the Mocked server version (currently 1.21.1 from MockBukkit) + */ + private List getVersionBlockTagsNewerThan(ServerVersion serverVersion) { + List blockTags = new ArrayList<>(); + for (ServerVersion version : ServerVersion.values()) { + if (version.isNewerThan(serverVersion)) { // Use isNewerThan to exclude the server's own version + BlockTags blockTag = BlockTags.getByName(version.name()); // Use name() to match enum naming convention + if (blockTag != null) { // Only add non-null tags + blockTags.add(blockTag); + } + } + } + return blockTags; + } + + /** + * Determines if the block is from a version newer than the server's version. + */ + private boolean isBlockFromNewerVersion(StateType stateType, List newerBlockTags) { + // Check if the StateType is tagged in any of the newer BlockTags + for (BlockTags tag : newerBlockTags) { + if (tag.contains(stateType)) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java b/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java index 5d6ff3d83..955c41790 100644 --- a/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java +++ b/api/src/test/java/com/github/retrooper/packetevents/test/base/TestPacketEventsBuilder.java @@ -15,6 +15,7 @@ import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.impl.netty.manager.protocol.ProtocolManagerAbstract; import io.github.retrooper.packetevents.impl.netty.manager.server.ServerManagerAbstract; +import io.github.retrooper.packetevents.manager.server.ServerManagerImpl; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.Nullable; @@ -60,12 +61,7 @@ public ProtocolVersion getPlatformVersion() { return ProtocolVersion.UNKNOWN; } }; - private final ServerManager serverManager = new ServerManagerAbstract() { - @Override - public ServerVersion getVersion() { - return ServerVersion.getLatest(); - } - }; + private final ServerManager serverManager = new ServerManagerImpl(); private final NettyManager nettyManager = new NettyManagerImpl(); private final LogManager logManager = new LogManager() { diff --git a/testlibs.versions.toml b/testlibs.versions.toml index eafb5cc1c..f3e2ce38a 100644 --- a/testlibs.versions.toml +++ b/testlibs.versions.toml @@ -1,5 +1,5 @@ [versions] -mockbukkit = "3.131.0" +mockbukkit = "3.133.2" slf4j = "2.0.16" junit = "5.11.2" From 503ad42ea3c4053a3ebc44ae8235b184946aa262 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:21:02 -0400 Subject: [PATCH 30/43] Fix Krypton compatability --- .../github/retrooper/packetevents/handler/PacketDecoder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 09fdeaf22..8ed8839ef 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -26,7 +26,6 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import java.util.Arrays; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.ApiStatus; @@ -65,7 +64,7 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc kryptonReorder = true; } if (evt.getClass().getName().equals("com.viaversion.fabric.common.handler.PipelineReorderEvent") || kryptonReorder) { - FabricInjectionUtil.reorderHandlers(ctx, side); + FabricInjectionUtil.reorderHandlers(ctx, side.getOpposite()); } super.userEventTriggered(ctx, evt); } From 5a07f241c4032eec33a82be6445824c5d38f2c85 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Wed, 2 Apr 2025 09:23:47 -0400 Subject: [PATCH 31/43] Bump Fabric loom version; minor comment clarification --- fabric/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 5d663d20d..d773974c1 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -96,7 +96,7 @@ subprojects { compileOnly(project(":fabric", configuration = "namedElements")) } - // version replacement already processed by packetevents.`library-conventions` + // version replacement already processed for :fabric in packetevents.`library-conventions` tasks { processResources { inputs.property("version", project.version) From ad9f6f61f34a2e708599209622700a499c22d8e9 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Thu, 3 Apr 2025 19:05:06 -0400 Subject: [PATCH 32/43] Downgrade shared Fabric base to 1.14 (lowest without Fabric-legacy), transition to Yarn --- fabric/build.gradle.kts | 46 ++++++++++++------- fabric/gradle.properties | 7 ++- fabric/mc1201/build.gradle.kts | 8 +--- fabric/mc1201/gradle.properties | 3 +- .../fabric/Fabric1201ClientPlayerManager.java | 13 +++--- ...ava => ClientPlayPacketListenerMixin.java} | 30 ++++++------ .../fabric/Fabric1201ServerPlayerManager.java | 11 ++--- ...nMixin.java => ClientConnectionMixin.java} | 13 +++--- ...ListMixin.java => PlayerManagerMixin.java} | 24 +++++----- ...in.java => PlayerManagerRespawnMixin.java} | 17 ++++--- .../registry/Fabric1201ItemRegistry.java | 13 ++++-- .../mc1201/src/main/resources/fabric.mod.json | 2 +- .../resources/packetevents-mc1201.mixins.json | 6 +-- .../main/resources/packetevents.accesswidener | 5 +- fabric/mc1202/build.gradle.kts | 8 +--- fabric/mc1202/gradle.properties | 3 +- .../fabric/Fabric1202ServerPlayerManager.java | 10 ++-- ...in.java => PlayerManagerRespawnMixin.java} | 17 ++++--- .../mc1202/src/main/resources/fabric.mod.json | 2 +- .../resources/packetevents-mc1202.mixins.json | 2 +- .../main/resources/packetevents.accesswidener | 6 +-- fabric/mc1211/build.gradle.kts | 8 +--- fabric/mc1211/gradle.properties | 3 +- .../fabric/Fabric1211ClientPlayerManager.java | 16 +++---- .../mc1211/src/main/resources/fabric.mod.json | 2 +- .../main/resources/packetevents.accesswidener | 4 +- fabric/mc1214/build.gradle.kts | 8 +--- fabric/mc1214/gradle.properties | 3 +- .../registry/Fabric1214ItemRegistry.java | 17 +++---- .../mc1214/src/main/resources/fabric.mod.json | 2 +- .../packetevents/FabricItemType.java | 16 ++++--- .../packetevents/PacketEventsClientMod.java | 0 .../factory/fabric/FabricChannelInjector.java | 7 ++- .../factory/fabric/FabricPacketEventsAPI.java | 7 +-- .../fabric/FabricPacketEventsBuilder.java | 0 .../packetevents/handler/PacketDecoder.java | 4 +- .../packetevents/handler/PacketEncoder.java | 20 ++++---- .../packetevents/manager/FabricLogger.java | 17 +------ .../manager/FabricServerManager.java | 2 +- .../util/FabricCustomPipelineUtil.java | 6 +-- .../util/FabricInjectionUtil.java | 14 +++--- .../util/viaversion/ViaVersionAccessor.java | 1 - .../viaversion/ViaVersionAccessorImpl.java | 2 - fabric/src/main/resources/fabric.mod.json | 2 +- .../main/resources/packetevents.accesswidener | 4 +- 45 files changed, 189 insertions(+), 222 deletions(-) rename fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/{ClientPacketListenerMixin.java => ClientPlayPacketListenerMixin.java} (70%) rename fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/{ConnectionMixin.java => ClientConnectionMixin.java} (80%) rename fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/{PlayerListMixin.java => PlayerManagerMixin.java} (73%) rename fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/{PlayerListRespawnMixin.java => PlayerManagerRespawnMixin.java} (76%) rename fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/{PlayerListRespawnMixin.java => PlayerManagerRespawnMixin.java} (73%) rename fabric/src/{client => main}/java/io/github/retrooper/packetevents/PacketEventsClientMod.java (100%) rename fabric/src/{client => main}/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java (100%) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index d773974c1..977113261 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -4,13 +4,13 @@ plugins { } repositories { + mavenCentral() maven("https://repo.viaversion.com/") maven("https://jitpack.io") // Conditional Mixin } val minecraft_version: String by project -val parchment_minecraft_version: String by project -val parchment_mappings: String by project +val yarn_mappings: String by project val loader_version: String by project dependencies { @@ -26,23 +26,24 @@ dependencies { // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") - }) + mappings("net.fabricmc:yarn:$yarn_mappings") compileOnly(libs.via.version) } +loom { + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + } + } +} + allprojects { apply(plugin = "fabric-loom") repositories { maven("https://repo.codemc.io/repository/maven-snapshots/") - maven { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } } dependencies { @@ -75,13 +76,7 @@ allprojects { // This preserves some compile-time safety, reduces jar size but be careful to not inject into wrong methods useLegacyMixinAp = false } - splitEnvironmentSourceSets() - mods { - register("packetevents-${project.name}") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } + accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() .resolve("${rootProject.name}.accesswidener") } @@ -90,12 +85,29 @@ allprojects { subprojects { version = rootProject.version + repositories { + maven { + name = "ParchmentMC" + url = uri("https://maven.parchmentmc.org") + } + } + dependencies { compileOnly(project(":api", "shadow")) compileOnly(project(":netty-common")) compileOnly(project(":fabric", configuration = "namedElements")) } + loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } + } + // version replacement already processed for :fabric in packetevents.`library-conventions` tasks { processResources { diff --git a/fabric/gradle.properties b/fabric/gradle.properties index a27726efb..2d250e0e3 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -4,7 +4,6 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.20.1 -parchment_mappings=2023.09.03 -parchment_minecraft_version=1.20.1 -loader_version=0.15.11 +minecraft_version=1.14 +yarn_mappings=1.14+build.21 +loader_version=0.16.12 diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1201/build.gradle.kts index fa098c109..ec88d7e7a 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1201/build.gradle.kts @@ -1,12 +1,8 @@ val minecraft_version: String by project -val parchment_minecraft_version: String by project -val parchment_mappings: String by project +val yarn_mappings: String by project dependencies { // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") - }) + mappings("net.fabricmc:yarn:$yarn_mappings") } \ No newline at end of file diff --git a/fabric/mc1201/gradle.properties b/fabric/mc1201/gradle.properties index 6fbde2dc7..eea9de36a 100644 --- a/fabric/mc1201/gradle.properties +++ b/fabric/mc1201/gradle.properties @@ -5,5 +5,4 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.20.1 -parchment_mappings=2023.09.03 -parchment_minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.10:v2 diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java index 18c57fe4c..b756a41a8 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java @@ -19,9 +19,8 @@ package io.github.retrooper.packetevents.mc1201.factory.fabric; import com.github.retrooper.packetevents.PacketEventsAPI; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.PlayerInfo; -import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.PlayerListEntry; import org.jetbrains.annotations.NotNull; public class Fabric1201ClientPlayerManager extends Fabric1201ServerPlayerManager { @@ -32,8 +31,8 @@ public Fabric1201ClientPlayerManager(PacketEventsAPI packetEventsAPI) { @Override public int getPing(@NotNull Object playerObj) { - if (playerObj instanceof LocalPlayer player) { - PlayerInfo info = player.connection.getPlayerInfo(player.getUUID()); + if (playerObj instanceof ClientPlayerEntity player) { + PlayerListEntry info = player.networkHandler.getPlayerListEntry(player.getUuid()); if (info != null) { return info.getLatency(); } @@ -48,8 +47,8 @@ public int getPing(@NotNull Object playerObj) { @Override public Object getChannel(@NotNull Object player) { - if (player instanceof LocalPlayer) { - return ((LocalPlayer) player).connection.getConnection().channel; + if (player instanceof ClientPlayerEntity) { + return ((ClientPlayerEntity) player).networkHandler.getConnection().channel; } return super.getChannel(player); } diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java similarity index 70% rename from fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java rename to fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java index f784a20c5..0c1ffc6f9 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPacketListenerMixin.java +++ b/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java @@ -18,56 +18,52 @@ package io.github.retrooper.packetevents.mc1201.mixin; -import com.github.retrooper.packetevents.PacketEvents; import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.Connection; -import net.minecraft.network.TickablePacketListener; -import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.listener.ClientPlayPacketListener; +import net.minecraft.network.listener.TickablePacketListener; import org.objectweb.asm.Opcodes; -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; -@Mixin(ClientPacketListener.class) -public abstract class ClientPacketListenerMixin implements TickablePacketListener, - ClientGamePacketListener { +@Mixin(ClientPlayPacketListener.class) +public abstract class ClientPlayPacketListenerMixin implements TickablePacketListener, ClientPlayPacketListener { - @Shadow public abstract Connection getConnection(); + @Shadow public abstract ClientConnection getConnection(); /** * @reason Associate connection instance with player instance */ @Inject( - method = "handleLogin", + method = "onGameJoin", at = @At( value = "FIELD", opcode = Opcodes.PUTFIELD, - target = "Lnet/minecraft/client/Minecraft;player:Lnet/minecraft/client/player/LocalPlayer;", + target = "Lnet/minecraft/client/MinecraftClient;player:Lnet/minecraft/client/network/ClientPlayerEntity;", shift = At.Shift.AFTER ) ) private void postLoginPlayerConstruct(CallbackInfo ci) { - FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.getConnection().channel, Minecraft.getInstance().player); + FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.getConnection().channel, MinecraftClient.getInstance().player); } /** * @reason Minecraft creates a new player instance on respawn */ @Inject( - method = "handleRespawn", + method = "onPlayerRespawn", at = @At( // inject immediately after new player instance has been created value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;setId(I)V" ) ) - private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) LocalPlayer player) { + private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) ClientPlayerEntity player) { FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.getConnection().channel, player); } } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java index a527e0498..c97a7f85c 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java @@ -19,9 +19,8 @@ package io.github.retrooper.packetevents.mc1201.factory.fabric; import com.github.retrooper.packetevents.PacketEventsAPI; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; public class Fabric1201ServerPlayerManager extends AbstractFabricPlayerManager { @@ -32,16 +31,16 @@ public Fabric1201ServerPlayerManager(PacketEventsAPI packetEventsAPI) { @Override public int getPing(@NotNull Object player) { - if (player instanceof ServerPlayer) { - return ((ServerPlayer) player).latency; + if (player instanceof ServerPlayerEntity) { + return ((ServerPlayerEntity) player).pingMilliseconds; // pingMilliseconds in modern yarn } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } @Override public Object getChannel(@NotNull Object player) { - if (player instanceof ServerPlayer) { - return ((ServerPlayer) player).connection.connection.channel; + if (player instanceof ServerPlayerEntity) { + return ((ServerPlayerEntity) player).networkHandler.connection.channel; } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ClientConnectionMixin.java similarity index 80% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java rename to fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ClientConnectionMixin.java index 8a5b5f755..84d198e57 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ConnectionMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ClientConnectionMixin.java @@ -21,24 +21,25 @@ import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.ChannelPipeline; -import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.NetworkSide; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(value = net.minecraft.network.Connection.class, priority = 1500) // priority to inject after Via -public class ConnectionMixin { +@Mixin(value = ClientConnection.class, priority = 1500) // priority to inject after Via +public class ClientConnectionMixin { @Inject( - method = "configureSerialization*", + method = "addHandlers*", at = @At("TAIL"), require = 1 ) - private static void configureSerialization( + private static void addHandlers( CallbackInfo ci, @Local(ordinal = 0, argsOnly = true) ChannelPipeline pipeline, - @Local(ordinal = 0, argsOnly = true) PacketFlow flow + @Local(ordinal = 0, argsOnly = true) NetworkSide flow ) { FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerMixin.java similarity index 73% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java rename to fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerMixin.java index 4a2db8fac..b3a00d755 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerMixin.java @@ -21,28 +21,28 @@ import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.util.FabricInjectionUtil; -import net.minecraft.network.Connection; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; +import net.minecraft.network.ClientConnection; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(PlayerList.class) -public abstract class PlayerListMixin { +@Mixin(PlayerManager.class) +public abstract class PlayerManagerMixin { /** * @reason Associate connection instance with player instance */ @Inject( - method = "placeNewPlayer*", + method = "onPlayerConnect*", at = @At("HEAD") ) - private void preNewPlayerPlace( + private void onPlayerConnect( CallbackInfo ci, - @Local(ordinal = 0, argsOnly = true) Connection connection, - @Local(ordinal = 0, argsOnly = true) ServerPlayer player + @Local(ordinal = 0, argsOnly = true) ClientConnection connection, + @Local(ordinal = 0, argsOnly = true) ServerPlayerEntity player ) { FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(connection.channel, player); } @@ -51,16 +51,16 @@ private void preNewPlayerPlace( * @reason Associate connection instance with player instance and handle login event */ @Inject( - method = "placeNewPlayer*", + method = "onPlayerConnect*", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V", + target = "Lnet/minecraft/server/PlayerManager;sendToAll(Lnet/minecraft/network/packet/Packet;)V", shift = At.Shift.AFTER ) ) private void onPlayerLogin( CallbackInfo ci, - @Local(ordinal = 0, argsOnly = true) ServerPlayer player + @Local(ordinal = 0, argsOnly = true) ServerPlayerEntity player ) { FabricInjectionUtil.fireUserLoginEvent(player); } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerRespawnMixin.java similarity index 76% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java rename to fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerRespawnMixin.java index 42f762bbb..4f7e2dc62 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerListRespawnMixin.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerRespawnMixin.java @@ -1,12 +1,11 @@ package io.github.retrooper.packetevents.mc1201.mixin; -import com.github.retrooper.packetevents.PacketEvents; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.netty.channel.Channel; import me.fallenbreath.conditionalmixin.api.annotation.Condition; import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,8 +16,8 @@ @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), } ) -@Mixin(PlayerList.class) -public class PlayerListRespawnMixin { +@Mixin(PlayerManager.class) +public class PlayerManagerRespawnMixin { /** Handles grabbing new player object on respawns for 1.20.1-, a separate mixin is required * because the location of the field player.connection.connection changes * from inheritance ServerGamePacketListenerImpl -> ServerCommonPacketListenerImpl thus breaking intermediary compatability @@ -26,12 +25,12 @@ public class PlayerListRespawnMixin { * @reason Minecraft creates a new player instance on respawn */ @Inject( - method = "respawn*", + method = "respawnPlayer*", at = @At("RETURN") ) - private void postRespawn(CallbackInfoReturnable cir) { - ServerPlayer player = cir.getReturnValue(); - Channel channel = player.connection.connection.channel; + private void postRespawn(CallbackInfoReturnable cir) { + ServerPlayerEntity player = cir.getReturnValue(); + Channel channel = player.networkHandler.connection.channel; FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(channel, player); } } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java index ca4556cf3..182bedd5b 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java +++ b/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java @@ -3,9 +3,9 @@ import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; import io.github.retrooper.packetevents.FabricItemType; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; +import net.minecraft.item.Item; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; import java.util.Optional; @@ -14,7 +14,12 @@ public class Fabric1201ItemRegistry implements ItemRegistry { @Override public @Nullable ItemType getByName(String name) { - Optional item = BuiltInRegistries.ITEM.getOptional(ResourceLocation.tryParse(name)); + Optional item = Registries.ITEM.getOrEmpty(Identifier.tryParse(name)); return item.isPresent() ? new FabricItemType(item.get()) : null; } + + public @Nullable ItemType getByName(String name, boolean test) { + Item item = Registries.ITEM.get(Identifier.tryParse(name)); + return new FabricItemType(item); + } } diff --git a/fabric/mc1201/src/main/resources/fabric.mod.json b/fabric/mc1201/src/main/resources/fabric.mod.json index 441816ad8..ffdce8bb5 100644 --- a/fabric/mc1201/src/main/resources/fabric.mod.json +++ b/fabric/mc1201/src/main/resources/fabric.mod.json @@ -23,7 +23,7 @@ ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": ">=0.15.11", + "fabricloader": "*", "minecraft": ">=1.20" } } diff --git a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json index 45b3cc644..b603bdc44 100644 --- a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json +++ b/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json @@ -7,9 +7,9 @@ "ClientPacketListenerMixin" ], "mixins": [ - "ConnectionMixin", - "PlayerListMixin", - "PlayerListRespawnMixin" + "ClientConnectionMixin", + "PlayerManagerMixin", + "PlayerManagerRespawnMixin" ], "injectors": { "defaultRequire": 1 diff --git a/fabric/mc1201/src/main/resources/packetevents.accesswidener b/fabric/mc1201/src/main/resources/packetevents.accesswidener index aa0919ba0..fac6a4c11 100644 --- a/fabric/mc1201/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1201/src/main/resources/packetevents.accesswidener @@ -2,9 +2,8 @@ accessWidener v2 named # fields -accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; -accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; -accessible field net/minecraft/client/multiplayer/ClientPacketListener minecraft Lnet/minecraft/client/Minecraft; +accessible field net/minecraft/server/network/ServerPlayNetworkHandler connection Lnet/minecraft/network/ClientConnection; +accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; # methods diff --git a/fabric/mc1202/build.gradle.kts b/fabric/mc1202/build.gradle.kts index b8539e152..91ed9e6a8 100644 --- a/fabric/mc1202/build.gradle.kts +++ b/fabric/mc1202/build.gradle.kts @@ -1,14 +1,10 @@ val minecraft_version: String by project -val parchment_minecraft_version: String by project -val parchment_mappings: String by project +val yarn_mappings: String by project dependencies { compileOnly(project(":fabric:mc1201", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") - }) + mappings("net.fabricmc:yarn:$yarn_mappings") } \ No newline at end of file diff --git a/fabric/mc1202/gradle.properties b/fabric/mc1202/gradle.properties index 360c58ea3..2680af485 100644 --- a/fabric/mc1202/gradle.properties +++ b/fabric/mc1202/gradle.properties @@ -5,5 +5,4 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.20.2 -parchment_mappings=2023.12.10 -parchment_minecraft_version=1.20.2 +yarn_mappings=1.20.2+build.4:v2 diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java index 6994c1cea..73593561b 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java @@ -20,7 +20,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; public class Fabric1202ServerPlayerManager extends Fabric1201ServerPlayerManager { @@ -31,16 +31,16 @@ public Fabric1202ServerPlayerManager(PacketEventsAPI packetEventsAPI) { @Override public int getPing(@NotNull Object player) { - if (player instanceof ServerPlayer) { - return ((ServerPlayer) player).connection.latency(); + if (player instanceof ServerPlayerEntity) { + return ((ServerPlayerEntity) player).networkHandler.getLatency(); } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } @Override public Object getChannel(@NotNull Object player) { - if (player instanceof ServerPlayer) { - return ((ServerPlayer) player).connection.connection.channel; + if (player instanceof ServerPlayerEntity) { + return ((ServerPlayerEntity) player).networkHandler.connection.channel; } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java similarity index 73% rename from fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java rename to fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java index da5ab9b6d..e6a9677b1 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerListRespawnMixin.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java @@ -1,17 +1,16 @@ package io.github.retrooper.packetevents.mc1202.mixin; -import com.github.retrooper.packetevents.PacketEvents; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.netty.channel.Channel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(PlayerList.class) -public class PlayerListRespawnMixin { +@Mixin(PlayerManager.class) +public class PlayerManagerRespawnMixin { /** Handles grabbing new player object on respawns for 1.20.2+, a separate mixin is required * because the location of the field player.connection.connection changes * from inheritance ServerGamePacketListenerImpl <- ServerCommonPacketListenerImpl thus breaking intermediary compatability @@ -19,13 +18,13 @@ public class PlayerListRespawnMixin { * @reason Minecraft creates a new player instance on respawn */ @Inject( - method = "respawn*", + method = "respawnPlayer*", at = @At("RETURN"), require = 1 ) - private void postRespawn(CallbackInfoReturnable cir) { - ServerPlayer player = cir.getReturnValue(); - Channel channel = player.connection.connection.channel; + private void postRespawn(CallbackInfoReturnable cir) { + ServerPlayerEntity player = cir.getReturnValue(); + Channel channel = player.networkHandler.connection.channel; FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(channel, player); } } diff --git a/fabric/mc1202/src/main/resources/fabric.mod.json b/fabric/mc1202/src/main/resources/fabric.mod.json index b958694fa..c90edf92e 100644 --- a/fabric/mc1202/src/main/resources/fabric.mod.json +++ b/fabric/mc1202/src/main/resources/fabric.mod.json @@ -20,7 +20,7 @@ ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": ">=0.15.11", + "fabricloader": "*", "minecraft": ">=1.20.2" } } diff --git a/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json b/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json index ef940b092..a43ca18cc 100644 --- a/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json +++ b/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json @@ -4,7 +4,7 @@ "package": "io.github.retrooper.packetevents.mc1202.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "PlayerListRespawnMixin" + "PlayerManagerRespawnMixin" ], "injectors": { "defaultRequire": 1 diff --git a/fabric/mc1202/src/main/resources/packetevents.accesswidener b/fabric/mc1202/src/main/resources/packetevents.accesswidener index ef1bac2f9..f8686afcf 100644 --- a/fabric/mc1202/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1202/src/main/resources/packetevents.accesswidener @@ -2,10 +2,8 @@ accessWidener v2 named # fields -#accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; -accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; -accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; -#accessible field net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; +accessible field net/minecraft/server/network/ServerCommonNetworkHandler connection Lnet/minecraft/network/ClientConnection; +accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; # methods # classes diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 8bdc1a569..413a4bfcd 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -1,6 +1,5 @@ val minecraft_version: String by project -val parchment_minecraft_version: String by project -val parchment_mappings: String by project +val yarn_mappings: String by project dependencies { compileOnly(project(":fabric:mc1202", configuration = "namedElements")) @@ -8,8 +7,5 @@ dependencies { // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") - }) + mappings("net.fabricmc:yarn:$yarn_mappings") } \ No newline at end of file diff --git a/fabric/mc1211/gradle.properties b/fabric/mc1211/gradle.properties index cb75a95ac..90fd019d9 100644 --- a/fabric/mc1211/gradle.properties +++ b/fabric/mc1211/gradle.properties @@ -5,5 +5,4 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.1 -parchment_mappings=2024.11.17 -parchment_minecraft_version=1.21.1 \ No newline at end of file +yarn_mappings=1.21.1+build.3:v2 \ No newline at end of file diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java index 55e062031..f4bf0040e 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java @@ -20,9 +20,9 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.mc1202.factory.fabric.Fabric1202ServerPlayerManager; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.PlayerInfo; -import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.PlayerListEntry; import org.jetbrains.annotations.NotNull; public class Fabric1211ClientPlayerManager extends Fabric1202ServerPlayerManager { @@ -33,23 +33,23 @@ public Fabric1211ClientPlayerManager(PacketEventsAPI packetEventsAPI) { @Override public int getPing(@NotNull Object playerObj) { - if (playerObj instanceof LocalPlayer player) { - PlayerInfo info = player.connection.getPlayerInfo(player.getUUID()); + if (playerObj instanceof ClientPlayerEntity player) { + PlayerListEntry info = player.networkHandler.getPlayerListEntry(player.getUuid()); if (info != null) { return info.getLatency(); } // if the server doesn't show the player info of // the player itself, try to fall back to potential // latency sampling data - which is often not present - return (int) Minecraft.getInstance().getDebugOverlay().getPingLogger().get(0); + return (int) MinecraftClient.getInstance().getDebugHud().getPingLog().get(0); } return super.getPing(playerObj); } @Override public Object getChannel(@NotNull Object player) { - if (player instanceof LocalPlayer) { - return ((LocalPlayer) player).connection.getConnection().channel; + if (player instanceof ClientPlayerEntity) { + return ((ClientPlayerEntity) player).networkHandler.getConnection().channel; } return super.getChannel(player); } diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index 8df1330a2..64e104f8f 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -20,7 +20,7 @@ ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": ">=0.15.11", + "fabricloader": "*", "minecraft": ">=1.20.5" } } diff --git a/fabric/mc1211/src/main/resources/packetevents.accesswidener b/fabric/mc1211/src/main/resources/packetevents.accesswidener index 196849005..3c32feda6 100644 --- a/fabric/mc1211/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1211/src/main/resources/packetevents.accesswidener @@ -2,9 +2,7 @@ accessWidener v2 named # fields -accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; -accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; -accessible field net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; +accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; # methods diff --git a/fabric/mc1214/build.gradle.kts b/fabric/mc1214/build.gradle.kts index 9926d7f42..36cf7b027 100644 --- a/fabric/mc1214/build.gradle.kts +++ b/fabric/mc1214/build.gradle.kts @@ -1,14 +1,10 @@ val minecraft_version: String by project -val parchment_minecraft_version: String by project -val parchment_mappings: String by project +val yarn_mappings: String by project dependencies { compileOnly(project(":fabric:mc1211", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") - mappings(loom.layered { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-$parchment_minecraft_version:$parchment_mappings") - }) + mappings("net.fabricmc:yarn:$yarn_mappings") } \ No newline at end of file diff --git a/fabric/mc1214/gradle.properties b/fabric/mc1214/gradle.properties index 85a8363ff..d7c139fae 100644 --- a/fabric/mc1214/gradle.properties +++ b/fabric/mc1214/gradle.properties @@ -5,5 +5,4 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.4 -parchment_mappings=2025.02.16 -parchment_minecraft_version=1.21.4 \ No newline at end of file +yarn_mappings=1.21.4+build.8:v2 \ No newline at end of file diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java index eca68954d..f73e883da 100644 --- a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java +++ b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java @@ -3,19 +3,16 @@ import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; import io.github.retrooper.packetevents.FabricItemType; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; +import net.minecraft.item.Item; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; public class Fabric1214ItemRegistry implements ItemRegistry { @Override - public @Nullable ItemType getByName(String name) { - Optional> optionalItemReference = BuiltInRegistries.ITEM.get(ResourceLocation.parse(name)); - return optionalItemReference.isPresent() ? new FabricItemType(optionalItemReference.get().value()) : null; + public @NotNull ItemType getByName(String name) { + Item item = Registries.ITEM.get(Identifier.tryParse(name)); // returns default entry if item doesn't exist + return new FabricItemType(item); } } \ No newline at end of file diff --git a/fabric/mc1214/src/main/resources/fabric.mod.json b/fabric/mc1214/src/main/resources/fabric.mod.json index 837ec8664..f5ebb13c9 100644 --- a/fabric/mc1214/src/main/resources/fabric.mod.json +++ b/fabric/mc1214/src/main/resources/fabric.mod.json @@ -20,7 +20,7 @@ ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": ">=0.15.11", + "fabricloader": "*", "minecraft": ">=1.21.2" } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java b/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java index 35dd471d4..68ed8439b 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java @@ -6,8 +6,10 @@ import com.github.retrooper.packetevents.protocol.world.states.type.StateType; import com.github.retrooper.packetevents.resources.ResourceLocation; import java.util.Set; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.item.Item; + +import net.minecraft.item.Item; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import org.jetbrains.annotations.Nullable; public class FabricItemType implements ItemType { @@ -20,17 +22,17 @@ public FabricItemType(Item item) { @Override public int getMaxAmount() { - return item.getMaxStackSize(); + return item.getMaxAmount(); } @Override public int getMaxDurability() { - return item.getMaxDamage(); + return item.getDurability(); } @Override public ItemType getCraftRemainder() { - return new FabricItemType(item.getCraftingRemainingItem()); + return new FabricItemType(item.getRecipeRemainder()); } @Override @@ -45,13 +47,13 @@ public Set getAttributes() { @Override public ResourceLocation getName() { - net.minecraft.resources.ResourceLocation resourceLocation = BuiltInRegistries.ITEM.getKey(item); + Identifier resourceLocation = Registry.ITEM.getId(item); return new ResourceLocation(resourceLocation.getNamespace(), resourceLocation.getPath()); } @Override public int getId(ClientVersion version) { - return BuiltInRegistries.ITEM.getId(item); + return Registry.ITEM.getRawId(item); } @Override diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java similarity index 100% rename from fabric/src/client/java/io/github/retrooper/packetevents/PacketEventsClientMod.java rename to fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java index 55f9f1943..a9b8962a7 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java @@ -19,7 +19,6 @@ package io.github.retrooper.packetevents.factory.fabric; import com.github.retrooper.packetevents.PacketEventsAPI; -import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.injector.ChannelInjector; import com.github.retrooper.packetevents.protocol.PacketSide; import com.github.retrooper.packetevents.protocol.player.User; @@ -27,7 +26,7 @@ import io.github.retrooper.packetevents.handler.PacketEncoder; import io.netty.channel.Channel; import net.fabricmc.api.EnvType; -import net.minecraft.world.entity.player.Player; +import net.minecraft.entity.player.PlayerEntity; import static com.github.retrooper.packetevents.PacketEvents.DECODER_NAME; import static com.github.retrooper.packetevents.PacketEvents.ENCODER_NAME; @@ -82,8 +81,8 @@ public void setPlayer(Object channel, Object player) { return; // this channel isn't injected by packetevents } Channel ch = (Channel) channel; - ((PacketDecoder) ch.pipeline().get(DECODER_NAME)).player = (Player) player; - ((PacketEncoder) ch.pipeline().get(ENCODER_NAME)).player = (Player) player; + ((PacketDecoder) ch.pipeline().get(DECODER_NAME)).player = (PlayerEntity) player; + ((PacketEncoder) ch.pipeline().get(ENCODER_NAME)).player = (PlayerEntity) player; } @Override diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 7d297d600..07a310d97 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -40,14 +40,11 @@ import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Locale; +import java.util.logging.Logger; public class FabricPacketEventsAPI extends PacketEventsAPI { - private static final Logger LOGGER = LoggerFactory.getLogger("PacketEvents"); - private final String modId; private final EnvType environment; private final PacketEventsSettings settings; @@ -56,7 +53,7 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private final ServerManager serverManager; private final ChannelInjector injector; private final NettyManager nettyManager = new NettyManagerImpl(); - private final LogManager logManager = new FabricLogger(LOGGER); + private final LogManager logManager = new FabricLogger(Logger.getLogger("PacketEvents")); private boolean loaded; private boolean initialized; diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java similarity index 100% rename from fabric/src/client/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java rename to fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 8ed8839ef..56211e1c9 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -26,7 +26,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import net.minecraft.world.entity.player.Player; +import net.minecraft.entity.player.PlayerEntity; import org.jetbrains.annotations.ApiStatus; import java.util.List; @@ -36,7 +36,7 @@ public class PacketDecoder extends MessageToMessageDecoder { private final PacketSide side; public User user; - public Player player; + public PlayerEntity player; public PacketDecoder(PacketSide side, User user) { this.side = side.getOpposite(); diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 9b84add91..3f0dd6219 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -43,10 +43,11 @@ import io.netty.util.ReferenceCountUtil; import java.lang.reflect.InvocationTargetException; import java.util.List; -import net.minecraft.network.CompressionDecoder; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketDeflater; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -55,7 +56,7 @@ public class PacketEncoder extends ChannelOutboundHandlerAdapter { private final PacketSide side; public User user; - public Player player; + public PlayerEntity player; private ChannelPromise promise; private boolean handledCompression; private final boolean isPre1_20_5 = PacketEvents.getAPI().getServerManager().getVersion().isOlderThan( @@ -161,7 +162,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E if (PacketEvents.getAPI().getSettings().isKickOnPacketExceptionEnabled()) { try { - if (user != null && player instanceof ServerPlayer) { + if (user != null && player instanceof ServerPlayerEntity) { // Use cross-platform PacketEvents wrapper for disconnect packet WrapperPlayServerDisconnect disconnectPacket = new WrapperPlayServerDisconnect( net.kyori.adventure.text.Component.text("Invalid packet") @@ -173,10 +174,11 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E } ctx.channel().close(); - if (player instanceof ServerPlayer serverPlayer) { + if (player instanceof ServerPlayerEntity serverPlayer) { // Schedule delayed kick (Fabric-specific, using Minecraft's scheduler) serverPlayer.getServer().execute(() -> { - serverPlayer.connection.disconnect(Component.literal("Invalid packet")); +// serverPlayer.connection.disconnect(Component.literal("Invalid packet")); + serverPlayer.networkHandler.disconnect(new TextComponent("Invalid packet")); }); } @@ -230,7 +232,7 @@ private ChannelHandlerContext tryFixCompressorOrder(ChannelHandlerContext ctx, B } private void decompress(ChannelPipeline pipe, ByteBuf buffer) { - CompressionDecoder decompressor = (CompressionDecoder) pipe.get("decompress"); + PacketDeflater decompressor = (PacketDeflater) pipe.get("decompress"); ChannelHandlerContext decompressorCtx = pipe.context("decompress"); ByteBuf decompressed = null; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java index 29332298a..aba7c2757 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java @@ -21,22 +21,10 @@ import com.github.retrooper.packetevents.util.LogManager; import net.kyori.adventure.text.format.NamedTextColor; import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.event.Level; - -import java.util.Map; +import java.util.logging.Logger; public class FabricLogger extends LogManager { - private static final Map LEVEL_CONVERSION = Map.of( - java.util.logging.Level.FINEST, Level.TRACE, - java.util.logging.Level.FINER, Level.TRACE, - java.util.logging.Level.FINE, Level.DEBUG, - java.util.logging.Level.INFO, Level.INFO, - java.util.logging.Level.WARNING, Level.WARN, - java.util.logging.Level.SEVERE, Level.ERROR - ); - private final Logger logger; public FabricLogger(Logger logger) { @@ -46,7 +34,6 @@ public FabricLogger(Logger logger) { @Override protected void log(java.util.logging.Level level, @Nullable NamedTextColor color, String message) { String plainMessage = STRIP_COLOR_PATTERN.matcher(message).replaceAll(""); - Level logLevel = LEVEL_CONVERSION.getOrDefault(level, Level.INFO); - this.logger.makeLoggingEventBuilder(logLevel).log(plainMessage); + this.logger.log(level, plainMessage); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java index 21c2d462c..fb65c66af 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java @@ -30,7 +30,7 @@ public class FabricServerManager extends ServerManagerAbstract { private ServerVersion version; private ServerVersion resolveVersion() { - String mcVersion = SharedConstants.getCurrentVersion().getId(); + String mcVersion = SharedConstants.getGameVersion().getId(); for (ServerVersion version : ServerVersion.reversedValues()) { if (mcVersion.contains(version.getReleaseName())) { return version; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java index 2db5161f6..b8c49ca40 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java @@ -29,7 +29,7 @@ import java.util.List; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.MappingResolver; -import net.minecraft.network.CompressionDecoder; +import net.minecraft.network.PacketDeflater; public class FabricCustomPipelineUtil { private static final MethodHandle FABRIC_PACKET_DECODE_BYTEBUF; @@ -40,7 +40,7 @@ public class FabricCustomPipelineUtil { MappingResolver resolver = FabricLoader.getInstance().getMappingResolver(); // Get the runtime (potentially obfuscated) class for CompressionDecoder - Class compressionDecoderClass = CompressionDecoder.class; + Class compressionDecoderClass = PacketDeflater.class; // Map the method name from intermediary to runtime (obfuscated) names String intermediaryMethodName = "decode"; // Intermediary method name @@ -81,7 +81,7 @@ public class FabricCustomPipelineUtil { } } - public static List callPacketDecodeByteBuf(CompressionDecoder decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { + public static List callPacketDecodeByteBuf(PacketDeflater decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { List output = new ArrayList<>(1); try { FABRIC_PACKET_DECODE_BYTEBUF.invokeExact(decoder, ctx, msg, output); diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index 40f8d764d..a32cbc32d 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -21,18 +21,19 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import net.minecraft.SharedConstants; +import net.minecraft.network.NetworkSide; import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.PacketFlow; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.network.ServerPlayerEntity; public class FabricInjectionUtil { private static final String VIA_DECODER_NAME = "via-decoder"; private static final String VIA_ENCODER_NAME = "via-encoder"; private static final ClientVersion CLIENT_VERSION = - ClientVersion.getById(SharedConstants.getProtocolVersion()); + ClientVersion.getById(SharedConstants.getGameVersion().getProtocolVersion()); - public static void injectAtPipelineBuilder(ChannelPipeline pipeline, PacketFlow flow) { + public static void injectAtPipelineBuilder(ChannelPipeline pipeline, NetworkSide flow) { PacketSide pipelineSide = switch (flow) { case CLIENTBOUND -> PacketSide.CLIENT; case SERVERBOUND -> PacketSide.SERVER; @@ -104,7 +105,7 @@ public static void reorderHandlers(ChannelHandlerContext ctx, PacketSide side) { FabricPacketEventsAPI.getAPI(side).getLogManager().debug("Pipeline after reorder: " + pipeline.names()); } - public static void fireUserLoginEvent(ServerPlayer player) { + public static void fireUserLoginEvent(ServerPlayerEntity player) { FabricPacketEventsAPI api = FabricPacketEventsAPI.getServerAPI(); User user = api.getPlayerManager().getUser(player); @@ -115,7 +116,8 @@ public static void fireUserLoginEvent(ServerPlayer player) { if (!FakeChannelUtil.isFakeChannel(channelObj) && (!api.isTerminated() || api.getSettings().isKickIfTerminated())) { // Kick the player if they're not a fake player - player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); + // player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); + player.networkHandler.disconnect(new TextComponent("PacketEvents 2.0 failed to inject")); } return; } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java index 2b3ec6c8b..d0553bd7e 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java @@ -1,7 +1,6 @@ package io.github.retrooper.packetevents.util.viaversion; import com.github.retrooper.packetevents.protocol.player.User; -import net.minecraft.server.level.ServerPlayer; public interface ViaVersionAccessor { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java index 675672550..1600bf8fd 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java @@ -3,12 +3,10 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.reflection.Reflection; -import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; import io.netty.channel.Channel; import java.lang.reflect.Field; -import net.minecraft.server.level.ServerPlayer; public class ViaVersionAccessorImpl implements ViaVersionAccessor { diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 78cfeb311..5582fe056 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -24,6 +24,6 @@ ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": ">=0.15.11" + "fabricloader": "*" } } diff --git a/fabric/src/main/resources/packetevents.accesswidener b/fabric/src/main/resources/packetevents.accesswidener index a239a3f09..7137a9493 100644 --- a/fabric/src/main/resources/packetevents.accesswidener +++ b/fabric/src/main/resources/packetevents.accesswidener @@ -1,8 +1,8 @@ accessWidener v2 named # fields -accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; -accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; +#accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; +#accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; # methods # classes From 3bf9a329d662d02e5ffc6d4e0096f34813b63405 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Fri, 4 Apr 2025 23:52:00 -0400 Subject: [PATCH 33/43] Support Fabric 1.14 - 1.21.4 --- fabric/build.gradle.kts | 40 +++++----- fabric/{mc1201 => mc1140}/build.gradle.kts | 16 ++++ fabric/{mc1201 => mc1140}/gradle.properties | 4 +- .../Fabric1140ChainLoadEntrypoint.java} | 14 ++-- .../Fabric1140ClientChainLoadEntrypoint.java} | 10 +-- .../Fabric1140ClientPlayerManager.java} | 8 +- .../Fabric1140ServerPlayerManager.java} | 10 +-- .../ClientPlayerNetworkHandlerMixin.java | 76 +++++++++++++++++++ .../mixin/MixinClientConnectionChInit.java | 27 +++++++ .../mixin/MixinServerNetworkIoChInit.java | 27 +++++++ .../mc1140}/mixin/PlayerManagerMixin.java | 4 +- .../mixin/PlayerManagerRespawnMixin.java | 9 ++- .../registry/Fabric1140ItemRegistry.java | 24 ++++++ .../src/main/resources/fabric.mod.json | 13 ++-- .../packetevents-mc1140.mixins.json} | 7 +- .../main/resources/packetevents.accesswidener | 2 +- fabric/mc1194/build.gradle.kts | 22 ++++++ fabric/mc1194/gradle.properties | 8 ++ .../mc1914}/mixin/ClientConnectionMixin.java | 30 +++----- .../registry/Fabric1193ItemRegistry.java} | 11 +-- .../mc1194/src/main/resources/fabric.mod.json | 21 +++++ .../packetevents-mc1914.mixins.json} | 3 +- .../main/resources/packetevents.accesswidener | 9 +++ fabric/mc1202/build.gradle.kts | 12 ++- .../ClientPlayerNetworkHandlerMixin.java} | 17 +++-- .../fabric/Fabric1202ServerPlayerManager.java | 4 +- .../mc1202/src/main/resources/fabric.mod.json | 4 +- fabric/mc1211/build.gradle.kts | 12 ++- .../mc1211/src/main/resources/fabric.mod.json | 7 +- fabric/mc1214/build.gradle.kts | 10 +++ .../mc1214/Fabric1214ChainLoadEntrypoint.java | 4 +- .../mc1214/src/main/resources/fabric.mod.json | 7 +- .../resources/packetevents-mc1214.mixins.json | 15 ---- .../main/resources/packetevents.accesswidener | 1 + .../packetevents/handler/PacketEncoder.java | 3 +- .../manager/FabricServerManager.java | 5 +- .../util/FabricCustomPipelineUtil.java | 7 +- .../util/FabricInjectionUtil.java | 5 -- .../main/resources/packetevents.accesswidener | 3 +- libs.versions.toml | 2 +- settings.gradle.kts | 3 +- 41 files changed, 376 insertions(+), 140 deletions(-) rename fabric/{mc1201 => mc1140}/build.gradle.kts (54%) rename fabric/{mc1201 => mc1140}/gradle.properties (74%) rename fabric/{mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java => mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java} (70%) rename fabric/{mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java => mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java} (55%) rename fabric/{mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java => mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java} (89%) rename fabric/{mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java => mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java} (83%) create mode 100644 fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java create mode 100644 fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java create mode 100644 fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java rename fabric/{mc1201/src/main/java/io/github/retrooper/packetevents/mc1201 => mc1140/src/main/java/io/github/retrooper/packetevents/mc1140}/mixin/PlayerManagerMixin.java (95%) rename fabric/{mc1201/src/main/java/io/github/retrooper/packetevents/mc1201 => mc1140/src/main/java/io/github/retrooper/packetevents/mc1140}/mixin/PlayerManagerRespawnMixin.java (88%) create mode 100644 fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java rename fabric/{mc1201 => mc1140}/src/main/resources/fabric.mod.json (57%) rename fabric/{mc1201/src/main/resources/packetevents-mc1201.mixins.json => mc1140/src/main/resources/packetevents-mc1140.mixins.json} (64%) rename fabric/{mc1201 => mc1140}/src/main/resources/packetevents.accesswidener (76%) create mode 100644 fabric/mc1194/build.gradle.kts create mode 100644 fabric/mc1194/gradle.properties rename fabric/{mc1201/src/main/java/io/github/retrooper/packetevents/mc1201 => mc1194/src/main/java/io/github/retrooper/packetevents/mc1914}/mixin/ClientConnectionMixin.java (53%) rename fabric/{mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java => mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java} (64%) create mode 100644 fabric/mc1194/src/main/resources/fabric.mod.json rename fabric/{mc1211/src/main/resources/packetevents-mc1211.mixins.json => mc1194/src/main/resources/packetevents-mc1914.mixins.json} (71%) create mode 100644 fabric/mc1194/src/main/resources/packetevents.accesswidener rename fabric/{mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java => mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java} (84%) delete mode 100644 fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 977113261..82de4ad4c 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -70,20 +70,25 @@ allprojects { loom { mixin { - // Replaces strings in annotations instead of using refmap - // This allows us to write mixins that target methodName* and have them work across versions - // Even as the signature changes without having to use @Dynamic and intermeediary names - // This preserves some compile-time safety, reduces jar size but be careful to not inject into wrong methods - useLegacyMixinAp = false + // Replaces strings in annotations instead of using refmap + // This allows us to write mixins that target methodName* and have them work across versions + // Even as the signature changes without having to use @Dynamic and intermediary names + // This preserves some compile-time safety, reduces jar size but be careful to not inject into wrong methods + useLegacyMixinAp.set(false) } - accessWidenerPath = sourceSets.main.get().resources.srcDirs.single() + val accessWidenerFile = sourceSets["main"].resources.srcDirs.first() .resolve("${rootProject.name}.accesswidener") + + if (accessWidenerFile.exists()) { + accessWidenerPath.set(accessWidenerFile) + } } } subprojects { version = rootProject.version + val minecraft_version: String by project repositories { maven { @@ -98,22 +103,23 @@ subprojects { compileOnly(project(":fabric", configuration = "namedElements")) } - loom { - splitEnvironmentSourceSets() - mods { - register("packetevents-${project.name}") { - sourceSet(sourceSets.main.get()) - sourceSet(sourceSets.maybeCreate("client")) - } - } - } - // version replacement already processed for :fabric in packetevents.`library-conventions` tasks { processResources { + // Declare the inputs to allow Gradle to track changes inputs.property("version", project.version) + inputs.property("modName", "packetevents-${project.name}") + inputs.property("minecraft_version", minecraft_version) // Add if you use this + + // Match and expand variables in fabric.mod.json filesMatching("fabric.mod.json") { - expand("version" to project.version) + expand( + mapOf( + "version" to project.version, + "modName" to "packetevents-${project.name}", + "minecraft_version" to minecraft_version // Or pull from a variable + ) + ) } } } diff --git a/fabric/mc1201/build.gradle.kts b/fabric/mc1140/build.gradle.kts similarity index 54% rename from fabric/mc1201/build.gradle.kts rename to fabric/mc1140/build.gradle.kts index ec88d7e7a..3ab7a9261 100644 --- a/fabric/mc1201/build.gradle.kts +++ b/fabric/mc1140/build.gradle.kts @@ -1,8 +1,24 @@ val minecraft_version: String by project val yarn_mappings: String by project +plugins { + alias(libs.plugins.fabric.loom) +} + +repositories { + mavenCentral() +} + dependencies { // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") mappings("net.fabricmc:yarn:$yarn_mappings") +} + +loom { + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + } + } } \ No newline at end of file diff --git a/fabric/mc1201/gradle.properties b/fabric/mc1140/gradle.properties similarity index 74% rename from fabric/mc1201/gradle.properties rename to fabric/mc1140/gradle.properties index eea9de36a..3fbc6e9eb 100644 --- a/fabric/mc1201/gradle.properties +++ b/fabric/mc1140/gradle.properties @@ -4,5 +4,5 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.20.1 -yarn_mappings=1.20.1+build.10:v2 +minecraft_version=1.14 +yarn_mappings=1.14+build.21 \ No newline at end of file diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java similarity index 70% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java index bfe36a527..98cd74bbc 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/Fabric1201ChainLoadEntrypoint.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java @@ -1,30 +1,30 @@ -package io.github.retrooper.packetevents.mc1201; +package io.github.retrooper.packetevents.mc1140; import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; -import io.github.retrooper.packetevents.mc1201.registry.Fabric1201ItemRegistry; +import io.github.retrooper.packetevents.mc1140.registry.Fabric1140ItemRegistry; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; -import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; +import io.github.retrooper.packetevents.mc1140.factory.fabric.Fabric1140ServerPlayerManager; -public class Fabric1201ChainLoadEntrypoint implements ChainLoadEntryPoint { +public class Fabric1140ChainLoadEntrypoint implements ChainLoadEntryPoint { - protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1201ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1140ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); @Override public void initialize(ChainLoadData chainLoadData) { chainLoadData.setPlayerManagerIfNull(playerManagerAbstractLazyHolder); // Set default registry manager if not already set by any entrypoint chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> new FabricRegistryManager( - new Fabric1201ItemRegistry() + new Fabric1140ItemRegistry() ))); } @Override public ServerVersion getNativeVersion() { - return ServerVersion.V_1_20_1; + return ServerVersion.V_1_14; } } diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java similarity index 55% rename from fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java index 30fccef12..a5f520571 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/Fabric1201ClientChainLoadEntrypoint.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java @@ -1,14 +1,14 @@ -package io.github.retrooper.packetevents.mc1201; +package io.github.retrooper.packetevents.mc1140; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.loader.ChainLoadData; -import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ClientPlayerManager; +import io.github.retrooper.packetevents.mc1140.factory.fabric.Fabric1140ClientPlayerManager; +import io.github.retrooper.packetevents.util.LazyHolder; -public class Fabric1201ClientChainLoadEntrypoint extends Fabric1201ChainLoadEntrypoint { +public class Fabric1140ClientChainLoadEntrypoint extends Fabric1140ChainLoadEntrypoint { @Override public void initialize(ChainLoadData chainLoadData) { - chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1201ClientPlayerManager(FabricPacketEventsAPI.getClientAPI()))); + chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1140ClientPlayerManager(FabricPacketEventsAPI.getClientAPI()))); } } diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java similarity index 89% rename from fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java index b756a41a8..7aa494c05 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ClientPlayerManager.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java @@ -16,16 +16,16 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mc1201.factory.fabric; +package io.github.retrooper.packetevents.mc1140.factory.fabric; import com.github.retrooper.packetevents.PacketEventsAPI; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import org.jetbrains.annotations.NotNull; -public class Fabric1201ClientPlayerManager extends Fabric1201ServerPlayerManager { +public class Fabric1140ClientPlayerManager extends Fabric1140ServerPlayerManager { - public Fabric1201ClientPlayerManager(PacketEventsAPI packetEventsAPI) { + public Fabric1140ClientPlayerManager(PacketEventsAPI packetEventsAPI) { super(packetEventsAPI); } @@ -48,7 +48,7 @@ public int getPing(@NotNull Object playerObj) { @Override public Object getChannel(@NotNull Object player) { if (player instanceof ClientPlayerEntity) { - return ((ClientPlayerEntity) player).networkHandler.getConnection().channel; + return ((ClientPlayerEntity) player).networkHandler.connection.channel; } return super.getChannel(player); } diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java similarity index 83% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java index c97a7f85c..e09296bdc 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/factory/fabric/Fabric1201ServerPlayerManager.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java @@ -16,23 +16,23 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mc1201.factory.fabric; +package io.github.retrooper.packetevents.mc1140.factory.fabric; import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; -public class Fabric1201ServerPlayerManager extends AbstractFabricPlayerManager { +public class Fabric1140ServerPlayerManager extends AbstractFabricPlayerManager { - public Fabric1201ServerPlayerManager(PacketEventsAPI packetEventsAPI) { + public Fabric1140ServerPlayerManager(PacketEventsAPI packetEventsAPI) { super(packetEventsAPI); } @Override public int getPing(@NotNull Object player) { if (player instanceof ServerPlayerEntity) { - return ((ServerPlayerEntity) player).pingMilliseconds; // pingMilliseconds in modern yarn + return ((ServerPlayerEntity) player).field_13967; // pingMilliseconds in modern yarn } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } @@ -40,7 +40,7 @@ public int getPing(@NotNull Object player) { @Override public Object getChannel(@NotNull Object player) { if (player instanceof ServerPlayerEntity) { - return ((ServerPlayerEntity) player).networkHandler.connection.channel; + return ((ServerPlayerEntity) player).networkHandler.client.channel; } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java new file mode 100644 index 000000000..cc7a8afe9 --- /dev/null +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java @@ -0,0 +1,76 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1140.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.network.ClientConnection; +import org.objectweb.asm.Opcodes; +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; + +@Mixin(ClientPlayNetworkHandler.class) +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), + } +) +public abstract class ClientPlayerNetworkHandlerMixin { + @Shadow @Final public ClientConnection connection; + + /** + * @reason Associate connection instance with player instance + */ + @Inject( + method = "onGameJoin", + at = @At( + value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/client/MinecraftClient;player:Lnet/minecraft/client/network/ClientPlayerEntity;", + shift = At.Shift.AFTER + ) + ) + private void postLoginPlayerConstruct(CallbackInfo ci) { + FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.connection.channel, MinecraftClient.getInstance().player); + } + + /** + * @reason Minecraft creates a new player instance on respawn + */ + @Inject( + method = "onPlayerRespawn", + at = @At( + // inject immediately after new player instance has been created + value = "INVOKE", + target = "Lnet/minecraft/client/network/ClientPlayerEntity;setEntityId(I)V" + ) + ) + private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) ClientPlayerEntity player) { + FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.connection.channel, player); + } +} diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java new file mode 100644 index 000000000..a74f918ce --- /dev/null +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java @@ -0,0 +1,27 @@ +package io.github.retrooper.packetevents.mc1140.mixin; + +import io.github.retrooper.packetevents.util.FabricInjectionUtil; +import io.netty.channel.Channel; +import io.netty.channel.socket.SocketChannel; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; +import net.minecraft.network.NetworkSide; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "net.minecraft.network.ClientConnection$1", priority = 1500) // Priority of 1500 to Inject after via +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {"<1.19.4"}), + } +) +public class MixinClientConnectionChInit { + @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false) + private void onInitChannel(Channel channel, CallbackInfo ci) { + if (channel instanceof SocketChannel) { + FabricInjectionUtil.injectAtPipelineBuilder(channel.pipeline(), NetworkSide.CLIENTBOUND); + } + } +} diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java new file mode 100644 index 000000000..f25bc0e6f --- /dev/null +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java @@ -0,0 +1,27 @@ +package io.github.retrooper.packetevents.mc1140.mixin; + +import io.github.retrooper.packetevents.util.FabricInjectionUtil; +import io.netty.channel.Channel; +import io.netty.channel.socket.SocketChannel; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; +import net.minecraft.network.NetworkSide; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "net.minecraft.server.ServerNetworkIo$1", priority = 1500) // Priority of 1500 to Inject after via +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {"<1.19.4"}), + } +) +public class MixinServerNetworkIoChInit { + @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false) + private void onInitChannel(Channel channel, CallbackInfo ci) { + if (channel instanceof SocketChannel) { + FabricInjectionUtil.injectAtPipelineBuilder(channel.pipeline(), NetworkSide.SERVERBOUND); + } + } +} diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerMixin.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java similarity index 95% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerMixin.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java index b3a00d755..16583debf 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerMixin.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mc1201.mixin; +package io.github.retrooper.packetevents.mc1140.mixin; import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; @@ -54,7 +54,7 @@ private void onPlayerConnect( method = "onPlayerConnect*", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/PlayerManager;sendToAll(Lnet/minecraft/network/packet/Packet;)V", + target = "Lnet/minecraft/server/PlayerManager;sendToAll(Lnet/minecraft/network/Packet;)V", shift = At.Shift.AFTER ) ) diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerRespawnMixin.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java similarity index 88% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerRespawnMixin.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java index 4f7e2dc62..5675ccd18 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/PlayerManagerRespawnMixin.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents.mc1201.mixin; +package io.github.retrooper.packetevents.mc1140.mixin; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.netty.channel.Channel; @@ -13,7 +13,7 @@ @Restriction( require = { - @Condition(value = "minecraft", versionPredicates = {"<1.20.2"}), + @Condition(value = "minecraft", versionPredicates = {"<1.15.2"}), } ) @Mixin(PlayerManager.class) @@ -26,11 +26,12 @@ public class PlayerManagerRespawnMixin { */ @Inject( method = "respawnPlayer*", - at = @At("RETURN") + at = @At("RETURN"), + require = 1 ) private void postRespawn(CallbackInfoReturnable cir) { ServerPlayerEntity player = cir.getReturnValue(); - Channel channel = player.networkHandler.connection.channel; + Channel channel = player.networkHandler.client.channel; FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(channel, player); } } diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java new file mode 100644 index 000000000..895a73c83 --- /dev/null +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java @@ -0,0 +1,24 @@ +package io.github.retrooper.packetevents.mc1140.registry; + +import com.github.retrooper.packetevents.manager.registry.ItemRegistry; +import com.github.retrooper.packetevents.protocol.item.type.ItemType; +//import io.github.retrooper.packetevents.FabricItemType; +//import net.minecraft.item.Item; +//import net.minecraft.registry.Registries; +//import net.minecraft.util.Identifier; +import io.github.retrooper.packetevents.FabricItemType; +import net.minecraft.item.Item; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class Fabric1140ItemRegistry implements ItemRegistry { + + @Override + public @Nullable ItemType getByName(String name) { + Optional item = Registry.ITEM.getOrEmpty(Identifier.createSplit(name, ':')); + return item.isPresent() ? new FabricItemType(item.get()) : null; + } +} diff --git a/fabric/mc1201/src/main/resources/fabric.mod.json b/fabric/mc1140/src/main/resources/fabric.mod.json similarity index 57% rename from fabric/mc1201/src/main/resources/fabric.mod.json rename to fabric/mc1140/src/main/resources/fabric.mod.json index ffdce8bb5..a18cef49a 100644 --- a/fabric/mc1201/src/main/resources/fabric.mod.json +++ b/fabric/mc1140/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "packetevents-mc1201", + "id": "${modName}", "version": "${version}", - "name": "PacketEvents for 1.20.1", + "name": "PacketEvents dependency for ${minecraft_version}+", "description": "", "authors": [ "retrooper" @@ -12,18 +12,17 @@ "environment": "*", "entrypoints": { "mainChainLoad": [ - "io.github.retrooper.packetevents.mc1201.Fabric1201ChainLoadEntrypoint" + "io.github.retrooper.packetevents.mc1140.Fabric1140ChainLoadEntrypoint" ], "clientChainLoad": [ - "io.github.retrooper.packetevents.mc1201.Fabric1201ClientChainLoadEntrypoint" + "io.github.retrooper.packetevents.mc1140.Fabric1140ClientChainLoadEntrypoint" ] }, "mixins": [ - "packetevents-mc1201.mixins.json" + "packetevents-mc1140.mixins.json" ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": "*", - "minecraft": ">=1.20" + "fabricloader": "*" } } diff --git a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json b/fabric/mc1140/src/main/resources/packetevents-mc1140.mixins.json similarity index 64% rename from fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json rename to fabric/mc1140/src/main/resources/packetevents-mc1140.mixins.json index b603bdc44..b914386cd 100644 --- a/fabric/mc1201/src/main/resources/packetevents-mc1201.mixins.json +++ b/fabric/mc1140/src/main/resources/packetevents-mc1140.mixins.json @@ -1,13 +1,14 @@ { "required": true, "minVersion": "0.8", - "package": "io.github.retrooper.packetevents.mc1201.mixin", + "package": "io.github.retrooper.packetevents.mc1140.mixin", "compatibilityLevel": "JAVA_17", "client": [ - "ClientPacketListenerMixin" + "ClientPlayerNetworkHandlerMixin", + "MixinClientConnectionChInit" ], "mixins": [ - "ClientConnectionMixin", + "MixinServerNetworkIoChInit", "PlayerManagerMixin", "PlayerManagerRespawnMixin" ], diff --git a/fabric/mc1201/src/main/resources/packetevents.accesswidener b/fabric/mc1140/src/main/resources/packetevents.accesswidener similarity index 76% rename from fabric/mc1201/src/main/resources/packetevents.accesswidener rename to fabric/mc1140/src/main/resources/packetevents.accesswidener index fac6a4c11..62dbbe743 100644 --- a/fabric/mc1201/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1140/src/main/resources/packetevents.accesswidener @@ -2,8 +2,8 @@ accessWidener v2 named # fields -accessible field net/minecraft/server/network/ServerPlayNetworkHandler connection Lnet/minecraft/network/ClientConnection; accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; +accessible field net/minecraft/client/network/ClientPlayNetworkHandler connection Lnet/minecraft/network/ClientConnection; # methods diff --git a/fabric/mc1194/build.gradle.kts b/fabric/mc1194/build.gradle.kts new file mode 100644 index 000000000..b829f5c4c --- /dev/null +++ b/fabric/mc1194/build.gradle.kts @@ -0,0 +1,22 @@ +val minecraft_version: String by project +val yarn_mappings: String by project + +repositories { + mavenCentral() +} + +dependencies { + // To change the versions, see the gradle.properties file + minecraft("com.mojang:minecraft:$minecraft_version") + mappings("net.fabricmc:yarn:$yarn_mappings") +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } +} \ No newline at end of file diff --git a/fabric/mc1194/gradle.properties b/fabric/mc1194/gradle.properties new file mode 100644 index 000000000..43696b382 --- /dev/null +++ b/fabric/mc1194/gradle.properties @@ -0,0 +1,8 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.19.4 +yarn_mappings=1.19.4+build.2:v2 diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ClientConnectionMixin.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java similarity index 53% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ClientConnectionMixin.java rename to fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java index 84d198e57..5b55b0ec6 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/mixin/ClientConnectionMixin.java +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java @@ -1,26 +1,10 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package io.github.retrooper.packetevents.mc1201.mixin; +package io.github.retrooper.packetevents.mc1914.mixin; import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.ChannelPipeline; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.network.ClientConnection; import net.minecraft.network.NetworkSide; import org.spongepowered.asm.mixin.Mixin; @@ -29,8 +13,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = ClientConnection.class, priority = 1500) // priority to inject after Via +@Restriction( + require = { + @Condition(value = "minecraft", versionPredicates = {">1.19.3"}), + } +) public class ClientConnectionMixin { - @Inject( method = "addHandlers*", at = @At("TAIL"), @@ -43,4 +31,4 @@ private static void addHandlers( ) { FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); } -} +} \ No newline at end of file diff --git a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java similarity index 64% rename from fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java rename to fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java index 182bedd5b..59661e233 100644 --- a/fabric/mc1201/src/main/java/io/github/retrooper/packetevents/mc1201/registry/Fabric1201ItemRegistry.java +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents.mc1201.registry; +package io.github.retrooper.packetevents.mc1914.mixin.registry; import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; @@ -10,16 +10,11 @@ import java.util.Optional; -public class Fabric1201ItemRegistry implements ItemRegistry { +public class Fabric1193ItemRegistry implements ItemRegistry { @Override public @Nullable ItemType getByName(String name) { - Optional item = Registries.ITEM.getOrEmpty(Identifier.tryParse(name)); + Optional item = Registries.ITEM.getOrEmpty(Identifier.splitOn(name, ':')); return item.isPresent() ? new FabricItemType(item.get()) : null; } - - public @Nullable ItemType getByName(String name, boolean test) { - Item item = Registries.ITEM.get(Identifier.tryParse(name)); - return new FabricItemType(item); - } } diff --git a/fabric/mc1194/src/main/resources/fabric.mod.json b/fabric/mc1194/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..73da5c32a --- /dev/null +++ b/fabric/mc1194/src/main/resources/fabric.mod.json @@ -0,0 +1,21 @@ +{ + "schemaVersion": 1, + "id": "${modName}", + "version": "${version}", + "name": "PacketEvents dependency for 1.19.3+ compiled against ${minecraft_version}", + "description": "", + "authors": [ + "retrooper" + ], + "contact": {}, + "license": "GPL-3.0", + "environment": "*", + "mixins": [ + "packetevents-mc1914.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "fabricloader": "*", + "minecraft": ">=1.19.3" + } +} diff --git a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json b/fabric/mc1194/src/main/resources/packetevents-mc1914.mixins.json similarity index 71% rename from fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json rename to fabric/mc1194/src/main/resources/packetevents-mc1914.mixins.json index 6727d618e..a73930faf 100644 --- a/fabric/mc1211/src/main/resources/packetevents-mc1211.mixins.json +++ b/fabric/mc1194/src/main/resources/packetevents-mc1914.mixins.json @@ -1,9 +1,10 @@ { "required": true, "minVersion": "0.8", - "package": "io.github.retrooper.packetevents.mc1211.mixin", + "package": "io.github.retrooper.packetevents.mc1914.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "ClientConnectionMixin" ], "injectors": { "defaultRequire": 1 diff --git a/fabric/mc1194/src/main/resources/packetevents.accesswidener b/fabric/mc1194/src/main/resources/packetevents.accesswidener new file mode 100644 index 000000000..3c32feda6 --- /dev/null +++ b/fabric/mc1194/src/main/resources/packetevents.accesswidener @@ -0,0 +1,9 @@ +accessWidener v2 named + + +# fields +accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; + +# methods + +# classes diff --git a/fabric/mc1202/build.gradle.kts b/fabric/mc1202/build.gradle.kts index 91ed9e6a8..765bc2f7f 100644 --- a/fabric/mc1202/build.gradle.kts +++ b/fabric/mc1202/build.gradle.kts @@ -2,9 +2,19 @@ val minecraft_version: String by project val yarn_mappings: String by project dependencies { - compileOnly(project(":fabric:mc1201", configuration = "namedElements")) + compileOnly(project(":fabric:mc1140", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") mappings("net.fabricmc:yarn:$yarn_mappings") +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } } \ No newline at end of file diff --git a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java b/fabric/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java similarity index 84% rename from fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java rename to fabric/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java index 0c1ffc6f9..218ef532f 100644 --- a/fabric/mc1201/src/client/java/io/github/retrooper/packetevents/mc1201/mixin/ClientPlayPacketListenerMixin.java +++ b/fabric/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java @@ -16,15 +16,14 @@ * along with this program. If not, see . */ -package io.github.retrooper.packetevents.mc1201.mixin; +package io.github.retrooper.packetevents.mc1202.factory.fabric; import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.network.ClientConnection; -import net.minecraft.network.listener.ClientPlayPacketListener; -import net.minecraft.network.listener.TickablePacketListener; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -32,11 +31,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ClientPlayPacketListener.class) -public abstract class ClientPlayPacketListenerMixin implements TickablePacketListener, ClientPlayPacketListener { + +@Mixin(ClientPlayNetworkHandler.class) +public abstract class ClientPlayerNetworkHandlerMixin { @Shadow public abstract ClientConnection getConnection(); - /** + + /* * @reason Associate connection instance with player instance */ @Inject( @@ -60,10 +61,10 @@ private void postLoginPlayerConstruct(CallbackInfo ci) { at = @At( // inject immediately after new player instance has been created value = "INVOKE", - target = "Lnet/minecraft/client/player/LocalPlayer;setId(I)V" + target = "Lnet/minecraft/client/network/ClientPlayerEntity;setId(I)V" ) ) - private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 1) ClientPlayerEntity player) { + private void postRespawnPlayerConstruct(CallbackInfo ci, @Local(ordinal = 0) ClientPlayerEntity player) { FabricPacketEventsAPI.getClientAPI().getInjector().setPlayer(this.getConnection().channel, player); } } diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java index 73593561b..87ae539f5 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java @@ -19,11 +19,11 @@ package io.github.retrooper.packetevents.mc1202.factory.fabric; import com.github.retrooper.packetevents.PacketEventsAPI; -import io.github.retrooper.packetevents.mc1201.factory.fabric.Fabric1201ServerPlayerManager; +import io.github.retrooper.packetevents.mc1140.factory.fabric.Fabric1140ServerPlayerManager; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; -public class Fabric1202ServerPlayerManager extends Fabric1201ServerPlayerManager { +public class Fabric1202ServerPlayerManager extends Fabric1140ServerPlayerManager { public Fabric1202ServerPlayerManager(PacketEventsAPI packetEventsAPI) { super(packetEventsAPI); diff --git a/fabric/mc1202/src/main/resources/fabric.mod.json b/fabric/mc1202/src/main/resources/fabric.mod.json index c90edf92e..dfc03f53c 100644 --- a/fabric/mc1202/src/main/resources/fabric.mod.json +++ b/fabric/mc1202/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "packetevents-mc1202", + "id": "${modName}", "version": "${version}", - "name": "PacketEvents for 1.20.2", + "name": "PacketEvents dependency for ${minecraft_version}+", "description": "", "authors": [ "retrooper" diff --git a/fabric/mc1211/build.gradle.kts b/fabric/mc1211/build.gradle.kts index 413a4bfcd..35a7903df 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric/mc1211/build.gradle.kts @@ -3,9 +3,19 @@ val yarn_mappings: String by project dependencies { compileOnly(project(":fabric:mc1202", configuration = "namedElements")) - compileOnly(project(":fabric:mc1201", configuration = "namedElements")) + compileOnly(project(":fabric:mc1140", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") mappings("net.fabricmc:yarn:$yarn_mappings") +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } } \ No newline at end of file diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index 64e104f8f..df27792ca 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "packetevents-mc1211", + "id": "${modName}", "version": "${version}", - "name": "PacketEvents for 1.21.1", + "name": "PacketEvents dependency for 1.20.5+, built against 1.21.1", "description": "", "authors": [ "retrooper" @@ -15,9 +15,6 @@ "io.github.retrooper.packetevents.mc1211.Fabric1211ClientChainLoadEntrypoint" ] }, - "mixins": [ - "packetevents-mc1211.mixins.json" - ], "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", diff --git a/fabric/mc1214/build.gradle.kts b/fabric/mc1214/build.gradle.kts index 36cf7b027..96da42c68 100644 --- a/fabric/mc1214/build.gradle.kts +++ b/fabric/mc1214/build.gradle.kts @@ -7,4 +7,14 @@ dependencies { // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") mappings("net.fabricmc:yarn:$yarn_mappings") +} + +loom { + splitEnvironmentSourceSets() + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + sourceSet(sourceSets.maybeCreate("client")) + } + } } \ No newline at end of file diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java index a8cd82990..ac7c95611 100644 --- a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java +++ b/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java @@ -6,6 +6,8 @@ import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import io.github.retrooper.packetevents.mc1214.manager.registry.Fabric1214ItemRegistry; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Identifier; public class Fabric1214ChainLoadEntrypoint implements ChainLoadEntryPoint { @@ -18,6 +20,6 @@ public void initialize(ChainLoadData chainLoadData) { @Override public ServerVersion getNativeVersion() { - return ServerVersion.V_1_21_1; + return ServerVersion.V_1_21_4; } } diff --git a/fabric/mc1214/src/main/resources/fabric.mod.json b/fabric/mc1214/src/main/resources/fabric.mod.json index f5ebb13c9..dc1f2fbef 100644 --- a/fabric/mc1214/src/main/resources/fabric.mod.json +++ b/fabric/mc1214/src/main/resources/fabric.mod.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, - "id": "packetevents-mc1214", + "id": "${modName}", "version": "${version}", - "name": "PacketEvents dependency for 1.21.2+, built against 1.21.4", + "name": "PacketEvents dependency for 1.21.2+, compiled against ${minecraft_version}", "description": "", "authors": [ "retrooper" @@ -15,9 +15,6 @@ "io.github.retrooper.packetevents.mc1214.Fabric1214ChainLoadEntrypoint" ] }, - "mixins": [ - "packetevents-mc1214.mixins.json" - ], "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", diff --git a/fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json b/fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json deleted file mode 100644 index 4f1116171..000000000 --- a/fabric/mc1214/src/main/resources/packetevents-mc1214.mixins.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "io.github.retrooper.packetevents.mc1214.mixin", - "compatibilityLevel": "JAVA_17", - "client": [ - - ], - "mixins": [ - - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/fabric/mc1214/src/main/resources/packetevents.accesswidener b/fabric/mc1214/src/main/resources/packetevents.accesswidener index 9ab217396..0a799b02a 100644 --- a/fabric/mc1214/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1214/src/main/resources/packetevents.accesswidener @@ -1 +1,2 @@ accessWidener v2 named +accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 3f0dd6219..1238a7c94 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -46,6 +46,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketDeflater; +import net.minecraft.network.PacketInflater; import net.minecraft.network.chat.TextComponent; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.ApiStatus; @@ -232,7 +233,7 @@ private ChannelHandlerContext tryFixCompressorOrder(ChannelHandlerContext ctx, B } private void decompress(ChannelPipeline pipe, ByteBuf buffer) { - PacketDeflater decompressor = (PacketDeflater) pipe.get("decompress"); + PacketInflater decompressor = (PacketInflater) pipe.get("decompress"); ChannelHandlerContext decompressorCtx = pipe.context("decompress"); ByteBuf decompressed = null; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java index fb65c66af..2b485dcf1 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java @@ -23,6 +23,7 @@ import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.mappings.GlobalRegistryHolder; import io.github.retrooper.packetevents.impl.netty.manager.server.ServerManagerAbstract; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.SharedConstants; public class FabricServerManager extends ServerManagerAbstract { @@ -30,7 +31,9 @@ public class FabricServerManager extends ServerManagerAbstract { private ServerVersion version; private ServerVersion resolveVersion() { - String mcVersion = SharedConstants.getGameVersion().getId(); + String mcVersion = FabricLoader.getInstance().getModContainer("minecraft") + .flatMap(mod -> mod.getMetadata().getVersion().getFriendlyString().describeConstable()) + .orElse("unknown"); for (ServerVersion version : ServerVersion.reversedValues()) { if (mcVersion.contains(version.getReleaseName())) { return version; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java index b8c49ca40..5996a9fc9 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java @@ -19,6 +19,7 @@ */ import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import java.lang.invoke.MethodHandle; @@ -30,6 +31,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.MappingResolver; import net.minecraft.network.PacketDeflater; +import net.minecraft.network.PacketInflater; public class FabricCustomPipelineUtil { private static final MethodHandle FABRIC_PACKET_DECODE_BYTEBUF; @@ -40,7 +42,7 @@ public class FabricCustomPipelineUtil { MappingResolver resolver = FabricLoader.getInstance().getMappingResolver(); // Get the runtime (potentially obfuscated) class for CompressionDecoder - Class compressionDecoderClass = PacketDeflater.class; + Class compressionDecoderClass = PacketInflater.class; // Map the method name from intermediary to runtime (obfuscated) names String intermediaryMethodName = "decode"; // Intermediary method name @@ -81,8 +83,9 @@ public class FabricCustomPipelineUtil { } } - public static List callPacketDecodeByteBuf(PacketDeflater decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { + public static List callPacketDecodeByteBuf(PacketInflater decoder, ChannelHandlerContext ctx, ByteBuf msg) throws InvocationTargetException { List output = new ArrayList<>(1); + try { FABRIC_PACKET_DECODE_BYTEBUF.invokeExact(decoder, ctx, msg, output); } catch (Throwable e) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index a32cbc32d..130d71960 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -20,9 +20,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import net.minecraft.SharedConstants; import net.minecraft.network.NetworkSide; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.server.network.ServerPlayerEntity; @@ -30,9 +28,6 @@ public class FabricInjectionUtil { private static final String VIA_DECODER_NAME = "via-decoder"; private static final String VIA_ENCODER_NAME = "via-encoder"; - private static final ClientVersion CLIENT_VERSION = - ClientVersion.getById(SharedConstants.getGameVersion().getProtocolVersion()); - public static void injectAtPipelineBuilder(ChannelPipeline pipeline, NetworkSide flow) { PacketSide pipelineSide = switch (flow) { case CLIENTBOUND -> PacketSide.CLIENT; diff --git a/fabric/src/main/resources/packetevents.accesswidener b/fabric/src/main/resources/packetevents.accesswidener index 7137a9493..1525705a2 100644 --- a/fabric/src/main/resources/packetevents.accesswidener +++ b/fabric/src/main/resources/packetevents.accesswidener @@ -1,8 +1,7 @@ accessWidener v2 named # fields -#accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; -#accessible field net/minecraft/server/network/ServerGamePacketListenerImpl connection Lnet/minecraft/network/Connection; + # methods # classes diff --git a/libs.versions.toml b/libs.versions.toml index 0c5418cd4..761fdadf2 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -10,7 +10,7 @@ paper = "1.20.6-R0.1-SNAPSHOT" bungeecord = "1.21-R0.1-SNAPSHOT" velocity = "3.4.0-SNAPSHOT" run-paper = "2.3.1" -fabric-loom = "1.10.5" +fabric-loom = "1.10-SNAPSHOT" spongeGradle = "2.2.0" classgraph = "4.8.179" diff --git a/settings.gradle.kts b/settings.gradle.kts index 73f016971..ca18f2ed2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,7 +34,8 @@ include("bungeecord") include("velocity") include("sponge") include("fabric") -include(":fabric:mc1201") +include(":fabric:mc1140") +include(":fabric:mc1194") include(":fabric:mc1202") include(":fabric:mc1211") include(":fabric:mc1214") From 2f5eff73c6ee66697ad65bb6eba7a558e6678f4f Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Fri, 4 Apr 2025 23:57:33 -0400 Subject: [PATCH 34/43] Build latest Fabric submodule against 1.21.5 --- ...java => Fabric1205ClientChainLoadEntrypoint.java} | 7 +++---- ...nager.java => Fabric1205ClientPlayerManager.java} | 4 ++-- fabric/mc1211/src/main/resources/fabric.mod.json | 2 +- fabric/{mc1214 => mc1215}/build.gradle.kts | 0 fabric/{mc1214 => mc1215}/gradle.properties | 4 ++-- .../mc1215/Fabric1212ChainLoadEntrypoint.java} | 12 +++++------- .../manager/registry/Fabric1212ItemRegistry.java} | 4 ++-- .../src/main/resources/fabric.mod.json | 0 .../src/main/resources/packetevents.accesswidener | 0 settings.gradle.kts | 2 +- 10 files changed, 16 insertions(+), 19 deletions(-) rename fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/{Fabric1211ClientChainLoadEntrypoint.java => Fabric1205ClientChainLoadEntrypoint.java} (75%) rename fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/{Fabric1211ClientPlayerManager.java => Fabric1205ClientPlayerManager.java} (94%) rename fabric/{mc1214 => mc1215}/build.gradle.kts (100%) rename fabric/{mc1214 => mc1215}/gradle.properties (75%) rename fabric/{mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java => mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java} (59%) rename fabric/{mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java => mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java} (82%) rename fabric/{mc1214 => mc1215}/src/main/resources/fabric.mod.json (100%) rename fabric/{mc1214 => mc1215}/src/main/resources/packetevents.accesswidener (100%) diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java similarity index 75% rename from fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java rename to fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java index a00844642..937d17f17 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1211ClientChainLoadEntrypoint.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java @@ -2,17 +2,16 @@ import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.loader.ChainLoadData; -import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1211ClientPlayerManager; +import io.github.retrooper.packetevents.mc1211.factory.fabric.Fabric1205ClientPlayerManager; -public class Fabric1211ClientChainLoadEntrypoint implements ChainLoadEntryPoint { +public class Fabric1205ClientChainLoadEntrypoint implements ChainLoadEntryPoint { @Override public void initialize(ChainLoadData chainLoadData) { - chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1211ClientPlayerManager(FabricPacketEventsAPI.getClientAPI()))); + chainLoadData.setClientPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1205ClientPlayerManager(FabricPacketEventsAPI.getClientAPI()))); } @Override diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java similarity index 94% rename from fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java rename to fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java index f4bf0040e..f9a7f3ae3 100644 --- a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1211ClientPlayerManager.java +++ b/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java @@ -25,9 +25,9 @@ import net.minecraft.client.network.PlayerListEntry; import org.jetbrains.annotations.NotNull; -public class Fabric1211ClientPlayerManager extends Fabric1202ServerPlayerManager { +public class Fabric1205ClientPlayerManager extends Fabric1202ServerPlayerManager { - public Fabric1211ClientPlayerManager(PacketEventsAPI packetEventsAPI) { + public Fabric1205ClientPlayerManager(PacketEventsAPI packetEventsAPI) { super(packetEventsAPI); } diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index df27792ca..700b56800 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -12,7 +12,7 @@ "environment": "*", "entrypoints": { "clientChainLoad": [ - "io.github.retrooper.packetevents.mc1211.Fabric1211ClientChainLoadEntrypoint" + "io.github.retrooper.packetevents.mc1211.Fabric1205ClientChainLoadEntrypoint" ] }, "accessWidener": "packetevents.accesswidener", diff --git a/fabric/mc1214/build.gradle.kts b/fabric/mc1215/build.gradle.kts similarity index 100% rename from fabric/mc1214/build.gradle.kts rename to fabric/mc1215/build.gradle.kts diff --git a/fabric/mc1214/gradle.properties b/fabric/mc1215/gradle.properties similarity index 75% rename from fabric/mc1214/gradle.properties rename to fabric/mc1215/gradle.properties index d7c139fae..69cb17f61 100644 --- a/fabric/mc1214/gradle.properties +++ b/fabric/mc1215/gradle.properties @@ -4,5 +4,5 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.21.4 -yarn_mappings=1.21.4+build.8:v2 \ No newline at end of file +minecraft_version=1.21.5 +yarn_mappings=1.21.5+build.1:v2 \ No newline at end of file diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java b/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java similarity index 59% rename from fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java rename to fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java index ac7c95611..d320c73c3 100644 --- a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/Fabric1214ChainLoadEntrypoint.java +++ b/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java @@ -1,25 +1,23 @@ -package io.github.retrooper.packetevents.mc1214; +package io.github.retrooper.packetevents.mc1215; import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; -import io.github.retrooper.packetevents.mc1214.manager.registry.Fabric1214ItemRegistry; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; +import io.github.retrooper.packetevents.mc1215.manager.registry.Fabric1212ItemRegistry; -public class Fabric1214ChainLoadEntrypoint implements ChainLoadEntryPoint { +public class Fabric1212ChainLoadEntrypoint implements ChainLoadEntryPoint { @Override public void initialize(ChainLoadData chainLoadData) { chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> - new FabricRegistryManager(new Fabric1214ItemRegistry()) + new FabricRegistryManager(new Fabric1212ItemRegistry()) )); } @Override public ServerVersion getNativeVersion() { - return ServerVersion.V_1_21_4; + return ServerVersion.V_1_21_5; } } diff --git a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java b/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java similarity index 82% rename from fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java rename to fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java index f73e883da..96c85e6eb 100644 --- a/fabric/mc1214/src/main/java/io/github/retrooper/packetevents/mc1214/manager/registry/Fabric1214ItemRegistry.java +++ b/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents.mc1214.manager.registry; +package io.github.retrooper.packetevents.mc1215.manager.registry; import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; @@ -8,7 +8,7 @@ import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; -public class Fabric1214ItemRegistry implements ItemRegistry { +public class Fabric1212ItemRegistry implements ItemRegistry { @Override public @NotNull ItemType getByName(String name) { diff --git a/fabric/mc1214/src/main/resources/fabric.mod.json b/fabric/mc1215/src/main/resources/fabric.mod.json similarity index 100% rename from fabric/mc1214/src/main/resources/fabric.mod.json rename to fabric/mc1215/src/main/resources/fabric.mod.json diff --git a/fabric/mc1214/src/main/resources/packetevents.accesswidener b/fabric/mc1215/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1214/src/main/resources/packetevents.accesswidener rename to fabric/mc1215/src/main/resources/packetevents.accesswidener diff --git a/settings.gradle.kts b/settings.gradle.kts index ca18f2ed2..483a7595a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -38,6 +38,6 @@ include(":fabric:mc1140") include(":fabric:mc1194") include(":fabric:mc1202") include(":fabric:mc1211") -include(":fabric:mc1214") +include(":fabric:mc1215") // Patch modules include(":patch:adventure-text-serializer-gson") From 5142612741dba90cd8872821837d900f345eeb8c Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 5 Apr 2025 00:09:04 -0400 Subject: [PATCH 35/43] Code cleanup and fix chain loading --- .../mc1140/Fabric1140ChainLoadEntrypoint.java | 2 +- .../registry/Fabric1140ItemRegistry.java | 2 +- .../mc1914/Fabric1913ChainLoadEntrypoint.java | 23 +++++++++++++++++++ .../registry/Fabric1193ItemRegistry.java | 2 +- .../mc1194/src/main/resources/fabric.mod.json | 5 ++++ .../mc1215/src/main/resources/fabric.mod.json | 2 +- .../packetevents/handler/PacketEncoder.java | 1 - 7 files changed, 32 insertions(+), 5 deletions(-) rename fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/{ => manager}/registry/Fabric1140ItemRegistry.java (92%) create mode 100644 fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java rename fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/{mixin => manager}/registry/Fabric1193ItemRegistry.java (91%) diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java index 98cd74bbc..08f855123 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java @@ -3,7 +3,7 @@ import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; -import io.github.retrooper.packetevents.mc1140.registry.Fabric1140ItemRegistry; +import io.github.retrooper.packetevents.mc1140.manager.registry.Fabric1140ItemRegistry; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java similarity index 92% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java rename to fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java index 895a73c83..8b0435122 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/registry/Fabric1140ItemRegistry.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents.mc1140.registry; +package io.github.retrooper.packetevents.mc1140.manager.registry; import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java new file mode 100644 index 000000000..d021a0808 --- /dev/null +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java @@ -0,0 +1,23 @@ +package io.github.retrooper.packetevents.mc1914; + +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.loader.ChainLoadData; +import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; +import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; +import io.github.retrooper.packetevents.mc1914.manager.registry.Fabric1193ItemRegistry; +import io.github.retrooper.packetevents.util.LazyHolder; + +public class Fabric1913ChainLoadEntrypoint implements ChainLoadEntryPoint { + + @Override + public void initialize(ChainLoadData chainLoadData) { + chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> + new FabricRegistryManager(new Fabric1193ItemRegistry()) + )); + } + + @Override + public ServerVersion getNativeVersion() { + return ServerVersion.V_1_19_4; + } +} diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java similarity index 91% rename from fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java rename to fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java index 59661e233..16363ff30 100644 --- a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/registry/Fabric1193ItemRegistry.java +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java @@ -1,4 +1,4 @@ -package io.github.retrooper.packetevents.mc1914.mixin.registry; +package io.github.retrooper.packetevents.mc1914.manager.registry; import com.github.retrooper.packetevents.manager.registry.ItemRegistry; import com.github.retrooper.packetevents.protocol.item.type.ItemType; diff --git a/fabric/mc1194/src/main/resources/fabric.mod.json b/fabric/mc1194/src/main/resources/fabric.mod.json index 73da5c32a..ed857d887 100644 --- a/fabric/mc1194/src/main/resources/fabric.mod.json +++ b/fabric/mc1194/src/main/resources/fabric.mod.json @@ -10,6 +10,11 @@ "contact": {}, "license": "GPL-3.0", "environment": "*", + "entrypoints": { + "mainChainLoad": [ + "io.github.retrooper.packetevents.mc1914.Fabric1913ChainLoadEntrypoint" + ] + }, "mixins": [ "packetevents-mc1914.mixins.json" ], diff --git a/fabric/mc1215/src/main/resources/fabric.mod.json b/fabric/mc1215/src/main/resources/fabric.mod.json index dc1f2fbef..c6845c679 100644 --- a/fabric/mc1215/src/main/resources/fabric.mod.json +++ b/fabric/mc1215/src/main/resources/fabric.mod.json @@ -12,7 +12,7 @@ "environment": "*", "entrypoints": { "mainChainLoad": [ - "io.github.retrooper.packetevents.mc1214.Fabric1214ChainLoadEntrypoint" + "io.github.retrooper.packetevents.mc1215.Fabric1212ChainLoadEntrypoint" ] }, "accessWidener": "packetevents.accesswidener", diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index 1238a7c94..d6e858dd7 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -45,7 +45,6 @@ import java.util.List; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketDeflater; import net.minecraft.network.PacketInflater; import net.minecraft.network.chat.TextComponent; import net.minecraft.server.network.ServerPlayerEntity; From a3f6af6ae5bc5b79aa6d41d5ae2d1b4b5d02e552 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 5 Apr 2025 10:01:02 -0400 Subject: [PATCH 36/43] Stash new registry overrides --- .../packetevents/PacketEventsAPI.java | 5 + .../manager/registry/ItemRegistry.java | 1 + .../protocol/item/type/ItemTypes.java | 6 +- .../play/server/WrapperPlayServerMapData.java | 604 +++++++++--------- .../registry/Fabric1140ItemRegistry.java | 5 + .../registry/Fabric1193ItemRegistry.java | 5 + .../registry/Fabric1212ItemRegistry.java | 17 +- 7 files changed, 336 insertions(+), 307 deletions(-) diff --git a/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java b/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java index 25358ade9..2df543d60 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java +++ b/api/src/main/java/com/github/retrooper/packetevents/PacketEventsAPI.java @@ -102,6 +102,11 @@ public ItemRegistry getItemRegistry() { public @Nullable ItemType getByName(String name) { return null; } + + @Override + public @Nullable ItemType getById(int id) { + return null; + } }; } }; diff --git a/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java b/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java index 48dab1eed..115e29796 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java +++ b/api/src/main/java/com/github/retrooper/packetevents/manager/registry/ItemRegistry.java @@ -5,4 +5,5 @@ public interface ItemRegistry { @Nullable ItemType getByName(String name); + @Nullable ItemType getById(int id); } diff --git a/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java b/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java index 065c64aea..564ff1fc2 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java +++ b/api/src/main/java/com/github/retrooper/packetevents/protocol/item/type/ItemTypes.java @@ -1647,7 +1647,11 @@ public static ItemType define(int maxAmount, String key, ItemType craftRemainder } public static @Nullable ItemType getById(ClientVersion version, int id) { - return REGISTRY.getById(version, id); + ItemType itemType = REGISTRY.getById(version, id); + if (itemType == null) { + return PacketEvents.getAPI().getRegistryManager().getItemRegistry().getById(id); + } + return itemType; } public static ItemType getTypePlacingState(StateType type) { diff --git a/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerMapData.java b/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerMapData.java index efcde021a..e99bafee1 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerMapData.java +++ b/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerMapData.java @@ -1,302 +1,302 @@ -/* - * This file is part of packetevents - https://github.com/retrooper/packetevents - * Copyright (C) 2024 retrooper and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.github.retrooper.packetevents.wrapper.play.server; - -import com.github.retrooper.packetevents.event.PacketSendEvent; -import com.github.retrooper.packetevents.manager.server.ServerVersion; -import com.github.retrooper.packetevents.protocol.item.mapdecoration.MapDecorationType; -import com.github.retrooper.packetevents.protocol.item.mapdecoration.MapDecorationTypes; -import com.github.retrooper.packetevents.protocol.packettype.PacketType; -import com.github.retrooper.packetevents.wrapper.PacketWrapper; -import net.kyori.adventure.text.Component; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -public class WrapperPlayServerMapData extends PacketWrapper { - - private int mapId; - private byte scale; - private boolean trackingPosition; - private boolean locked; - private @Nullable List decorations; - private int columns; - private int rows; - private int x; - private int z; - private byte @Nullable [] data; - - public WrapperPlayServerMapData(PacketSendEvent event) { - super(event); - } - - public WrapperPlayServerMapData(int mapId, byte scale, @Nullable List decorations) { - this(mapId, scale, false, decorations); - } - - public WrapperPlayServerMapData(int mapId, byte scale, boolean locked, @Nullable List decorations) { - this(mapId, scale, false, locked, decorations, 0, 0, 0, 0, null); - } - - public WrapperPlayServerMapData( - int mapId, byte scale, boolean trackingPosition, - boolean locked, @Nullable List decorations, - int columns, int rows, int x, int z, byte @Nullable [] data - ) { - super(PacketType.Play.Server.MAP_DATA); - this.mapId = mapId; - this.scale = scale; - this.trackingPosition = trackingPosition; - this.locked = locked; - this.decorations = decorations; - this.columns = columns; - this.rows = rows; - this.x = x; - this.z = z; - this.data = data; - } - - @Override - public void read() { - this.mapId = this.readVarInt(); - this.scale = this.readByte(); - if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_9) - && this.serverVersion.isOlderThan(ServerVersion.V_1_17)) { - this.trackingPosition = this.readBoolean(); - } - this.locked = this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_14) && this.readBoolean(); - - if (this.serverVersion.isOlderThan(ServerVersion.V_1_17) || this.readBoolean()) { - this.decorations = this.readList(MapDecoration::read); - } - - this.columns = this.readUnsignedByte(); - if (this.columns > 0) { - this.rows = this.readUnsignedByte(); - this.x = this.readUnsignedByte(); - this.z = this.readUnsignedByte(); - this.data = this.readByteArray(); - } - } - - @Override - public void write() { - this.writeVarInt(this.mapId); - this.writeByte(this.scale); - if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_9) - && this.serverVersion.isOlderThan(ServerVersion.V_1_17)) { - this.writeBoolean(this.trackingPosition); - } - if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_14)) { - this.writeBoolean(this.locked); - } - - if (this.decorations != null) { - if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_17)) { - this.writeBoolean(true); // decorations are present - } - this.writeList(this.decorations, MapDecoration::write); - } else if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_17)) { - this.writeBoolean(false); // not present - } else { - // write empty list size - this.writeVarInt(0); - } - - if (this.data != null) { - this.writeByte(this.columns); - if (this.columns > 0) { - this.writeByte(this.rows); - this.writeByte(this.x); - this.writeByte(this.z); - this.writeByteArray(this.data); - } - } else { - this.writeByte(0); // 0 columns mean no data - } - } - - public static class MapDecoration { - - private MapDecorationType type; - private byte x; - private byte y; - private byte direction; // 0 to 15 - private @Nullable Component displayName; - - public MapDecoration(MapDecorationType type, byte x, byte y, byte direction, @Nullable Component displayName) { - this.type = type; - this.x = x; - this.y = y; - this.direction = direction; - this.displayName = displayName; - } - - public static MapDecoration read(PacketWrapper wrapper) { - // first 4 bits determine decoration type, last 4 bits determine rotation below 1.13 - boolean v113 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_13); - byte flags = v113 ? 0 : wrapper.readByte(); - MapDecorationType type = !v113 - ? MapDecorationTypes.getById(wrapper.getServerVersion().toClientVersion(), (flags >> 4) & 0xF) - : wrapper.readMappedEntity(MapDecorationTypes::getById); - - byte x = wrapper.readByte(); - byte y = wrapper.readByte(); - byte direction = (byte) ((v113 ? wrapper.readByte() : flags) & 0xF); - Component displayName = v113 ? wrapper.readOptional(PacketWrapper::readComponent) : null; - return new MapDecoration(type, x, y, direction, displayName); - } - - public static void write(PacketWrapper wrapper, MapDecoration decoration) { - boolean v113 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_13); - if (v113) { - wrapper.writeMappedEntity(decoration.getType()); - } else { - int typeId = decoration.getType().getId(wrapper.getServerVersion().toClientVersion()); - wrapper.writeByte((typeId & 0xF) << 4 | (decoration.getDirection() & 0xF)); - } - - wrapper.writeByte(decoration.getX()); - wrapper.writeByte(decoration.getY()); - if (v113) { - wrapper.writeByte(decoration.getDirection()); - wrapper.writeOptional(decoration.getDisplayName(), PacketWrapper::writeComponent); - } - } - - public MapDecorationType getType() { - return this.type; - } - - public void setType(MapDecorationType type) { - this.type = type; - } - - public byte getX() { - return this.x; - } - - public void setX(byte x) { - this.x = x; - } - - public byte getY() { - return this.y; - } - - public void setY(byte y) { - this.y = y; - } - - public byte getDirection() { - return this.direction; - } - - public void setDirection(byte direction) { - this.direction = direction; - } - - public @Nullable Component getDisplayName() { - return this.displayName; - } - - public void setDisplayName(@Nullable Component displayName) { - this.displayName = displayName; - } - } - - public int getMapId() { - return this.mapId; - } - - public void setMapId(int mapId) { - this.mapId = mapId; - } - - public byte getScale() { - return this.scale; - } - - public void setScale(byte scale) { - this.scale = scale; - } - - public boolean isTrackingPosition() { - return this.trackingPosition; - } - - public void setTrackingPosition(boolean trackingPosition) { - this.trackingPosition = trackingPosition; - } - - public boolean isLocked() { - return this.locked; - } - - public void setLocked(boolean locked) { - this.locked = locked; - } - - public @Nullable List getDecorations() { - return this.decorations; - } - - public void setDecorations(@Nullable List decorations) { - this.decorations = decorations; - } - - public int getColumns() { - return this.columns; - } - - public void setColumns(int columns) { - this.columns = columns; - } - - public int getRows() { - return this.rows; - } - - public void setRows(int rows) { - this.rows = rows; - } - - public int getX() { - return this.x; - } - - public void setX(int x) { - this.x = x; - } - - public int getZ() { - return this.z; - } - - public void setZ(int z) { - this.z = z; - } - - public byte @Nullable [] getData() { - return this.data; - } - - public void setData(byte @Nullable [] data) { - this.data = data; - } -} +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.github.retrooper.packetevents.wrapper.play.server; + +import com.github.retrooper.packetevents.event.PacketSendEvent; +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.protocol.item.mapdecoration.MapDecorationType; +import com.github.retrooper.packetevents.protocol.item.mapdecoration.MapDecorationTypes; +import com.github.retrooper.packetevents.protocol.packettype.PacketType; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class WrapperPlayServerMapData extends PacketWrapper { + + private int mapId; + private byte scale; + private boolean trackingPosition; + private boolean locked; + private @Nullable List decorations; + private int columns; + private int rows; + private int x; + private int z; + private byte @Nullable [] data; + + public WrapperPlayServerMapData(PacketSendEvent event) { + super(event); + } + + public WrapperPlayServerMapData(int mapId, byte scale, @Nullable List decorations) { + this(mapId, scale, false, decorations); + } + + public WrapperPlayServerMapData(int mapId, byte scale, boolean locked, @Nullable List decorations) { + this(mapId, scale, false, locked, decorations, 0, 0, 0, 0, null); + } + + public WrapperPlayServerMapData( + int mapId, byte scale, boolean trackingPosition, + boolean locked, @Nullable List decorations, + int columns, int rows, int x, int z, byte @Nullable [] data + ) { + super(PacketType.Play.Server.MAP_DATA); + this.mapId = mapId; + this.scale = scale; + this.trackingPosition = trackingPosition; + this.locked = locked; + this.decorations = decorations; + this.columns = columns; + this.rows = rows; + this.x = x; + this.z = z; + this.data = data; + } + + @Override + public void read() { + this.mapId = this.readVarInt(); + this.scale = this.readByte(); + if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_9) + && this.serverVersion.isOlderThan(ServerVersion.V_1_17)) { + this.trackingPosition = this.readBoolean(); + } + this.locked = this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_14) && this.readBoolean(); + + if (this.serverVersion.isOlderThan(ServerVersion.V_1_17) || this.readBoolean()) { + this.decorations = this.readList(MapDecoration::read); + } + + this.columns = this.readUnsignedByte(); + if (this.columns > 0) { + this.rows = this.readUnsignedByte(); + this.x = this.readUnsignedByte(); + this.z = this.readUnsignedByte(); + this.data = this.readByteArray(); + } + } + + @Override + public void write() { + this.writeVarInt(this.mapId); + this.writeByte(this.scale); + if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_9) + && this.serverVersion.isOlderThan(ServerVersion.V_1_17)) { + this.writeBoolean(this.trackingPosition); + } + if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_14)) { + this.writeBoolean(this.locked); + } + + if (this.decorations != null) { + if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_17)) { + this.writeBoolean(true); // decorations are present + } + this.writeList(this.decorations, MapDecoration::write); + } else if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_17)) { + this.writeBoolean(false); // not present + } else { + // write empty list size + this.writeVarInt(0); + } + + if (this.data != null) { + this.writeByte(this.columns); + if (this.columns > 0) { + this.writeByte(this.rows); + this.writeByte(this.x); + this.writeByte(this.z); + this.writeByteArray(this.data); + } + } else { + this.writeByte(0); // 0 columns mean no data + } + } + + public static class MapDecoration { + + private MapDecorationType type; + private byte x; + private byte y; + private byte direction; // 0 to 15 + private @Nullable Component displayName; + + public MapDecoration(MapDecorationType type, byte x, byte y, byte direction, @Nullable Component displayName) { + this.type = type; + this.x = x; + this.y = y; + this.direction = direction; + this.displayName = displayName; + } + + public static MapDecoration read(PacketWrapper wrapper) { + // first 4 bits determine decoration type, last 4 bits determine rotation below 1.13 + boolean v113 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_13); + byte flags = v113 ? 0 : wrapper.readByte(); + MapDecorationType type = !v113 + ? MapDecorationTypes.getById(wrapper.getServerVersion().toClientVersion(), (flags >> 4) & 0xF) + : wrapper.readMappedEntity(MapDecorationTypes::getById); + + byte x = wrapper.readByte(); + byte y = wrapper.readByte(); + byte direction = (byte) ((v113 ? wrapper.readByte() : flags) & 0xF); + Component displayName = v113 ? wrapper.readOptional(PacketWrapper::readComponent) : null; + return new MapDecoration(type, x, y, direction, displayName); + } + + public static void write(PacketWrapper wrapper, MapDecoration decoration) { + boolean v113 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_13); + if (v113) { + wrapper.writeMappedEntity(decoration.getType()); + } else { + int typeId = decoration.getType().getId(wrapper.getServerVersion().toClientVersion()); + wrapper.writeByte((typeId & 0xF) << 4 | (decoration.getDirection() & 0xF)); + } + + wrapper.writeByte(decoration.getX()); + wrapper.writeByte(decoration.getY()); + if (v113) { + wrapper.writeByte(decoration.getDirection()); + wrapper.writeOptional(decoration.getDisplayName(), PacketWrapper::writeComponent); + } + } + + public MapDecorationType getType() { + return this.type; + } + + public void setType(MapDecorationType type) { + this.type = type; + } + + public byte getX() { + return this.x; + } + + public void setX(byte x) { + this.x = x; + } + + public byte getY() { + return this.y; + } + + public void setY(byte y) { + this.y = y; + } + + public byte getDirection() { + return this.direction; + } + + public void setDirection(byte direction) { + this.direction = direction; + } + + public @Nullable Component getDisplayName() { + return this.displayName; + } + + public void setDisplayName(@Nullable Component displayName) { + this.displayName = displayName; + } + } + + public int getMapId() { + return this.mapId; + } + + public void setMapId(int mapId) { + this.mapId = mapId; + } + + public byte getScale() { + return this.scale; + } + + public void setScale(byte scale) { + this.scale = scale; + } + + public boolean isTrackingPosition() { + return this.trackingPosition; + } + + public void setTrackingPosition(boolean trackingPosition) { + this.trackingPosition = trackingPosition; + } + + public boolean isLocked() { + return this.locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public @Nullable List getDecorations() { + return this.decorations; + } + + public void setDecorations(@Nullable List decorations) { + this.decorations = decorations; + } + + public int getColumns() { + return this.columns; + } + + public void setColumns(int columns) { + this.columns = columns; + } + + public int getRows() { + return this.rows; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public int getX() { + return this.x; + } + + public void setX(int x) { + this.x = x; + } + + public int getZ() { + return this.z; + } + + public void setZ(int z) { + this.z = z; + } + + public byte @Nullable [] getData() { + return this.data; + } + + public void setData(byte @Nullable [] data) { + this.data = data; + } +} diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java index 8b0435122..e4c21fccb 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java @@ -21,4 +21,9 @@ public class Fabric1140ItemRegistry implements ItemRegistry { Optional item = Registry.ITEM.getOrEmpty(Identifier.createSplit(name, ':')); return item.isPresent() ? new FabricItemType(item.get()) : null; } + + @Override + public @Nullable ItemType getById(int id) { + return null; + } } diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java index 16363ff30..9fce9150f 100644 --- a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java @@ -17,4 +17,9 @@ public class Fabric1193ItemRegistry implements ItemRegistry { Optional item = Registries.ITEM.getOrEmpty(Identifier.splitOn(name, ':')); return item.isPresent() ? new FabricItemType(item.get()) : null; } + + @Override + public @Nullable ItemType getById(int id) { + return null; + } } diff --git a/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java b/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java index 96c85e6eb..ee5f64bcf 100644 --- a/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java +++ b/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java @@ -5,14 +5,23 @@ import io.github.retrooper.packetevents.FabricItemType; import net.minecraft.item.Item; import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; public class Fabric1212ItemRegistry implements ItemRegistry { @Override - public @NotNull ItemType getByName(String name) { - Item item = Registries.ITEM.get(Identifier.tryParse(name)); // returns default entry if item doesn't exist - return new FabricItemType(item); + public @Nullable ItemType getByName(String name) { + Optional> item = Registries.ITEM.getEntry(Identifier.tryParse(name)); // returns default entry if item doesn't exist + return item.map(itemReference -> new FabricItemType(itemReference.value())).orElse(null); + } + + @Override + public @Nullable ItemType getById(int id) { + Optional> item = Registries.ITEM.getEntry(id); // returns default entry if item doesn't exist + return item.map(itemReference -> new FabricItemType(itemReference.value())).orElse(null); } } \ No newline at end of file From d6d7641df3f869460ef6ac6a8bf6022cccc12c35 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 5 Apr 2025 11:33:22 -0400 Subject: [PATCH 37/43] Improve Logger --- .../factory/fabric/FabricPacketEventsAPI.java | 4 +- .../packetevents/manager/FabricLogger.java | 144 +++++++++++++++++- 2 files changed, 143 insertions(+), 5 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 07a310d97..4716190f4 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -38,8 +38,10 @@ import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; +import io.netty.util.internal.logging.Slf4JLoggerFactory; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.impl.game.minecraft.Slf4jLogHandler; import java.util.Locale; import java.util.logging.Logger; @@ -53,7 +55,7 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private final ServerManager serverManager; private final ChannelInjector injector; private final NettyManager nettyManager = new NettyManagerImpl(); - private final LogManager logManager = new FabricLogger(Logger.getLogger("PacketEvents")); + private final LogManager logManager = FabricLogger.createModLogger("PacketEvents"); private boolean loaded; private boolean initialized; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java index aba7c2757..64b134f15 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java @@ -23,17 +23,153 @@ import org.jetbrains.annotations.Nullable; import java.util.logging.Logger; +import net.kyori.adventure.text.format.NamedTextColor; +import java.lang.reflect.Method; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; + public class FabricLogger extends LogManager { + private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("§[0-9A-FK-ORa-fk-or]"); // Example pattern to strip Minecraft color codes - private final Logger logger; + private final Object logger; + private final LoggerType loggerType; + + // Enum to represent the type of logger being used + private enum LoggerType { + SLF4J, LOG4J, JDK + } - public FabricLogger(Logger logger) { + private FabricLogger(Object logger, LoggerType loggerType) { this.logger = logger; + this.loggerType = loggerType; } @Override - protected void log(java.util.logging.Level level, @Nullable NamedTextColor color, String message) { + public void log(Level level, NamedTextColor color, String message) { + // Strip color codes from the message (if any) String plainMessage = STRIP_COLOR_PATTERN.matcher(message).replaceAll(""); - this.logger.log(level, plainMessage); + + switch (loggerType) { + case SLF4J: + logWithSlf4j(level, plainMessage); + break; + case LOG4J: + logWithLog4j(level, plainMessage); + break; + case JDK: + logWithJdk(level, plainMessage); + break; + } + } + + private void logWithSlf4j(Level level, String message) { + try { + Object slf4jLogger = logger; + Class slf4jLoggerClass = Class.forName("org.slf4j.Logger"); + Method logMethod; + switch (level.getName()) { + case "SEVERE": + logMethod = slf4jLoggerClass.getMethod("error", String.class); + break; + case "WARNING": + logMethod = slf4jLoggerClass.getMethod("warn", String.class); + break; + case "INFO": + logMethod = slf4jLoggerClass.getMethod("info", String.class); + break; + case "CONFIG": + case "FINE": + logMethod = slf4jLoggerClass.getMethod("debug", String.class); + break; + case "FINER": + case "FINEST": + logMethod = slf4jLoggerClass.getMethod("trace", String.class); + break; + default: + logMethod = slf4jLoggerClass.getMethod("info", String.class); // Default to info + break; + } + logMethod.invoke(slf4jLogger, message); + } catch (Exception e) { + // Fallback to println if reflection fails (shouldn't happen) + System.out.println("[" + level + "] " + message); + } + } + + private void logWithLog4j(Level level, String message) { + try { + Object log4jLogger = logger; + Class log4jLoggerClass = Class.forName("org.apache.logging.log4j.Logger"); + Class log4jLevelClass = Class.forName("org.apache.logging.log4j.Level"); + Method logMethod = log4jLoggerClass.getMethod("log", log4jLevelClass, String.class); + + // Map java.util.logging.Level to Log4j Level + Object log4jLevel; + switch (level.getName()) { + case "SEVERE": + log4jLevel = log4jLevelClass.getField("ERROR").get(null); + break; + case "WARNING": + log4jLevel = log4jLevelClass.getField("WARN").get(null); + break; + case "INFO": + log4jLevel = log4jLevelClass.getField("INFO").get(null); + break; + case "CONFIG": + case "FINE": + log4jLevel = log4jLevelClass.getField("DEBUG").get(null); + break; + case "FINER": + case "FINEST": + log4jLevel = log4jLevelClass.getField("TRACE").get(null); + break; + default: + log4jLevel = log4jLevelClass.getField("INFO").get(null); // Default to INFO + break; + } + + logMethod.invoke(log4jLogger, log4jLevel, message); + } catch (Exception e) { + // Fallback to println if reflection fails (shouldn't happen) + System.out.println("[" + level + "] " + message); + } + } + + private void logWithJdk(Level level, String message) { + Logger jdkLogger = (Logger) logger; + jdkLogger.log(level, message); + } + + // Factory method to create a mod-specific logger with fallback + public static FabricLogger createModLogger(String modId) { + // Try SLF4J first + try { + Class slf4jLoggerClass = Class.forName("org.slf4j.Logger"); + Class slf4jLoggerFactoryClass = Class.forName("org.slf4j.LoggerFactory"); + Method getLoggerMethod = slf4jLoggerFactoryClass.getMethod("getLogger", String.class); + Object slf4jLogger = getLoggerMethod.invoke(null, modId); + return new FabricLogger(slf4jLogger, LoggerType.SLF4J); + } catch (ClassNotFoundException e) { + // SLF4J not found, try Log4j next + } catch (Exception e) { + // Reflection failed, try Log4j next + } + + // Try Log4j + try { + Class log4jLogManagerClass = Class.forName("org.apache.logging.log4j.LogManager"); + Method getLoggerMethod = log4jLogManagerClass.getMethod("getLogger", String.class); + Object log4jLogger = getLoggerMethod.invoke(null, modId); + return new FabricLogger(log4jLogger, LoggerType.LOG4J); + } catch (ClassNotFoundException e) { + // Log4j not found, fall back to JDK Logger + } catch (Exception e) { + // Reflection failed, fall back to JDK Logger + } + + // Fall back to JDK Logger + Logger jdkLogger = Logger.getLogger(modId); + return new FabricLogger(jdkLogger, LoggerType.JDK); } } From 0d745a98a79541d7f77708a658ca3bf223b04e0d Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 19 Apr 2025 10:04:17 -0400 Subject: [PATCH 38/43] Refactor entrypoint name. Fix minor rebase issue from removing DIRT_PATH --- .../packetevents/protocol/world/states/type/StateTypes.java | 1 + fabric/mc1140/src/main/resources/fabric.mod.json | 4 ++-- fabric/mc1194/src/main/resources/fabric.mod.json | 2 +- fabric/mc1202/src/main/resources/fabric.mod.json | 2 +- fabric/mc1211/src/main/resources/fabric.mod.json | 2 +- fabric/mc1215/src/main/resources/fabric.mod.json | 2 +- .../io/github/retrooper/packetevents/PacketEventsMod.java | 6 +++--- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java b/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java index 625309db6..513edd384 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java +++ b/api/src/main/java/com/github/retrooper/packetevents/protocol/world/states/type/StateTypes.java @@ -528,6 +528,7 @@ public static StateType.Mapped getMappedById(ClientVersion version, int id) { public static StateType PACKED_ICE = StateTypes.builder().name("PACKED_ICE").blastResistance(0.5f).hardness(0.5f).isBlocking(true).requiresCorrectTool(false).isSolid(true).setMaterial(MaterialType.ICE_SOLID).build(); @ApiStatus.Obsolete @RuntimeObsolete public static StateType GRASS_PATH = StateTypes.builder().name("GRASS_PATH").blastResistance(0.65f).hardness(0.65f).isBlocking(true).requiresCorrectTool(false).isSolid(true).setMaterial(MaterialType.DIRT).build(); + public static StateType DIRT_PATH = StateTypes.builder().name("DIRT_PATH").blastResistance(0.65f).hardness(0.65f).isBlocking(true).requiresCorrectTool(false).isSolid(true).setMaterial(MaterialType.DIRT).build(); public static StateType SUNFLOWER = StateTypes.builder().name("SUNFLOWER").blastResistance(0.0f).hardness(0.0f).isBlocking(false).requiresCorrectTool(false).isSolid(false).setMaterial(MaterialType.REPLACEABLE_PLANT).build(); public static StateType LILAC = StateTypes.builder().name("LILAC").blastResistance(0.0f).hardness(0.0f).isBlocking(false).requiresCorrectTool(false).isSolid(false).setMaterial(MaterialType.REPLACEABLE_PLANT).build(); public static StateType ROSE_BUSH = StateTypes.builder().name("ROSE_BUSH").blastResistance(0.0f).hardness(0.0f).isBlocking(false).requiresCorrectTool(false).isSolid(false).setMaterial(MaterialType.REPLACEABLE_PLANT).build(); diff --git a/fabric/mc1140/src/main/resources/fabric.mod.json b/fabric/mc1140/src/main/resources/fabric.mod.json index a18cef49a..77ee14b25 100644 --- a/fabric/mc1140/src/main/resources/fabric.mod.json +++ b/fabric/mc1140/src/main/resources/fabric.mod.json @@ -11,10 +11,10 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "mainChainLoad": [ + "peMainChainLoad": [ "io.github.retrooper.packetevents.mc1140.Fabric1140ChainLoadEntrypoint" ], - "clientChainLoad": [ + "peClientChainLoad": [ "io.github.retrooper.packetevents.mc1140.Fabric1140ClientChainLoadEntrypoint" ] }, diff --git a/fabric/mc1194/src/main/resources/fabric.mod.json b/fabric/mc1194/src/main/resources/fabric.mod.json index ed857d887..63e90149e 100644 --- a/fabric/mc1194/src/main/resources/fabric.mod.json +++ b/fabric/mc1194/src/main/resources/fabric.mod.json @@ -11,7 +11,7 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "mainChainLoad": [ + "peMainChainLoad": [ "io.github.retrooper.packetevents.mc1914.Fabric1913ChainLoadEntrypoint" ] }, diff --git a/fabric/mc1202/src/main/resources/fabric.mod.json b/fabric/mc1202/src/main/resources/fabric.mod.json index dfc03f53c..6cae6dfac 100644 --- a/fabric/mc1202/src/main/resources/fabric.mod.json +++ b/fabric/mc1202/src/main/resources/fabric.mod.json @@ -11,7 +11,7 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "mainChainLoad": [ + "peMainChainLoad": [ "io.github.retrooper.packetevents.mc1202.Fabric1202ChainLoadEntrypoint" ] }, diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric/mc1211/src/main/resources/fabric.mod.json index 700b56800..53ae9aa1a 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric/mc1211/src/main/resources/fabric.mod.json @@ -11,7 +11,7 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "clientChainLoad": [ + "peClientChainLoad": [ "io.github.retrooper.packetevents.mc1211.Fabric1205ClientChainLoadEntrypoint" ] }, diff --git a/fabric/mc1215/src/main/resources/fabric.mod.json b/fabric/mc1215/src/main/resources/fabric.mod.json index c6845c679..da1273993 100644 --- a/fabric/mc1215/src/main/resources/fabric.mod.json +++ b/fabric/mc1215/src/main/resources/fabric.mod.json @@ -11,7 +11,7 @@ "license": "GPL-3.0", "environment": "*", "entrypoints": { - "mainChainLoad": [ + "peMainChainLoad": [ "io.github.retrooper.packetevents.mc1215.Fabric1212ChainLoadEntrypoint" ] }, diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 3de037e67..70fc17afe 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -41,10 +41,10 @@ public void onPreLaunch() { INSTANCE = this; FabricLoader loader = FabricLoader.getInstance(); - String chainLoadEntryPointName = "mainChainLoad"; - String clientChainLoadEntryPointName = "clientChainLoad"; // For client-specific entrypoints + String chainLoadEntryPointName = "peMainChainLoad"; + String clientChainLoadEntryPointName = "peClientChainLoad"; // For client-specific entrypoints - // Collect mainChainLoad entrypoints (always present) and sort by version + // Collect peMainChainLoad entrypoints (always present) and sort by version List mainChainLoadEntryPoints = loader.getEntrypoints(chainLoadEntryPointName, ChainLoadEntryPoint.class); mainChainLoadEntryPoints.sort((a, b) -> b.getNativeVersion().getProtocolVersion() - a.getNativeVersion().getProtocolVersion()); From a4ee1e534de7edfc5d693ae74832ae8b5c2ec831 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 19 Apr 2025 10:11:53 -0400 Subject: [PATCH 39/43] Full Fabric multi-version logging support without reflection --- fabric/build.gradle.kts | 1 + .../manager/logger/FabricLogger.java | 31 +++++++++++++ .../manager/logger/JdkFabricLogger.java | 20 +++++++++ .../manager/logger/Log4jFabricLogger.java | 44 +++++++++++++++++++ .../manager/logger/Slf4jFabricLogger.java | 40 +++++++++++++++++ 5 files changed, 136 insertions(+) create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 82de4ad4c..cf001bfd6 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { mappings("net.fabricmc:yarn:$yarn_mappings") compileOnly(libs.via.version) + compileOnly("org.slf4j:slf4j-simple:2.0.16") } loom { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java new file mode 100644 index 000000000..62e37f7f9 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java @@ -0,0 +1,31 @@ +package io.github.retrooper.packetevents.manager.logger; + +import com.github.retrooper.packetevents.util.LogManager; + +import java.util.logging.Logger; +import java.util.regex.Pattern; + +public abstract class FabricLogger extends LogManager { + protected static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("§[0-9A-FK-ORa-fk-or]"); + + protected String stripColorCodes(String message) { + return STRIP_COLOR_PATTERN.matcher(message).replaceAll(""); + } + + public static FabricLogger createModLogger(String modId) { + // Try SLF4J + try { + org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(modId); + return new Slf4jFabricLogger(logger); + } catch (Throwable ignored) {} + + // Try Log4j + try { + org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(modId); + return new Log4jFabricLogger(logger); + } catch (Throwable ignored) {} + + // Fallback to JDK logger + return new JdkFabricLogger(Logger.getLogger(modId)); + } +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java new file mode 100644 index 000000000..a644f540c --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java @@ -0,0 +1,20 @@ +package io.github.retrooper.packetevents.manager.logger; + +import net.kyori.adventure.text.format.NamedTextColor; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JdkFabricLogger extends FabricLogger { + private final Logger logger; + + public JdkFabricLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void log(Level level, NamedTextColor color, String message) { + String msg = stripColorCodes(message); + logger.log(level, msg); + } +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java new file mode 100644 index 000000000..1077f412c --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java @@ -0,0 +1,44 @@ +package io.github.retrooper.packetevents.manager.logger; + +import net.kyori.adventure.text.format.NamedTextColor; + +import java.util.logging.Level; + +public class Log4jFabricLogger extends FabricLogger { + private final org.apache.logging.log4j.Logger logger; + + public Log4jFabricLogger(org.apache.logging.log4j.Logger logger) { + this.logger = logger; + } + + @Override + public void log(Level level, NamedTextColor color, String message) { + String msg = stripColorCodes(message); + org.apache.logging.log4j.Level log4jLevel; + + switch (level.getName()) { + case "SEVERE": + log4jLevel = org.apache.logging.log4j.Level.ERROR; + break; + case "WARNING": + log4jLevel = org.apache.logging.log4j.Level.WARN; + break; + case "INFO": + log4jLevel = org.apache.logging.log4j.Level.INFO; + break; + case "CONFIG": + case "FINE": + log4jLevel = org.apache.logging.log4j.Level.DEBUG; + break; + case "FINER": + case "FINEST": + log4jLevel = org.apache.logging.log4j.Level.TRACE; + break; + default: + log4jLevel = org.apache.logging.log4j.Level.INFO; + break; + } + + logger.log(log4jLevel, msg); + } +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java new file mode 100644 index 000000000..3c9986290 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java @@ -0,0 +1,40 @@ +package io.github.retrooper.packetevents.manager.logger; + +import net.kyori.adventure.text.format.NamedTextColor; + +import java.util.logging.Level; + +public class Slf4jFabricLogger extends FabricLogger { + private final org.slf4j.Logger logger; + + public Slf4jFabricLogger(org.slf4j.Logger logger) { + this.logger = logger; + } + + @Override + public void log(Level level, NamedTextColor color, String message) { + String msg = stripColorCodes(message); + switch (level.getName()) { + case "SEVERE": + logger.error(msg); + break; + case "WARNING": + logger.warn(msg); + break; + case "INFO": + logger.info(msg); + break; + case "CONFIG": + case "FINE": + logger.debug(msg); + break; + case "FINER": + case "FINEST": + logger.trace(msg); + break; + default: + logger.info(msg); + break; + } + } +} \ No newline at end of file From 829f86bce8eccdb5ef9e5cc228ed90f3c0edb37b Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 19 Apr 2025 21:37:22 -0400 Subject: [PATCH 40/43] Fix IllegalAccessError on 1.20.1 --- fabric/mc1140/src/main/resources/packetevents.accesswidener | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/mc1140/src/main/resources/packetevents.accesswidener b/fabric/mc1140/src/main/resources/packetevents.accesswidener index 62dbbe743..8be14a21b 100644 --- a/fabric/mc1140/src/main/resources/packetevents.accesswidener +++ b/fabric/mc1140/src/main/resources/packetevents.accesswidener @@ -4,7 +4,7 @@ accessWidener v2 named # fields accessible field net/minecraft/network/ClientConnection channel Lio/netty/channel/Channel; accessible field net/minecraft/client/network/ClientPlayNetworkHandler connection Lnet/minecraft/network/ClientConnection; - +accessible field net/minecraft/server/network/ServerPlayNetworkHandler client Lnet/minecraft/network/ClientConnection; # Private in newer versions # methods # classes From eb8f6a8e985a5b077aa06de657299b65951f5575 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Sat, 19 Apr 2025 21:39:27 -0400 Subject: [PATCH 41/43] Fix unneccessary overrides from before last rebase --- .../packetevents/manager/FabricProtocolManager.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java index e764f2c21..76417eee3 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java @@ -126,11 +126,6 @@ public Collection getChannels() { return channels.values(); } - @Override - public Collection> getChannelEntries() { - return channels.entrySet(); - } - @Override public User getUser(Object channel) { Object pipeline = ChannelHelper.getPipeline(channel); @@ -162,11 +157,6 @@ public void setChannel(UUID uuid, Object channel) { channels.put(uuid, channel); } - @Override - public void removeChannel(UUID uuid) { - channels.remove(uuid); - } - @Override public boolean hasChannel(Object channel) { return channels.containsValue(channel); From e8ad59e312beb9de03c8a6c4f29f23f00b2d6761 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Tue, 22 Apr 2025 17:12:53 -0400 Subject: [PATCH 42/43] Add support for showing disconnect message on 1.19+ --- .../mc1140/Fabric1140ChainLoadEntrypoint.java | 4 +- .../fabric/Fabric1140ServerPlayerManager.java | 6 +++ fabric/mc1194/build.gradle.kts | 1 + .../mc1914/Fabric1913ChainLoadEntrypoint.java | 7 +++- .../fabric/Fabric1190ServerPlayerManager.java | 37 +++++++++++++++++++ .../mc1194/src/main/resources/fabric.mod.json | 4 +- .../mc1202/Fabric1202ChainLoadEntrypoint.java | 4 +- .../fabric/Fabric1202ServerPlayerManager.java | 7 ++++ .../factory/fabric/FabricPacketEventsAPI.java | 3 +- .../FabricPacketEventsAPIManagerFactory.java | 9 +++-- .../packetevents/handler/PacketEncoder.java | 4 +- .../packetevents/loader/ChainLoadData.java | 13 ++++--- .../manager/AbstractFabricPlayerManager.java | 4 ++ .../manager/FabricServerManager.java | 16 +++++--- .../util/FabricInjectionUtil.java | 2 +- 15 files changed, 94 insertions(+), 27 deletions(-) create mode 100644 fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java index 08f855123..8bdc9e48f 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java @@ -2,17 +2,17 @@ import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; import io.github.retrooper.packetevents.mc1140.manager.registry.Fabric1140ItemRegistry; import io.github.retrooper.packetevents.util.LazyHolder; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.mc1140.factory.fabric.Fabric1140ServerPlayerManager; public class Fabric1140ChainLoadEntrypoint implements ChainLoadEntryPoint { - protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1140ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1140ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); @Override public void initialize(ChainLoadData chainLoadData) { diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java index e09296bdc..fa55c6232 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java +++ b/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java @@ -20,6 +20,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; +import net.minecraft.network.chat.TextComponent; import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; @@ -44,4 +45,9 @@ public Object getChannel(@NotNull Object player) { } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } + + @Override + public void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message) { + serverPlayerEntity.networkHandler.disconnect(new TextComponent(message)); + } } diff --git a/fabric/mc1194/build.gradle.kts b/fabric/mc1194/build.gradle.kts index b829f5c4c..d34cc42f6 100644 --- a/fabric/mc1194/build.gradle.kts +++ b/fabric/mc1194/build.gradle.kts @@ -6,6 +6,7 @@ repositories { } dependencies { + compileOnly(project(":fabric:mc1140", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") mappings("net.fabricmc:yarn:$yarn_mappings") diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java index d021a0808..2961fc9b7 100644 --- a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java @@ -1,9 +1,13 @@ package io.github.retrooper.packetevents.mc1914; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; +import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; +import io.github.retrooper.packetevents.mc1140.manager.registry.Fabric1140ItemRegistry; +import io.github.retrooper.packetevents.mc1914.factory.fabric.Fabric1190ServerPlayerManager; import io.github.retrooper.packetevents.mc1914.manager.registry.Fabric1193ItemRegistry; import io.github.retrooper.packetevents.util.LazyHolder; @@ -11,8 +15,9 @@ public class Fabric1913ChainLoadEntrypoint implements ChainLoadEntryPoint { @Override public void initialize(ChainLoadData chainLoadData) { + chainLoadData.setPlayerManagerIfNull(LazyHolder.simple(() -> new Fabric1190ServerPlayerManager(FabricPacketEventsAPI.getServerAPI()))); chainLoadData.setRegistryManagerIfNull(LazyHolder.simple(() -> - new FabricRegistryManager(new Fabric1193ItemRegistry()) + new FabricRegistryManager(FabricServerManager.getVersionStatically().isNewerThan(ServerVersion.V_1_19_2) ? new Fabric1193ItemRegistry() : new Fabric1140ItemRegistry()) )); } diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java new file mode 100644 index 000000000..21f5bf773 --- /dev/null +++ b/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java @@ -0,0 +1,37 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2024 retrooper and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.github.retrooper.packetevents.mc1914.factory.fabric; + +import com.github.retrooper.packetevents.PacketEventsAPI; +import io.github.retrooper.packetevents.mc1140.factory.fabric.Fabric1140ServerPlayerManager; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; + +public class Fabric1190ServerPlayerManager extends Fabric1140ServerPlayerManager { + + public Fabric1190ServerPlayerManager(PacketEventsAPI packetEventsAPI) { + super(packetEventsAPI); + } + + // new TextComponent -> Text.literal in 1.19 + @Override + public void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message) { + serverPlayerEntity.networkHandler.disconnect(Text.literal(message)); + } +} diff --git a/fabric/mc1194/src/main/resources/fabric.mod.json b/fabric/mc1194/src/main/resources/fabric.mod.json index 63e90149e..3333e4a00 100644 --- a/fabric/mc1194/src/main/resources/fabric.mod.json +++ b/fabric/mc1194/src/main/resources/fabric.mod.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "${modName}", "version": "${version}", - "name": "PacketEvents dependency for 1.19.3+ compiled against ${minecraft_version}", + "name": "PacketEvents dependency for 1.19+ compiled against ${minecraft_version}", "description": "", "authors": [ "retrooper" @@ -21,6 +21,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", - "minecraft": ">=1.19.3" + "minecraft": ">=1.19" } } diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java index 36c02f04f..919cff33e 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java @@ -2,15 +2,15 @@ import com.github.retrooper.packetevents.manager.server.ServerVersion; import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import io.github.retrooper.packetevents.util.LazyHolder; -import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import io.github.retrooper.packetevents.mc1202.factory.fabric.Fabric1202ServerPlayerManager; public class Fabric1202ChainLoadEntrypoint implements ChainLoadEntryPoint { - protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1202ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); + protected LazyHolder playerManagerAbstractLazyHolder = LazyHolder.simple(() -> new Fabric1202ServerPlayerManager(FabricPacketEventsAPI.getServerAPI())); @Override public void initialize(ChainLoadData chainLoadData) { diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java index 87ae539f5..bdd717797 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java +++ b/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java @@ -21,6 +21,7 @@ import com.github.retrooper.packetevents.PacketEventsAPI; import io.github.retrooper.packetevents.mc1140.factory.fabric.Fabric1140ServerPlayerManager; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; public class Fabric1202ServerPlayerManager extends Fabric1140ServerPlayerManager { @@ -44,4 +45,10 @@ public Object getChannel(@NotNull Object player) { } throw new UnsupportedOperationException("Unsupported player implementation: " + player); } + + // disconnect method moved from ServerPlayNetworkHandler -> ServerCommonNetworkHandler in 1.20.2 + @Override + public void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message) { + serverPlayerEntity.networkHandler.disconnect(Text.literal(message)); + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 4716190f4..78604b0bf 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -33,6 +33,7 @@ import com.github.retrooper.packetevents.util.LogManager; import io.github.retrooper.packetevents.PacketEventsMod; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import io.github.retrooper.packetevents.manager.FabricLogger; import io.github.retrooper.packetevents.manager.FabricProtocolManager; import io.github.retrooper.packetevents.manager.FabricServerManager; @@ -174,7 +175,7 @@ public LogManager getLogManager() { } @Override - public PlayerManager getPlayerManager() { + public AbstractFabricPlayerManager getPlayerManager() { return this.environment == EnvType.SERVER ? FabricPacketEventsAPIManagerFactory.getLazyPlayerManagerHolder().get() : FabricPacketEventsAPIManagerFactory.getClientLazyPlayerManagerHolder().get(); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java index 33faed742..3cc137a90 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java @@ -1,6 +1,7 @@ package io.github.retrooper.packetevents.factory.fabric; import com.github.retrooper.packetevents.manager.registry.RegistryManager; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; import io.github.retrooper.packetevents.loader.ChainLoadData; @@ -8,15 +9,15 @@ public class FabricPacketEventsAPIManagerFactory { // TODO, refactor if booky and retrooper approve, bad design having settable static field // exists to maintain 100% backward compatability - private static LazyHolder lazyPlayerManagerHolder = () -> null; - private static LazyHolder lazyClientPlayerManagerHolder = () -> null; + private static LazyHolder lazyPlayerManagerHolder = () -> null; + private static LazyHolder lazyClientPlayerManagerHolder = () -> null; private static LazyHolder registryManagerLazyHolder = () -> null; - public static LazyHolder getLazyPlayerManagerHolder() { + public static LazyHolder getLazyPlayerManagerHolder() { return lazyPlayerManagerHolder; } - public static LazyHolder getClientLazyPlayerManagerHolder() { + public static LazyHolder getClientLazyPlayerManagerHolder() { return lazyClientPlayerManagerHolder; } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index d6e858dd7..473d0adcf 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -33,6 +33,7 @@ import com.github.retrooper.packetevents.util.ExceptionUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDisconnect; +import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsAPI; import io.github.retrooper.packetevents.util.FabricCustomPipelineUtil; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; @@ -177,8 +178,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E if (player instanceof ServerPlayerEntity serverPlayer) { // Schedule delayed kick (Fabric-specific, using Minecraft's scheduler) serverPlayer.getServer().execute(() -> { -// serverPlayer.connection.disconnect(Component.literal("Invalid packet")); - serverPlayer.networkHandler.disconnect(new TextComponent("Invalid packet")); + FabricPacketEventsAPI.getServerAPI().getPlayerManager().disconnectPlayer(serverPlayer, "Invalid packet"); }); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java index 3b0cb6354..550698081 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java @@ -1,14 +1,15 @@ package io.github.retrooper.packetevents.loader; import com.github.retrooper.packetevents.manager.registry.RegistryManager; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; import io.github.retrooper.packetevents.util.LazyHolder; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; public class ChainLoadData { private LazyHolder registryManagerLazyHolder = null; - private LazyHolder playerManagerAbstractLazyHolder = null; - private LazyHolder clientPlayerManagerAbstractLazyHolder = null; + private LazyHolder playerManagerAbstractLazyHolder = null; + private LazyHolder clientPlayerManagerAbstractLazyHolder = null; public void setRegistryManagerIfNull(LazyHolder registryManagerLazyHolder) { if (this.registryManagerLazyHolder == null) { @@ -20,23 +21,23 @@ public LazyHolder getRegistryManagerLazyHolder() { return this.registryManagerLazyHolder; } - public void setPlayerManagerIfNull(LazyHolder playerManagerAbstractLazyHolder) { + public void setPlayerManagerIfNull(LazyHolder playerManagerAbstractLazyHolder) { if (this.playerManagerAbstractLazyHolder == null) { this.playerManagerAbstractLazyHolder = playerManagerAbstractLazyHolder; } } - public LazyHolder getPlayerManagerAbstractLazyHolder() { + public LazyHolder getPlayerManagerAbstractLazyHolder() { return this.playerManagerAbstractLazyHolder; } - public void setClientPlayerManagerIfNull(LazyHolder clientPlayerManagerAbstractLazyHolder) { + public void setClientPlayerManagerIfNull(LazyHolder clientPlayerManagerAbstractLazyHolder) { if (this.clientPlayerManagerAbstractLazyHolder == null) { this.clientPlayerManagerAbstractLazyHolder = clientPlayerManagerAbstractLazyHolder; } } - public LazyHolder getClientPlayerManagerAbstractLazyHolder() { + public LazyHolder getClientPlayerManagerAbstractLazyHolder() { return this.clientPlayerManagerAbstractLazyHolder; } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java index ef8a69ee9..539c32c4e 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java @@ -4,6 +4,8 @@ import com.github.retrooper.packetevents.protocol.ConnectionState; import com.github.retrooper.packetevents.wrapper.PacketWrapper; import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract; +import net.minecraft.network.chat.Component; +import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.NotNull; public abstract class AbstractFabricPlayerManager extends PlayerManagerAbstract { @@ -77,4 +79,6 @@ public void receivePacketSilently(Object player, Object byteBuf) { public void receivePacketSilently(Object player, PacketWrapper wrapper) { packetEventsAPI.getProtocolManager().receivePacketSilently(getChannel(player), wrapper); } + + public abstract void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message); } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java index 2b485dcf1..0bc44e887 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java @@ -24,13 +24,13 @@ import com.github.retrooper.packetevents.util.mappings.GlobalRegistryHolder; import io.github.retrooper.packetevents.impl.netty.manager.server.ServerManagerAbstract; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.SharedConstants; public class FabricServerManager extends ServerManagerAbstract { - private ServerVersion version; + // Its ok for this to be static, client and server version running PE will always be the same even on integrated server + private static ServerVersion version; - private ServerVersion resolveVersion() { + private static ServerVersion resolveVersion() { String mcVersion = FabricLoader.getInstance().getModContainer("minecraft") .flatMap(mod -> mod.getMetadata().getVersion().getFriendlyString().describeConstable()) .orElse("unknown"); @@ -45,10 +45,14 @@ private ServerVersion resolveVersion() { @Override public ServerVersion getVersion() { - if (this.version == null) { - this.version = this.resolveVersion(); + return getVersionStatically(); + } + + public static ServerVersion getVersionStatically() { + if (version == null) { + version = resolveVersion(); } - return this.version; + return version; } @Override diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index 130d71960..a658ce033 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -112,7 +112,7 @@ public static void fireUserLoginEvent(ServerPlayerEntity player) { (!api.isTerminated() || api.getSettings().isKickIfTerminated())) { // Kick the player if they're not a fake player // player.connection.disconnect(Component.literal("PacketEvents 2.0 failed to inject")); - player.networkHandler.disconnect(new TextComponent("PacketEvents 2.0 failed to inject")); + FabricPacketEventsAPI.getServerAPI().getPlayerManager().disconnectPlayer(player, "PacketEvents 2.0 failed to inject"); } return; } From a980134d0ffb625788dc5fa7316449f0eb3f5526 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Thu, 1 May 2025 12:00:35 -0400 Subject: [PATCH 43/43] Refactor Fabric logging to look completely native --- .../factory/fabric/FabricPacketEventsAPI.java | 14 +++-- ...icLogger.java => FabricLoggerManager.java} | 15 +++--- ...cLogger.java => AbstractFabricLogger.java} | 4 +- .../manager/logger/JdkFabricLogger.java | 2 +- .../manager/logger/Log4jFabricLogger.java | 2 +- .../manager/logger/Slf4jFabricLogger.java | 2 +- .../manager/logger/jul/JULoggerFactory.java | 18 +++++++ .../logger/jul/Log4jBackedJULogger.java | 47 +++++++++++++++++ .../logger/jul/Slf4jBackedJULogger.java | 52 +++++++++++++++++++ 9 files changed, 137 insertions(+), 19 deletions(-) rename fabric/src/main/java/io/github/retrooper/packetevents/manager/{FabricLogger.java => FabricLoggerManager.java} (92%) rename fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/{FabricLogger.java => AbstractFabricLogger.java} (87%) create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java create mode 100644 fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java index 78604b0bf..7a7134808 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java @@ -21,7 +21,6 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.injector.ChannelInjector; -import com.github.retrooper.packetevents.manager.player.PlayerManager; import com.github.retrooper.packetevents.manager.protocol.ProtocolManager; import com.github.retrooper.packetevents.manager.registry.RegistryManager; import com.github.retrooper.packetevents.manager.server.ServerManager; @@ -34,15 +33,14 @@ import io.github.retrooper.packetevents.PacketEventsMod; import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl; import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; -import io.github.retrooper.packetevents.manager.FabricLogger; +import io.github.retrooper.packetevents.manager.FabricLoggerManager; import io.github.retrooper.packetevents.manager.FabricProtocolManager; import io.github.retrooper.packetevents.manager.FabricServerManager; import io.github.retrooper.packetevents.manager.InternalFabricPacketListener; +import io.github.retrooper.packetevents.manager.logger.jul.JULoggerFactory; import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil; -import io.netty.util.internal.logging.Slf4JLoggerFactory; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import net.fabricmc.loader.impl.game.minecraft.Slf4jLogHandler; import java.util.Locale; import java.util.logging.Logger; @@ -56,7 +54,8 @@ public class FabricPacketEventsAPI extends PacketEventsAPI { private final ServerManager serverManager; private final ChannelInjector injector; private final NettyManager nettyManager = new NettyManagerImpl(); - private final LogManager logManager = FabricLogger.createModLogger("PacketEvents"); + private final LogManager logManager = FabricLoggerManager.createModLogger("PacketEvents"); + private final Logger logger = JULoggerFactory.createLogger("PacketEvents"); private boolean loaded; private boolean initialized; @@ -174,6 +173,11 @@ public LogManager getLogManager() { return this.logManager; } + @Override + public Logger getLogger() { + return this.logger; + } + @Override public AbstractFabricPlayerManager getPlayerManager() { return this.environment == EnvType.SERVER ? FabricPacketEventsAPIManagerFactory.getLazyPlayerManagerHolder().get() : FabricPacketEventsAPIManagerFactory.getClientLazyPlayerManagerHolder().get(); diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java similarity index 92% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java rename to fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java index 64b134f15..825003c38 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java @@ -20,16 +20,13 @@ import com.github.retrooper.packetevents.util.LogManager; import net.kyori.adventure.text.format.NamedTextColor; -import org.jetbrains.annotations.Nullable; import java.util.logging.Logger; -import net.kyori.adventure.text.format.NamedTextColor; import java.lang.reflect.Method; import java.util.logging.Level; -import java.util.logging.Logger; import java.util.regex.Pattern; -public class FabricLogger extends LogManager { +public class FabricLoggerManager extends LogManager { private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("§[0-9A-FK-ORa-fk-or]"); // Example pattern to strip Minecraft color codes private final Object logger; @@ -40,7 +37,7 @@ private enum LoggerType { SLF4J, LOG4J, JDK } - private FabricLogger(Object logger, LoggerType loggerType) { + private FabricLoggerManager(Object logger, LoggerType loggerType) { this.logger = logger; this.loggerType = loggerType; } @@ -142,14 +139,14 @@ private void logWithJdk(Level level, String message) { } // Factory method to create a mod-specific logger with fallback - public static FabricLogger createModLogger(String modId) { + public static FabricLoggerManager createModLogger(String modId) { // Try SLF4J first try { Class slf4jLoggerClass = Class.forName("org.slf4j.Logger"); Class slf4jLoggerFactoryClass = Class.forName("org.slf4j.LoggerFactory"); Method getLoggerMethod = slf4jLoggerFactoryClass.getMethod("getLogger", String.class); Object slf4jLogger = getLoggerMethod.invoke(null, modId); - return new FabricLogger(slf4jLogger, LoggerType.SLF4J); + return new FabricLoggerManager(slf4jLogger, LoggerType.SLF4J); } catch (ClassNotFoundException e) { // SLF4J not found, try Log4j next } catch (Exception e) { @@ -161,7 +158,7 @@ public static FabricLogger createModLogger(String modId) { Class log4jLogManagerClass = Class.forName("org.apache.logging.log4j.LogManager"); Method getLoggerMethod = log4jLogManagerClass.getMethod("getLogger", String.class); Object log4jLogger = getLoggerMethod.invoke(null, modId); - return new FabricLogger(log4jLogger, LoggerType.LOG4J); + return new FabricLoggerManager(log4jLogger, LoggerType.LOG4J); } catch (ClassNotFoundException e) { // Log4j not found, fall back to JDK Logger } catch (Exception e) { @@ -170,6 +167,6 @@ public static FabricLogger createModLogger(String modId) { // Fall back to JDK Logger Logger jdkLogger = Logger.getLogger(modId); - return new FabricLogger(jdkLogger, LoggerType.JDK); + return new FabricLoggerManager(jdkLogger, LoggerType.JDK); } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java similarity index 87% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java rename to fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java index 62e37f7f9..0983865de 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/FabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java @@ -5,14 +5,14 @@ import java.util.logging.Logger; import java.util.regex.Pattern; -public abstract class FabricLogger extends LogManager { +public abstract class AbstractFabricLogger extends LogManager { protected static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("§[0-9A-FK-ORa-fk-or]"); protected String stripColorCodes(String message) { return STRIP_COLOR_PATTERN.matcher(message).replaceAll(""); } - public static FabricLogger createModLogger(String modId) { + public static AbstractFabricLogger createModLogger(String modId) { // Try SLF4J try { org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(modId); diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java index a644f540c..d62c858fb 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java @@ -5,7 +5,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -public class JdkFabricLogger extends FabricLogger { +public class JdkFabricLogger extends AbstractFabricLogger { private final Logger logger; public JdkFabricLogger(Logger logger) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java index 1077f412c..2eee89795 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java @@ -4,7 +4,7 @@ import java.util.logging.Level; -public class Log4jFabricLogger extends FabricLogger { +public class Log4jFabricLogger extends AbstractFabricLogger { private final org.apache.logging.log4j.Logger logger; public Log4jFabricLogger(org.apache.logging.log4j.Logger logger) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java index 3c9986290..f2382a463 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java @@ -4,7 +4,7 @@ import java.util.logging.Level; -public class Slf4jFabricLogger extends FabricLogger { +public class Slf4jFabricLogger extends AbstractFabricLogger { private final org.slf4j.Logger logger; public Slf4jFabricLogger(org.slf4j.Logger logger) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java new file mode 100644 index 000000000..0e9a8a6b7 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java @@ -0,0 +1,18 @@ +package io.github.retrooper.packetevents.manager.logger.jul; + +import java.util.logging.Logger; + +public class JULoggerFactory { + public static Logger createLogger(String name) { + try { + return new Slf4jBackedJULogger(name); + } catch (NoClassDefFoundError | Exception ignored) { + } + try { + return new Log4jBackedJULogger(name); + } catch (NoClassDefFoundError | Exception ignored) { + } + + return Logger.getLogger(name); + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java new file mode 100644 index 000000000..d84ddf47a --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java @@ -0,0 +1,47 @@ +package io.github.retrooper.packetevents.manager.logger.jul; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Log4jBackedJULogger extends Logger { + private final org.apache.logging.log4j.Logger log4jLogger; + + protected Log4jBackedJULogger(String name) { + super(name, null); + this.log4jLogger = org.apache.logging.log4j.LogManager.getLogger(name); + } + + @Override + public void log(Level level, String msg) { + if (level == Level.SEVERE) { + log4jLogger.error(msg); + } else if (level == Level.WARNING) { + log4jLogger.warn(msg); + } else if (level == Level.INFO) { + log4jLogger.info(msg); + } else if (level == Level.CONFIG || level == Level.FINE) { + log4jLogger.debug(msg); + } else if (level == Level.FINER || level == Level.FINEST) { + log4jLogger.trace(msg); + } else { + log4jLogger.info(msg); + } + } + + @Override + public void log(Level level, String msg, Throwable thrown) { + if (level == Level.SEVERE) { + log4jLogger.error(msg, thrown); + } else if (level == Level.WARNING) { + log4jLogger.warn(msg, thrown); + } else if (level == Level.INFO) { + log4jLogger.info(msg, thrown); + } else if (level == Level.CONFIG || level == Level.FINE) { + log4jLogger.debug(msg, thrown); + } else if (level == Level.FINER || level == Level.FINEST) { + log4jLogger.trace(msg, thrown); + } else { + log4jLogger.info(msg, thrown); + } + } +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java new file mode 100644 index 000000000..7f29f46f6 --- /dev/null +++ b/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java @@ -0,0 +1,52 @@ +package io.github.retrooper.packetevents.manager.logger.jul; + +import org.slf4j.LoggerFactory; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Slf4jBackedJULogger extends Logger { + private final org.slf4j.Logger slf4jLogger; + private static final Marker MARKER = MarkerFactory.getMarker("JUL"); + + public Slf4jBackedJULogger(String name) { + super(name, null); + this.slf4jLogger = LoggerFactory.getLogger(name); + } + + @Override + public void log(Level level, String msg) { + if (level == Level.SEVERE) { + slf4jLogger.error(MARKER, msg); + } else if (level == Level.WARNING) { + slf4jLogger.warn(MARKER, msg); + } else if (level == Level.INFO) { + slf4jLogger.info(MARKER, msg); + } else if (level == Level.CONFIG || level == Level.FINE) { + slf4jLogger.debug(MARKER, msg); + } else if (level == Level.FINER || level == Level.FINEST) { + slf4jLogger.trace(MARKER, msg); + } else { + slf4jLogger.info(MARKER, msg); + } + } + + @Override + public void log(Level level, String msg, Throwable thrown) { + if (level.equals(Level.SEVERE)) { + slf4jLogger.error(MARKER, msg, thrown); + } else if (level.equals(Level.WARNING)) { + slf4jLogger.warn(MARKER, msg, thrown); + } else if (level.equals(Level.INFO)) { + slf4jLogger.info(MARKER, msg, thrown); + } else if (level.equals(Level.CONFIG) || level.equals(Level.FINE)) { + slf4jLogger.debug(MARKER, msg, thrown); + } else if (level.equals(Level.FINER) || level.equals(Level.FINEST)) { + slf4jLogger.trace(MARKER, msg, thrown); + } else { + slf4jLogger.info(MARKER, msg, thrown); + } + } +}