diff --git a/.github/workflows/gradle-publish.yml b/.github/workflows/gradle-publish.yml index fe73893098..82ea6d822d 100644 --- a/.github/workflows/gradle-publish.yml +++ b/.github/workflows/gradle-publish.yml @@ -15,10 +15,10 @@ jobs: - name: Validate gradle wrapper uses: gradle/actions/wrapper-validation@v5 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v5 with: - java-version: '21' + java-version: '25' distribution: 'temurin' cache: 'gradle' server-id: github # Value of the distributionManagement/repository/id field of the pom.xml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c275047bf0..5c95d57fc5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,10 +17,13 @@ jobs: - name: Validate gradle wrapper uses: gradle/actions/wrapper-validation@v5 - - name: Setup java 21 + - name: Setup java 25 uses: actions/setup-java@v5 with: - java-version: 21 + # fabric-official's LoomNoRemap setup needs Gradle on Java 25 because + # the MC 26.1.2 jar is Java 25 bytecode and Loom configures it during + # Gradle's config phase (before toolchain selection). + java-version: 25 distribution: temurin - name: Prepare gradle diff --git a/fabric-common/build.gradle.kts b/fabric-common/build.gradle.kts new file mode 100644 index 0000000000..4b5cebc5ca --- /dev/null +++ b/fabric-common/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + packetevents.`library-conventions` +} + +repositories { + maven("https://maven.fabricmc.net/") + maven("https://repo.viaversion.com/") + maven("https://repo.spongepowered.org/repository/maven-public/") + maven("https://jitpack.io") +} + +dependencies { + compileOnly(libs.bundles.adventure) + compileOnly(project(":api", "shadow")) + compileOnly(project(":netty-common")) + + compileOnly("net.fabricmc:fabric-loader:${rootProject.findProperty("loader_version") ?: "0.16.14"}") + compileOnly(libs.via.version) + compileOnly("org.slf4j:slf4j-api:2.0.16") + compileOnly("org.apache.logging.log4j:log4j-api:2.24.3") + // PacketEventsMixinManager extends a conditional-mixin base class, which itself + // extends Sponge Mixin's IMixinConfigPlugin. + compileOnly("com.github.Fallen-Breath.conditional-mixin:conditional-mixin-fabric:0.6.4") + compileOnly("org.spongepowered:mixin:0.8.7") +} + +// Override library-conventions' release=8 — bridge code uses switch expressions +// and pattern-matching instanceof. +tasks.withType { + options.release = 17 +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsClientMod.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java similarity index 87% rename from fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java index 40400e3c2f..70fc17afe9 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java +++ b/fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsMod.java @@ -25,12 +25,9 @@ import io.github.retrooper.packetevents.loader.ChainLoadData; import io.github.retrooper.packetevents.loader.ChainLoadEntryPoint; import net.fabricmc.api.EnvType; -import com.github.retrooper.packetevents.protocol.PacketSide; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.NetworkSide; import java.util.List; @@ -39,21 +36,6 @@ public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer { public static PacketEventsMod INSTANCE; public static final String MOD_ID = "packetevents"; - - // isOurConnection() overloads are unused by our fork internally - // Methods kept for true ABI compatability with upstream PacketEvents - public static boolean isOurConnection(ClientConnection connection) { - return isOurConnection(connection.side); - } - public static boolean isOurConnection(NetworkSide flow) { - PacketSide connectionSide = switch (flow) { - case CLIENTBOUND -> PacketSide.CLIENT; - case SERVERBOUND -> PacketSide.SERVER; - }; - PacketEventsAPI api = PacketEvents.getAPI(); - return api != null && api.getInjector().getPacketSide() == connectionSide; - } - @Override public void onPreLaunch() { INSTANCE = this; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/PacketEventsServerMod.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java similarity index 97% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java index a9b8962a7e..4166b80448 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java +++ b/fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricChannelInjector.java @@ -26,7 +26,6 @@ import io.github.retrooper.packetevents.handler.PacketEncoder; import io.netty.channel.Channel; import net.fabricmc.api.EnvType; -import net.minecraft.entity.player.PlayerEntity; import static com.github.retrooper.packetevents.PacketEvents.DECODER_NAME; import static com.github.retrooper.packetevents.PacketEvents.ENCODER_NAME; @@ -81,8 +80,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 = (PlayerEntity) player; - ((PacketEncoder) ch.pipeline().get(ENCODER_NAME)).player = (PlayerEntity) player; + ((PacketDecoder) ch.pipeline().get(DECODER_NAME)).player = player; + ((PacketEncoder) ch.pipeline().get(ENCODER_NAME)).player = player; } @Override diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPI.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsAPIManagerFactory.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/factory/fabric/FabricPacketEventsBuilder.java rename to fabric-common/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-common/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java similarity index 96% rename from fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java index 0f880edaee..24e37bc293 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java +++ b/fabric-common/src/main/java/io/github/retrooper/packetevents/handler/PacketDecoder.java @@ -28,7 +28,6 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import net.minecraft.entity.player.PlayerEntity; import org.jetbrains.annotations.ApiStatus; import java.util.List; @@ -38,7 +37,8 @@ public class PacketDecoder extends MessageToMessageDecoder { private final PacketSide side; public User user; - public PlayerEntity player; + // Platform-typed player: see PacketEncoder.player for the rationale. + public Object player; private final boolean preViaVersion; public PacketDecoder(PacketSide side, User user, boolean preViaVersion) { diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java similarity index 90% rename from fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java index db19f54880..59f50532b5 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java +++ b/fabric-common/src/main/java/io/github/retrooper/packetevents/handler/PacketEncoder.java @@ -24,8 +24,6 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -46,7 +44,9 @@ public class PacketEncoder extends ChannelOutboundHandlerAdapter { private final PacketSide side; public User user; - public PlayerEntity player; + // Platform-typed player: yarn ServerPlayerEntity on intermediary, Mojang ServerPlayer + // on official. Concrete-only handling is delegated to AbstractFabricPlayerManager. + public Object player; private ChannelPromise promise; private final boolean preViaVersion; @@ -107,7 +107,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E if (didWeCauseThis && (user == null || user.getEncoderState() != ConnectionState.HANDSHAKING)) { if (PacketEvents.getAPI().getSettings().isKickOnPacketExceptionEnabled()) { try { - if (user != null && player instanceof ServerPlayerEntity) { + if (user != null && player != null) { WrapperPlayServerDisconnect disconnectPacket = new WrapperPlayServerDisconnect( net.kyori.adventure.text.Component.text("Invalid packet") ); @@ -115,10 +115,9 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E } } catch (Exception ignored) {} ctx.channel().close(); - if (player instanceof ServerPlayerEntity serverPlayer) { - serverPlayer.getServer().execute(() -> { - FabricPacketEventsAPI.getServerAPI().getPlayerManager().disconnectPlayer(serverPlayer, "Invalid packet"); - }); + if (player != null) { + FabricPacketEventsAPI.getServerAPI().getPlayerManager() + .kickOnException(player, "Invalid packet"); } } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadData.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/loader/ChainLoadEntryPoint.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java similarity index 77% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java index 539c32c4e8..6671487a73 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java +++ b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/AbstractFabricPlayerManager.java @@ -4,8 +4,6 @@ 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 { @@ -80,5 +78,20 @@ public void receivePacketSilently(Object player, PacketWrapper wrapper) { packetEventsAPI.getProtocolManager().receivePacketSilently(getChannel(player), wrapper); } - public abstract void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message); + /** + * Disconnect a player with the given message. The runtime object is the platform's + * server-player type (yarn {@code ServerPlayerEntity} on fabric-intermediary, Mojang + * {@code ServerPlayer} on fabric-official) — common code should never inspect it. + */ + public abstract void disconnectPlayer(@NotNull Object serverPlayer, @NotNull String message); + + /** + * Called from the netty pipeline when a packet processing exception should kick the + * player. Concrete impls own the server-thread hop and the platform-typed cast; the + * default forwards directly to {@link #disconnectPlayer(Object, String)}, which is + * safe for hand-rolled tests but real impls should schedule onto the server thread. + */ + public void kickOnException(@NotNull Object serverPlayer, @NotNull String message) { + disconnectPlayer(serverPlayer, message); + } } diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/FabricLoggerManager.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/FabricProtocolManager.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/FabricServerManager.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/InternalFabricPacketListener.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/PacketEventsMixinManager.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/AbstractFabricLogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/JdkFabricLogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/Log4jFabricLogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/Slf4jFabricLogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/JULoggerFactory.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Log4jBackedJULogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/logger/jul/Slf4jBackedJULogger.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/manager/registry/FabricRegistryManager.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java similarity index 86% rename from fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java index 160aa723a7..af6d43e48d 100644 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java +++ b/fabric-common/src/main/java/io/github/retrooper/packetevents/util/FabricInjectionUtil.java @@ -22,9 +22,6 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import net.minecraft.network.NetworkSide; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.server.network.ServerPlayerEntity; import java.util.List; @@ -32,16 +29,26 @@ public class FabricInjectionUtil { private static final String VIA_DECODER_NAME = "via-decoder"; private static final String VIA_ENCODER_NAME = "via-encoder"; - public static void injectAtPipelineBuilder(ChannelPipeline pipeline, NetworkSide flow) { - PacketSide pipelineSide = switch (flow) { - case CLIENTBOUND -> PacketSide.CLIENT; - case SERVERBOUND -> PacketSide.SERVER; - }; - + // pipelineSide is already PacketSide because each branch's mixin entrypoint converts + // from its native NetworkSide/PacketFlow enum before calling in. Keeping the enum + // out of fabric-common is what frees this class from yarn vs. Mojang chat.network.*. + public static void injectAtPipelineBuilder(ChannelPipeline pipeline, PacketSide pipelineSide) { FabricPacketEventsAPI fabricPacketEventsAPI = FabricPacketEventsAPI.getAPI(pipelineSide); - fabricPacketEventsAPI.getLogManager().debug("Game connected!"); Channel channel = pipeline.channel(); + + // 26.X: configureSerialization fires for EVERY state transition (LOGIN, + // CONFIGURATION, PLAY). On the first call we create the User + fire + // UserConnectEvent. On subsequent calls we must NOT overwrite the User + // (it now has a name, UUID, and is keyed in PlayerDataManager). Instead + // delegate to reinjectPipelineHandlers which preserves the existing User. + User existing = fabricPacketEventsAPI.getProtocolManager().getUser(channel); + if (existing != null) { + reinjectPipelineHandlers(channel, pipelineSide); + return; + } + + fabricPacketEventsAPI.getLogManager().debug("Game connected!"); User user = new User(channel, ConnectionState.HANDSHAKING, null, new UserProfile(null, null)); @@ -352,18 +359,45 @@ private static String findLatestHandler(List names, String... handlers) return latest; } - public static void fireUserLoginEvent(ServerPlayerEntity player) { + public static void reinjectPipelineHandlers(Channel channel, PacketSide side) { + FabricPacketEventsAPI api = FabricPacketEventsAPI.getAPI(side); + User user = api.getProtocolManager().getUser(channel); + if (user == null) return; + + ChannelPipeline pipeline = channel.pipeline(); + + // 26.X: PE's state machine may not transition CONFIGURATION → PLAY + // automatically (CONFIGURATION_END_ACK not triggering the internal + // switch). Detect the PLAY transition by checking whether the pipeline + // now has "decoder" instead of "inbound_config" (MC uses "decoder" + // for PLAY and "inbound_config" for LOGIN/CONFIGURATION). + // 26.X: detect CONFIGURATION → PLAY transition. Only force when the + // User is in CONFIGURATION and the pipeline now has "decoder" (PLAY's + // handler) instead of "inbound_config" (CONFIGURATION's handler). + // Don't force on LOGIN → CONFIGURATION which also briefly shows "decoder". + boolean hasDecoder = pipeline.names().contains("decoder"); + boolean hasInboundConfig = pipeline.names().contains("inbound_config"); + if (hasDecoder && !hasInboundConfig + && user.getConnectionState() == ConnectionState.CONFIGURATION) { + user.setConnectionState(ConnectionState.PLAY); + } + + // Do NOT remove + re-add PE's handlers. They persist across MC's state + // transitions (configureSerialization replaces MC's "decoder"/"encoder" + // but not arbitrary handlers). Removing PE's handlers triggers + // handlerRemoved → PE interprets as disconnect → GrimPlayer eviction. + // The state fix above is all that's needed. + } + + public static void fireUserLoginEvent(Object player) { FabricPacketEventsAPI api = FabricPacketEventsAPI.getServerAPI(); 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")); FabricPacketEventsAPI.getServerAPI().getPlayerManager().disconnectPlayer(player, "PacketEvents failed to inject into a channel."); } return; diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/util/LazyHolder.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessor.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionAccessorImpl.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java b/fabric-common/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java rename to fabric-common/src/main/java/io/github/retrooper/packetevents/util/viaversion/ViaVersionUtil.java diff --git a/fabric-intermediary/build.gradle.kts b/fabric-intermediary/build.gradle.kts new file mode 100644 index 0000000000..7c1cd580ad --- /dev/null +++ b/fabric-intermediary/build.gradle.kts @@ -0,0 +1,178 @@ +import me.modmuss50.mpp.ModPublishExtension +import me.modmuss50.mpp.PublishModTask +import net.fabricmc.loom.task.RemapJarTask +import net.fabricmc.loom.task.RemapSourcesJarTask +import net.fabricmc.loom.task.prod.ServerProductionRunTask + +plugins { + packetevents.`library-conventions` + net.fabricmc.`fabric-loom-remap` +} + +repositories { + mavenCentral() + maven("https://repo.viaversion.com/") + maven("https://jitpack.io") // Conditional Mixin +} + +val minecraft_version: String by project +val yarn_mappings: String by project +val loader_version: String by project + +dependencies { + // api() (compile + runtime classpath) but NOT include(): shared deps are + // JiJ'd once at the fabric/ aggregator to avoid duplicating ~5MB per variant. + api(libs.bundles.adventure) + api(project(":api", "shadow")) + api(project(":netty-common")) + api(project(":fabric-common")) + modApi("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") + mappings("net.fabricmc:yarn:$yarn_mappings") + + compileOnly(libs.via.version) + compileOnly("org.slf4j:slf4j-simple:2.0.16") +} + +loom { + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + } + } +} + +allprojects { + apply(plugin = "fabric-loom") + apply(plugin = "packetevents.publish-conventions") + + repositories { + maven("https://repo.codemc.io/repository/maven-snapshots/") + } + + dependencies { + modImplementation("net.fabricmc:fabric-loader:$loader_version") + } + + tasks { + withType { + val targetJavaVersion = 17 + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { + options.release = targetJavaVersion + } + } + + remapJar { + destinationDirectory = rootProject.layout.buildDirectory.dir("libs") + archiveBaseName = if (project == project(":fabric-intermediary")) { + "${rootProject.name}-fabric-intermediary" + } else { + // mcXXXX subprojects keep their own short name (e.g. mc1140) so the + // nested jars stay `packetevents-fabric-mc1140-.jar`. + "${rootProject.name}-fabric-${project.name}" + } + archiveVersion = rootProject.ext["artifactVersion"] as String + } + + remapSourcesJar { + archiveBaseName = if (project == project(":fabric-intermediary")) { + "${rootProject.name}-fabric-intermediary" + } else { + "${rootProject.name}-fabric-${project.name}" + } + archiveVersion = rootProject.ext["artifactVersion"] 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 intermediary names + // This preserves some compile-time safety, reduces jar size but be careful to not inject into wrong methods + useLegacyMixinAp.set(false) + } + + // accesswidener file is literally named "packetevents.accesswidener" (matches + // fabric.mod.json's accessWidener key), not "${rootProject.name}.accesswidener". + // rootProject.name resolves to "packetevents-public" in the workspace composite. + val accessWidenerFile = sourceSets["main"].resources.srcDirs.first() + .resolve("packetevents.accesswidener") + + if (accessWidenerFile.exists()) { + accessWidenerPath.set(accessWidenerFile) + } + } +} + +subprojects { + version = rootProject.version + val minecraft_version: String by project + + repositories { + maven { + name = "ParchmentMC" + url = uri("https://maven.parchmentmc.org") + } + } + + dependencies { + compileOnly(project(":api", "shadow")) + compileOnly(project(":netty-common")) + compileOnly(project(":fabric-common")) + compileOnly(project(":fabric-intermediary", configuration = "namedElements")) + } + + // 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( + mapOf( + "version" to project.version, + "modName" to "packetevents-${project.name}", + "minecraft_version" to minecraft_version // Or pull from a variable + ) + ) + } + } + } + + tasks.register("prodServer") { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(21) + } + } +} + +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) + } + } +} + +tasks.withType { + dependsOn(tasks.named("remapJar")) + dependsOn(tasks.named("remapSourcesJar")) +} + +configure { + file = tasks.named("remapJar").flatMap { it.archiveFile } + additionalFiles.from(tasks.named("remapSourcesJar").flatMap { it.archiveFile }) +} diff --git a/fabric-intermediary/gradle.properties b/fabric-intermediary/gradle.properties new file mode 100644 index 0000000000..2a2d2fcea0 --- /dev/null +++ b/fabric-intermediary/gradle.properties @@ -0,0 +1,15 @@ +# 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.14 +yarn_mappings=1.14+build.21 +loader_version=0.16.14 + +publishing.skip_files=true +publishing.platform=fabric +publishing.modrinth.loaders=fabric +publishing.modrinth.version.start=1.14 +publishing.modrinth.version.end=latest diff --git a/fabric/mc1140/build.gradle.kts b/fabric-intermediary/mc1140/build.gradle.kts similarity index 100% rename from fabric/mc1140/build.gradle.kts rename to fabric-intermediary/mc1140/build.gradle.kts diff --git a/fabric/mc1140/gradle.properties b/fabric-intermediary/mc1140/gradle.properties similarity index 100% rename from fabric/mc1140/gradle.properties rename to fabric-intermediary/mc1140/gradle.properties diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ChainLoadEntrypoint.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/Fabric1140ClientChainLoadEntrypoint.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ClientPlayerManager.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java similarity index 82% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java index fa55c6232d..e88d7042a5 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java +++ b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/factory/fabric/Fabric1140ServerPlayerManager.java @@ -47,7 +47,13 @@ public Object getChannel(@NotNull Object player) { } @Override - public void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message) { - serverPlayerEntity.networkHandler.disconnect(new TextComponent(message)); + public void disconnectPlayer(@NotNull Object player, @NotNull String message) { + ((ServerPlayerEntity) player).networkHandler.disconnect(new TextComponent(message)); + } + + @Override + public void kickOnException(@NotNull Object player, @NotNull String message) { + ServerPlayerEntity sp = (ServerPlayerEntity) player; + sp.getServer().execute(() -> disconnectPlayer(sp, message)); } } diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/manager/registry/Fabric1140ItemRegistry.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/ClientPlayerNetworkHandlerMixin.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java similarity index 92% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java index a74f918ceb..b21e3a6dbb 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java +++ b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionChInit.java @@ -1,11 +1,11 @@ package io.github.retrooper.packetevents.mc1140.mixin; +import com.github.retrooper.packetevents.protocol.PacketSide; 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; @@ -21,7 +21,7 @@ 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); + FabricInjectionUtil.injectAtPipelineBuilder(channel.pipeline(), PacketSide.CLIENT); } } } diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionCompression.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionCompression.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionCompression.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinClientConnectionCompression.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java similarity index 92% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java index f25bc0e6f3..fcff26254a 100644 --- a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java +++ b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/MixinServerNetworkIoChInit.java @@ -1,11 +1,11 @@ package io.github.retrooper.packetevents.mc1140.mixin; +import com.github.retrooper.packetevents.protocol.PacketSide; 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; @@ -21,7 +21,7 @@ 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); + FabricInjectionUtil.injectAtPipelineBuilder(channel.pipeline(), PacketSide.SERVER); } } } diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerMixin.java diff --git a/fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java b/fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java similarity index 100% rename from fabric/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java rename to fabric-intermediary/mc1140/src/main/java/io/github/retrooper/packetevents/mc1140/mixin/PlayerManagerRespawnMixin.java diff --git a/fabric/mc1140/src/main/resources/fabric.mod.json b/fabric-intermediary/mc1140/src/main/resources/fabric.mod.json similarity index 91% rename from fabric/mc1140/src/main/resources/fabric.mod.json rename to fabric-intermediary/mc1140/src/main/resources/fabric.mod.json index 77ee14b251..1e39d7491b 100644 --- a/fabric/mc1140/src/main/resources/fabric.mod.json +++ b/fabric-intermediary/mc1140/src/main/resources/fabric.mod.json @@ -23,6 +23,7 @@ ], "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": "*" + "fabricloader": "*", + "minecraft": ">=1.16.1 <26" } } diff --git a/fabric/mc1140/src/main/resources/packetevents-mc1140.mixins.json b/fabric-intermediary/mc1140/src/main/resources/packetevents-mc1140.mixins.json similarity index 100% rename from fabric/mc1140/src/main/resources/packetevents-mc1140.mixins.json rename to fabric-intermediary/mc1140/src/main/resources/packetevents-mc1140.mixins.json diff --git a/fabric/mc1140/src/main/resources/packetevents.accesswidener b/fabric-intermediary/mc1140/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1140/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/mc1140/src/main/resources/packetevents.accesswidener diff --git a/fabric/mc1194/build.gradle.kts b/fabric-intermediary/mc1194/build.gradle.kts similarity index 85% rename from fabric/mc1194/build.gradle.kts rename to fabric-intermediary/mc1194/build.gradle.kts index d34cc42f67..06e7eae906 100644 --- a/fabric/mc1194/build.gradle.kts +++ b/fabric-intermediary/mc1194/build.gradle.kts @@ -6,7 +6,7 @@ repositories { } dependencies { - compileOnly(project(":fabric:mc1140", configuration = "namedElements")) + compileOnly(project(":fabric-intermediary: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/gradle.properties b/fabric-intermediary/mc1194/gradle.properties similarity index 100% rename from fabric/mc1194/gradle.properties rename to fabric-intermediary/mc1194/gradle.properties diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java b/fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java rename to fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/Fabric1913ChainLoadEntrypoint.java diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java b/fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java similarity index 85% rename from fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java rename to fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java index 21f5bf773d..bf09d1735f 100644 --- a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java +++ b/fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/factory/fabric/Fabric1190ServerPlayerManager.java @@ -31,7 +31,7 @@ public Fabric1190ServerPlayerManager(PacketEventsAPI packetEventsAPI) { // new TextComponent -> Text.literal in 1.19 @Override - public void disconnectPlayer(ServerPlayerEntity serverPlayerEntity, String message) { - serverPlayerEntity.networkHandler.disconnect(Text.literal(message)); + public void disconnectPlayer(@org.jetbrains.annotations.NotNull Object player, @org.jetbrains.annotations.NotNull String message) { + ((ServerPlayerEntity) player).networkHandler.disconnect(Text.literal(message)); } } diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java b/fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java similarity index 100% rename from fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java rename to fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/manager/registry/Fabric1193ItemRegistry.java diff --git a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java b/fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java similarity index 81% rename from fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java rename to fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java index 5b55b0ec6f..04dc12d1a4 100644 --- a/fabric/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java +++ b/fabric-intermediary/mc1194/src/main/java/io/github/retrooper/packetevents/mc1914/mixin/ClientConnectionMixin.java @@ -1,5 +1,6 @@ package io.github.retrooper.packetevents.mc1914.mixin; +import com.github.retrooper.packetevents.protocol.PacketSide; import com.llamalad7.mixinextras.sugar.Local; import io.github.retrooper.packetevents.util.FabricInjectionUtil; import io.netty.channel.ChannelPipeline; @@ -29,6 +30,10 @@ private static void addHandlers( @Local(ordinal = 0, argsOnly = true) ChannelPipeline pipeline, @Local(ordinal = 0, argsOnly = true) NetworkSide flow ) { - FabricInjectionUtil.injectAtPipelineBuilder(pipeline, flow); + PacketSide side = switch (flow) { + case CLIENTBOUND -> PacketSide.CLIENT; + case SERVERBOUND -> PacketSide.SERVER; + }; + FabricInjectionUtil.injectAtPipelineBuilder(pipeline, side); } } \ No newline at end of file diff --git a/fabric/mc1194/src/main/resources/fabric.mod.json b/fabric-intermediary/mc1194/src/main/resources/fabric.mod.json similarity index 94% rename from fabric/mc1194/src/main/resources/fabric.mod.json rename to fabric-intermediary/mc1194/src/main/resources/fabric.mod.json index 3333e4a001..23cd5d5e9f 100644 --- a/fabric/mc1194/src/main/resources/fabric.mod.json +++ b/fabric-intermediary/mc1194/src/main/resources/fabric.mod.json @@ -21,6 +21,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", - "minecraft": ">=1.19" + "minecraft": ">=1.19 \u003c26" } } diff --git a/fabric/mc1194/src/main/resources/packetevents-mc1914.mixins.json b/fabric-intermediary/mc1194/src/main/resources/packetevents-mc1914.mixins.json similarity index 100% rename from fabric/mc1194/src/main/resources/packetevents-mc1914.mixins.json rename to fabric-intermediary/mc1194/src/main/resources/packetevents-mc1914.mixins.json diff --git a/fabric/mc1194/src/main/resources/packetevents.accesswidener b/fabric-intermediary/mc1194/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1194/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/mc1194/src/main/resources/packetevents.accesswidener diff --git a/fabric/mc1215/build.gradle.kts b/fabric-intermediary/mc1202/build.gradle.kts similarity index 84% rename from fabric/mc1215/build.gradle.kts rename to fabric-intermediary/mc1202/build.gradle.kts index 96da42c684..6d81c0c2c9 100644 --- a/fabric/mc1215/build.gradle.kts +++ b/fabric-intermediary/mc1202/build.gradle.kts @@ -2,7 +2,7 @@ val minecraft_version: String by project val yarn_mappings: String by project dependencies { - compileOnly(project(":fabric:mc1211", configuration = "namedElements")) + compileOnly(project(":fabric-intermediary:mc1140", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") diff --git a/fabric/mc1202/gradle.properties b/fabric-intermediary/mc1202/gradle.properties similarity index 100% rename from fabric/mc1202/gradle.properties rename to fabric-intermediary/mc1202/gradle.properties diff --git a/fabric/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java b/fabric-intermediary/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java similarity index 100% rename from fabric/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java rename to fabric-intermediary/mc1202/src/client/java/io/github/retrooper/packetevents/mc1202/factory/fabric/ClientPlayerNetworkHandlerMixin.java diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java b/fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java rename to fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/Fabric1202ChainLoadEntrypoint.java diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java b/fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java similarity index 92% rename from fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java rename to fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java index bdd717797b..8f9103ebb0 100644 --- a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java +++ b/fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/factory/fabric/Fabric1202ServerPlayerManager.java @@ -48,7 +48,7 @@ public Object getChannel(@NotNull Object 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)); + public void disconnectPlayer(@NotNull Object player, @NotNull String message) { + ((ServerPlayerEntity) player).networkHandler.disconnect(Text.literal(message)); } } diff --git a/fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java b/fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java similarity index 100% rename from fabric/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java rename to fabric-intermediary/mc1202/src/main/java/io/github/retrooper/packetevents/mc1202/mixin/PlayerManagerRespawnMixin.java diff --git a/fabric/mc1202/src/main/resources/fabric.mod.json b/fabric-intermediary/mc1202/src/main/resources/fabric.mod.json similarity index 93% rename from fabric/mc1202/src/main/resources/fabric.mod.json rename to fabric-intermediary/mc1202/src/main/resources/fabric.mod.json index 6cae6dfacc..cbe562acbb 100644 --- a/fabric/mc1202/src/main/resources/fabric.mod.json +++ b/fabric-intermediary/mc1202/src/main/resources/fabric.mod.json @@ -21,6 +21,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", - "minecraft": ">=1.20.2" + "minecraft": ">=1.20.2 \u003c26" } } diff --git a/fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json b/fabric-intermediary/mc1202/src/main/resources/packetevents-mc1202.mixins.json similarity index 100% rename from fabric/mc1202/src/main/resources/packetevents-mc1202.mixins.json rename to fabric-intermediary/mc1202/src/main/resources/packetevents-mc1202.mixins.json diff --git a/fabric/mc1202/src/main/resources/packetevents.accesswidener b/fabric-intermediary/mc1202/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1202/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/mc1202/src/main/resources/packetevents.accesswidener diff --git a/fabric/mc1211/build.gradle.kts b/fabric-intermediary/mc1211/build.gradle.kts similarity index 73% rename from fabric/mc1211/build.gradle.kts rename to fabric-intermediary/mc1211/build.gradle.kts index 35a7903df9..e87e9d5b82 100644 --- a/fabric/mc1211/build.gradle.kts +++ b/fabric-intermediary/mc1211/build.gradle.kts @@ -2,8 +2,8 @@ val minecraft_version: String by project val yarn_mappings: String by project dependencies { - compileOnly(project(":fabric:mc1202", configuration = "namedElements")) - compileOnly(project(":fabric:mc1140", configuration = "namedElements")) + compileOnly(project(":fabric-intermediary:mc1202", configuration = "namedElements")) + compileOnly(project(":fabric-intermediary:mc1140", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") diff --git a/fabric/mc1211/gradle.properties b/fabric-intermediary/mc1211/gradle.properties similarity index 100% rename from fabric/mc1211/gradle.properties rename to fabric-intermediary/mc1211/gradle.properties diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java b/fabric-intermediary/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java rename to fabric-intermediary/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/Fabric1205ClientChainLoadEntrypoint.java diff --git a/fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java b/fabric-intermediary/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java similarity index 100% rename from fabric/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java rename to fabric-intermediary/mc1211/src/client/java/io/github/retrooper/packetevents/mc1211/factory/fabric/Fabric1205ClientPlayerManager.java diff --git a/fabric/mc1211/src/main/resources/fabric.mod.json b/fabric-intermediary/mc1211/src/main/resources/fabric.mod.json similarity index 93% rename from fabric/mc1211/src/main/resources/fabric.mod.json rename to fabric-intermediary/mc1211/src/main/resources/fabric.mod.json index 53ae9aa1a1..8d04897cfd 100644 --- a/fabric/mc1211/src/main/resources/fabric.mod.json +++ b/fabric-intermediary/mc1211/src/main/resources/fabric.mod.json @@ -18,6 +18,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", - "minecraft": ">=1.20.5" + "minecraft": ">=1.20.5 \u003c26" } } diff --git a/fabric/mc1211/src/main/resources/packetevents.accesswidener b/fabric-intermediary/mc1211/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1211/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/mc1211/src/main/resources/packetevents.accesswidener diff --git a/fabric/mc1216/build.gradle.kts b/fabric-intermediary/mc1215/build.gradle.kts similarity index 84% rename from fabric/mc1216/build.gradle.kts rename to fabric-intermediary/mc1215/build.gradle.kts index 96da42c684..2655c2059b 100644 --- a/fabric/mc1216/build.gradle.kts +++ b/fabric-intermediary/mc1215/build.gradle.kts @@ -2,7 +2,7 @@ val minecraft_version: String by project val yarn_mappings: String by project dependencies { - compileOnly(project(":fabric:mc1211", configuration = "namedElements")) + compileOnly(project(":fabric-intermediary:mc1211", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") diff --git a/fabric/mc1215/gradle.properties b/fabric-intermediary/mc1215/gradle.properties similarity index 100% rename from fabric/mc1215/gradle.properties rename to fabric-intermediary/mc1215/gradle.properties diff --git a/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java b/fabric-intermediary/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java rename to fabric-intermediary/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/Fabric1212ChainLoadEntrypoint.java diff --git a/fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java b/fabric-intermediary/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java similarity index 100% rename from fabric/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java rename to fabric-intermediary/mc1215/src/main/java/io/github/retrooper/packetevents/mc1215/manager/registry/Fabric1212ItemRegistry.java diff --git a/fabric/mc1215/src/main/resources/fabric.mod.json b/fabric-intermediary/mc1215/src/main/resources/fabric.mod.json similarity index 93% rename from fabric/mc1215/src/main/resources/fabric.mod.json rename to fabric-intermediary/mc1215/src/main/resources/fabric.mod.json index da12739935..f90ad896f1 100644 --- a/fabric/mc1215/src/main/resources/fabric.mod.json +++ b/fabric-intermediary/mc1215/src/main/resources/fabric.mod.json @@ -18,6 +18,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", - "minecraft": ">=1.21.2" + "minecraft": ">=1.21.2 \u003c26" } } diff --git a/fabric/mc1215/src/main/resources/packetevents.accesswidener b/fabric-intermediary/mc1215/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1215/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/mc1215/src/main/resources/packetevents.accesswidener diff --git a/fabric/mc1202/build.gradle.kts b/fabric-intermediary/mc1216/build.gradle.kts similarity index 84% rename from fabric/mc1202/build.gradle.kts rename to fabric-intermediary/mc1216/build.gradle.kts index 765bc2f7fa..2655c2059b 100644 --- a/fabric/mc1202/build.gradle.kts +++ b/fabric-intermediary/mc1216/build.gradle.kts @@ -2,7 +2,7 @@ val minecraft_version: String by project val yarn_mappings: String by project dependencies { - compileOnly(project(":fabric:mc1140", configuration = "namedElements")) + compileOnly(project(":fabric-intermediary:mc1211", configuration = "namedElements")) // To change the versions, see the gradle.properties file minecraft("com.mojang:minecraft:$minecraft_version") diff --git a/fabric/mc1216/gradle.properties b/fabric-intermediary/mc1216/gradle.properties similarity index 100% rename from fabric/mc1216/gradle.properties rename to fabric-intermediary/mc1216/gradle.properties diff --git a/fabric/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/Fabric1212ChainLoadEntrypoint.java b/fabric-intermediary/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/Fabric1212ChainLoadEntrypoint.java similarity index 100% rename from fabric/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/Fabric1212ChainLoadEntrypoint.java rename to fabric-intermediary/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/Fabric1212ChainLoadEntrypoint.java diff --git a/fabric/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/manager/registry/Fabric1212ItemRegistry.java b/fabric-intermediary/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/manager/registry/Fabric1212ItemRegistry.java similarity index 100% rename from fabric/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/manager/registry/Fabric1212ItemRegistry.java rename to fabric-intermediary/mc1216/src/main/java/io/github/retrooper/packetevents/mc1216/manager/registry/Fabric1212ItemRegistry.java diff --git a/fabric/mc1216/src/main/resources/fabric.mod.json b/fabric-intermediary/mc1216/src/main/resources/fabric.mod.json similarity index 93% rename from fabric/mc1216/src/main/resources/fabric.mod.json rename to fabric-intermediary/mc1216/src/main/resources/fabric.mod.json index 9e93ed05a3..51737cbb76 100644 --- a/fabric/mc1216/src/main/resources/fabric.mod.json +++ b/fabric-intermediary/mc1216/src/main/resources/fabric.mod.json @@ -18,6 +18,6 @@ "accessWidener": "packetevents.accesswidener", "depends": { "fabricloader": "*", - "minecraft": ">=1.21.2" + "minecraft": ">=1.21.2 \u003c26" } } diff --git a/fabric/mc1216/src/main/resources/packetevents.accesswidener b/fabric-intermediary/mc1216/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/mc1216/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/mc1216/src/main/resources/packetevents.accesswidener diff --git a/fabric/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java b/fabric-intermediary/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java similarity index 100% rename from fabric/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java rename to fabric-intermediary/src/client/java/io/github/retrooper/packetevents/mixin/ClientPacketListenerMixin.java diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java b/fabric-intermediary/src/main/java/io/github/retrooper/packetevents/FabricItemType.java similarity index 100% rename from fabric/src/main/java/io/github/retrooper/packetevents/FabricItemType.java rename to fabric-intermediary/src/main/java/io/github/retrooper/packetevents/FabricItemType.java diff --git a/fabric/src/main/resources/assets/packetevents/icon.png b/fabric-intermediary/src/main/resources/assets/packetevents/icon.png similarity index 100% rename from fabric/src/main/resources/assets/packetevents/icon.png rename to fabric-intermediary/src/main/resources/assets/packetevents/icon.png diff --git a/fabric-intermediary/src/main/resources/fabric.mod.json b/fabric-intermediary/src/main/resources/fabric.mod.json new file mode 100644 index 0000000000..11bb903164 --- /dev/null +++ b/fabric-intermediary/src/main/resources/fabric.mod.json @@ -0,0 +1,31 @@ +{ + "schemaVersion": 1, + "id": "packetevents-fabric-intermediary", + "version": "${version}", + "name": "PacketEvents", + "description": "", + "authors": [ + "retrooper" + ], + "contact": {}, + "license": "GPL-3.0", + "icon": "assets/packetevents/icon.png", + "environment": "*", + "entrypoints": { + "preLaunch": [ + "io.github.retrooper.packetevents.PacketEventsMod" + ], + "main": [ + "io.github.retrooper.packetevents.PacketEventsMod" + ] + }, + "mixins": [ + "packetevents.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "minecraft": ">=1.16.1 <26", + "java": ">=17", + "fabricloader": ">=0.16" + } +} diff --git a/fabric/src/main/resources/packetevents.accesswidener b/fabric-intermediary/src/main/resources/packetevents.accesswidener similarity index 100% rename from fabric/src/main/resources/packetevents.accesswidener rename to fabric-intermediary/src/main/resources/packetevents.accesswidener diff --git a/fabric/src/main/resources/packetevents.mixins.json b/fabric-intermediary/src/main/resources/packetevents.mixins.json similarity index 100% rename from fabric/src/main/resources/packetevents.mixins.json rename to fabric-intermediary/src/main/resources/packetevents.mixins.json diff --git a/fabric/src/main/resources/packetevents/icon.png b/fabric-intermediary/src/main/resources/packetevents/icon.png similarity index 100% rename from fabric/src/main/resources/packetevents/icon.png rename to fabric-intermediary/src/main/resources/packetevents/icon.png diff --git a/fabric-official/build.gradle.kts b/fabric-official/build.gradle.kts new file mode 100644 index 0000000000..42448de8f3 --- /dev/null +++ b/fabric-official/build.gradle.kts @@ -0,0 +1,152 @@ +// MC 26.X+ ships pre-deobfuscated, so this module uses LoomNoRemap and references +// net.minecraft.* directly — no mappings() needed. + +plugins { + packetevents.`library-conventions` + net.fabricmc.`fabric-loom` +} + +repositories { + mavenCentral() + maven("https://maven.fabricmc.net/") + maven("https://repo.viaversion.com/") + maven("https://jitpack.io") +} + +val minecraft_version: String by project +val loader_version: String by project + +dependencies { + // Shared deps are JiJ'd once at the top-level fabric/ aggregator; only the + // per-version variants are included here. + api(project(":api", "shadow")) + api(project(":netty-common")) + api(project(":fabric-common")) + api("com.github.Fallen-Breath.conditional-mixin:conditional-mixin-fabric:0.6.4") + + include(project(":fabric-official:mc261")) + + minecraft("com.mojang:minecraft:$minecraft_version") +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +loom { + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + } + } + mixin { + useLegacyMixinAp.set(false) + } + + val accessWidenerFile = sourceSets["main"].resources.srcDirs.first() + .resolve("packetevents.accesswidener") + if (accessWidenerFile.exists()) { + accessWidenerPath.set(accessWidenerFile) + } +} + +allprojects { + // Fully-qualified id maps to LoomNoRemapGradlePlugin; the short "fabric-loom" maps + // to the older all-in-one LoomGradlePlugin and conflicts when both are applied. + apply(plugin = "net.fabricmc.fabric-loom") + apply(plugin = "packetevents.publish-conventions") + + repositories { + mavenCentral() + maven("https://maven.fabricmc.net/") + maven("https://repo.codemc.io/repository/maven-snapshots/") + maven("https://jitpack.io") + } + + dependencies { + // LoomNoRemap exposes plain configurations; mod* configs are LoomRemap-only. + compileOnly("net.fabricmc:fabric-loader:$loader_version") + } + + java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } + } + + tasks { + withType { + options.release = 25 + } + + // LoomNoRemap publishes via the plain `jar` task (the jar is already in the + // target namespace). Route it to the rootProject libs/ so the top-level fabric + // aggregator can JiJ it alongside fabric-intermediary's remapJar output. + jar { + destinationDirectory = rootProject.layout.buildDirectory.dir("libs") + archiveBaseName = if (project == project(":fabric-official")) { + "${rootProject.name}-fabric-official" + } else { + "${rootProject.name}-fabric-${project.name}" + } + archiveVersion = rootProject.ext["artifactVersion"] as String + } + } +} + +subprojects { + version = rootProject.version + val minecraft_version: String by project + + dependencies { + compileOnly(project(":api", "shadow")) + compileOnly(project(":netty-common")) + compileOnly(project(":fabric-common")) + // LoomNoRemap doesn't publish a "namedElements" variant; depend on the + // standard apiElements via the default project() form so MC types from + // fabric-official's classpath (which include the deobfuscated 26.X jar) + // resolve for mc261 source. + compileOnly(project(":fabric-official")) + } + + loom { + mixin { + useLegacyMixinAp.set(false) + } + + val accessWidenerFile = sourceSets["main"].resources.srcDirs.first() + .resolve("packetevents.accesswidener") + if (accessWidenerFile.exists()) { + accessWidenerPath.set(accessWidenerFile) + } + } + + tasks { + processResources { + inputs.property("version", project.version) + inputs.property("modName", "packetevents-${project.name}") + inputs.property("minecraft_version", minecraft_version) + + filesMatching("fabric.mod.json") { + expand( + mapOf( + "version" to project.version, + "modName" to "packetevents-${project.name}", + "minecraft_version" to minecraft_version, + ) + ) + } + } + } +} + +// Top-level fabric-official jar JiJs the mc261 (and future 26.X) variant jars beside +// the common shell. LoomNoRemap exposes `Jar` (not `AbstractRemapJarTask`), so we +// nest via fabric-loom's `include` instead — declared up in the dependencies block. +subprojects.forEach { sub -> + tasks.named("jar").configure { + dependsOn("${sub.path}:jar") + } +} diff --git a/fabric-official/gradle.properties b/fabric-official/gradle.properties new file mode 100644 index 0000000000..891ea70173 --- /dev/null +++ b/fabric-official/gradle.properties @@ -0,0 +1,12 @@ +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true + +# Fabric Properties (MC 26.1+, official Mojang mappings, Java 25) +minecraft_version=26.1.2 +loader_version=0.19.1 + +publishing.skip_files=true +publishing.platform=fabric +publishing.modrinth.loaders=fabric +publishing.modrinth.version.start=26.1 +publishing.modrinth.version.end=latest diff --git a/fabric-official/mc261/build.gradle.kts b/fabric-official/mc261/build.gradle.kts new file mode 100644 index 0000000000..0715d2587a --- /dev/null +++ b/fabric-official/mc261/build.gradle.kts @@ -0,0 +1,24 @@ +val minecraft_version: String by project + +plugins { + net.fabricmc.`fabric-loom` +} + +repositories { + mavenCentral() +} + +dependencies { + minecraft("com.mojang:minecraft:$minecraft_version") + // No mappings(): LoomNoRemap uses the pre-deobfuscated 26.1.2 jar's Mojang names + // directly. Source code in this subproject references net.minecraft.* names that + // exist verbatim in the server.jar (net.minecraft.world.item.Item, etc.). +} + +loom { + mods { + register("packetevents-${project.name}") { + sourceSet(sourceSets.main.get()) + } + } +} diff --git a/fabric-official/mc261/gradle.properties b/fabric-official/mc261/gradle.properties new file mode 100644 index 0000000000..610ac2d374 --- /dev/null +++ b/fabric-official/mc261/gradle.properties @@ -0,0 +1 @@ +minecraft_version=26.1.2 diff --git a/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/Fabric261ChainLoadEntrypoint.java b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/Fabric261ChainLoadEntrypoint.java new file mode 100644 index 0000000000..2fa3982aa0 --- /dev/null +++ b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/Fabric261ChainLoadEntrypoint.java @@ -0,0 +1,44 @@ +package io.github.retrooper.packetevents.mc261; + +import com.github.retrooper.packetevents.manager.registry.ItemRegistry; +import com.github.retrooper.packetevents.manager.registry.RegistryManager; +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.protocol.item.type.ItemType; +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.AbstractFabricPlayerManager; +import io.github.retrooper.packetevents.manager.registry.FabricRegistryManager; +import io.github.retrooper.packetevents.mc261.factory.fabric.Fabric261PlayerManager; +import io.github.retrooper.packetevents.util.LazyHolder; +import org.jetbrains.annotations.Nullable; + +public class Fabric261ChainLoadEntrypoint implements ChainLoadEntryPoint { + + private final LazyHolder playerManager = + LazyHolder.simple(() -> new Fabric261PlayerManager(FabricPacketEventsAPI.getServerAPI())); + + // 26.X's BuiltInRegistries layout differs from yarn and a real Item ↔ ItemType + // lookup needs its own implementation. Until that lands, register a null-returning + // stub so FabricPacketEventsAPI.getRegistryManager() doesn't dereference a null + // LazyHolder — the intermediary chain can't fill this slot because fabric- + // intermediary's mods are gated <26. + private final LazyHolder registryManager = + LazyHolder.simple(() -> new FabricRegistryManager(new ItemRegistry() { + @Override + public @Nullable ItemType getByName(String name) { return null; } + @Override + public @Nullable ItemType getById(int id) { return null; } + })); + + @Override + public void initialize(ChainLoadData chainLoadData) { + chainLoadData.setPlayerManagerIfNull(playerManager); + chainLoadData.setRegistryManagerIfNull(registryManager); + } + + @Override + public ServerVersion getNativeVersion() { + return ServerVersion.V_26_1; + } +} diff --git a/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/factory/fabric/Fabric261PlayerManager.java b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/factory/fabric/Fabric261PlayerManager.java new file mode 100644 index 0000000000..ee66f38c99 --- /dev/null +++ b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/factory/fabric/Fabric261PlayerManager.java @@ -0,0 +1,57 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2026 retrooper and contributors + * + * Licensed under the GNU General Public License v3.0 (see the LICENSE file in the + * project root or ). + */ + +package io.github.retrooper.packetevents.mc261.factory.fabric; + +import com.github.retrooper.packetevents.PacketEventsAPI; +import io.github.retrooper.packetevents.manager.AbstractFabricPlayerManager; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.NotNull; + +// 26.1.2-pinned concrete player manager. Per-version sibling of mc1140/mc1194/mc1202 +// in the chain, but Mojang-named (against the pre-deobfuscated 26.X jar) instead of +// yarn-named. Lives in mc261 because the underlying MC signatures +// (ServerPlayer.connection.connection.channel, ServerLevel.getServer()) will shift +// in future 26.X minor releases — each release gets its own mc26X subproject. +public class Fabric261PlayerManager extends AbstractFabricPlayerManager { + + public Fabric261PlayerManager(PacketEventsAPI packetEventsAPI) { + super(packetEventsAPI); + } + + @Override + public int getPing(@NotNull Object player) { + if (player instanceof ServerPlayer sp) { + return sp.connection.latency(); + } + throw new UnsupportedOperationException("Unsupported player implementation: " + player); + } + + @Override + public Object getChannel(@NotNull Object player) { + if (player instanceof ServerPlayer sp) { + // Connection.channel access requires the AW entry shipped beside this class. + return sp.connection.connection.channel; + } + throw new UnsupportedOperationException("Unsupported player implementation: " + player); + } + + @Override + public void disconnectPlayer(@NotNull Object player, @NotNull String message) { + ((ServerPlayer) player).connection.disconnect(Component.literal(message)); + } + + @Override + public void kickOnException(@NotNull Object player, @NotNull String message) { + ServerPlayer sp = (ServerPlayer) player; + // ServerPlayer doesn't expose getServer() directly in 26.X mappings; the + // ServerLevel reference does. + sp.level().getServer().execute(() -> disconnectPlayer(sp, message)); + } +} diff --git a/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/mixin/ConnectionMixin.java b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/mixin/ConnectionMixin.java new file mode 100644 index 0000000000..6547bdaa2a --- /dev/null +++ b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/mixin/ConnectionMixin.java @@ -0,0 +1,76 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2026 retrooper and contributors + * + * Licensed under the GNU General Public License v3.0 (see the LICENSE file in the + * project root or ). + */ + +package io.github.retrooper.packetevents.mc261.mixin; + +import com.github.retrooper.packetevents.protocol.PacketSide; +import io.github.retrooper.packetevents.util.FabricInjectionUtil; +import io.netty.channel.Channel; +import io.netty.channel.ChannelPipeline; +import net.minecraft.network.BandwidthDebugMonitor; +import net.minecraft.network.Connection; +import net.minecraft.network.PacketListener; +import net.minecraft.network.ProtocolInfo; +import net.minecraft.network.protocol.PacketFlow; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// Inject PE handlers at initial pipeline setup, then re-inject on each state +// transition since MC replaces the decoder/encoder when switching protocols. +// Without the setup{In,Out}boundProtocol hooks, PE loses PE-decoder/encoder +// at the LOGIN/CONFIGURATION/PLAY transition and never sees PLAY packets. +@Mixin(value = Connection.class, priority = 1500) +public abstract class ConnectionMixin { + + @Shadow @Final private PacketFlow receiving; + @Shadow private Channel channel; + + @Inject( + method = "configureSerialization(Lio/netty/channel/ChannelPipeline;Lnet/minecraft/network/protocol/PacketFlow;ZLnet/minecraft/network/BandwidthDebugMonitor;)V", + at = @At("TAIL") + ) + private static void packetevents$injectAtPipelineBuilder( + ChannelPipeline pipeline, + PacketFlow flow, + boolean memoryOnly, + BandwidthDebugMonitor monitor, + CallbackInfo ci + ) { + PacketSide side = switch (flow) { + case CLIENTBOUND -> PacketSide.CLIENT; + case SERVERBOUND -> PacketSide.SERVER; + }; + FabricInjectionUtil.injectAtPipelineBuilder(pipeline, side); + } + + @Inject(method = "setupInboundProtocol", at = @At("TAIL")) + private void packetevents$reinjectOnInboundSwitch( + ProtocolInfo info, T listener, CallbackInfo ci + ) { + packetevents$reinjectPipelineHandlers(); + } + + @Inject(method = "setupOutboundProtocol", at = @At("TAIL")) + private void packetevents$reinjectOnOutboundSwitch( + ProtocolInfo info, CallbackInfo ci + ) { + packetevents$reinjectPipelineHandlers(); + } + + private void packetevents$reinjectPipelineHandlers() { + PacketSide side = switch (this.receiving) { + case CLIENTBOUND -> PacketSide.CLIENT; + case SERVERBOUND -> PacketSide.SERVER; + }; + FabricInjectionUtil.reinjectPipelineHandlers(this.channel, side); + } +} diff --git a/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/mixin/PlayerListMixin.java b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/mixin/PlayerListMixin.java new file mode 100644 index 0000000000..e23ee71ed0 --- /dev/null +++ b/fabric-official/mc261/src/main/java/io/github/retrooper/packetevents/mc261/mixin/PlayerListMixin.java @@ -0,0 +1,40 @@ +/* + * This file is part of packetevents - https://github.com/retrooper/packetevents + * Copyright (C) 2026 retrooper and contributors + * + * Licensed under the GNU General Public License v3.0 (see the LICENSE file in the + * project root or ). + */ + +package io.github.retrooper.packetevents.mc261.mixin; + +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 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; + +// 26.X twin of fabric-intermediary's PlayerManagerMixin (mc1140). +// HEAD: bind channel → ServerPlayer so getUser() can resolve the mapping. +// TAIL: fire UserLoginEvent now that the player is in PLAY state. +@Mixin(PlayerList.class) +public abstract class PlayerListMixin { + + @Inject(method = "placeNewPlayer", at = @At("HEAD")) + private void packetevents$onPlayerConnect(Connection connection, ServerPlayer player, + net.minecraft.server.network.CommonListenerCookie cookie, + CallbackInfo ci) { + FabricPacketEventsAPI.getServerAPI().getInjector().setPlayer(connection.channel, player); + } + + @Inject(method = "placeNewPlayer", at = @At("TAIL")) + private void packetevents$onPlayerLogin(Connection connection, ServerPlayer player, + net.minecraft.server.network.CommonListenerCookie cookie, + CallbackInfo ci) { + FabricInjectionUtil.fireUserLoginEvent(player); + } +} diff --git a/fabric-official/mc261/src/main/resources/fabric.mod.json b/fabric-official/mc261/src/main/resources/fabric.mod.json new file mode 100644 index 0000000000..63635001b8 --- /dev/null +++ b/fabric-official/mc261/src/main/resources/fabric.mod.json @@ -0,0 +1,23 @@ +{ + "schemaVersion": 1, + "id": "packetevents-fabric-mc261", + "version": "${version}", + "name": "${modName}", + "description": "Per-version chain participant for Minecraft 26.1+. Registers peMainChainLoad so fabric-common's PacketEventsMod can dispatch the chain.", + "license": "GPL-3.0", + "environment": "*", + "entrypoints": { + "peMainChainLoad": [ + "io.github.retrooper.packetevents.mc261.Fabric261ChainLoadEntrypoint" + ] + }, + "mixins": [ + "packetevents.mixins.json" + ], + "accessWidener": "packetevents.accesswidener", + "depends": { + "minecraft": ">=26.1.2 <26.2", + "java": ">=25", + "fabricloader": ">=0.19" + } +} diff --git a/fabric-official/mc261/src/main/resources/packetevents.accesswidener b/fabric-official/mc261/src/main/resources/packetevents.accesswidener new file mode 100644 index 0000000000..33e31c80ea --- /dev/null +++ b/fabric-official/mc261/src/main/resources/packetevents.accesswidener @@ -0,0 +1,8 @@ +accessWidener v2 official +# Accessing the underlying netty channel via ServerPlayer.connection.connection.channel +# requires widening two fields beyond their default visibility: +# - Connection.channel (private) +# - ServerCommonPacketListenerImpl.connection (protected, holds the Connection) +accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel; +accessible field net/minecraft/network/Connection receiving Lnet/minecraft/network/protocol/PacketFlow; +accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection; diff --git a/fabric-official/mc261/src/main/resources/packetevents.mixins.json b/fabric-official/mc261/src/main/resources/packetevents.mixins.json new file mode 100644 index 0000000000..912bd04083 --- /dev/null +++ b/fabric-official/mc261/src/main/resources/packetevents.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.retrooper.packetevents.mc261.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "ConnectionMixin", + "PlayerListMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric-official/src/main/resources/fabric.mod.json b/fabric-official/src/main/resources/fabric.mod.json new file mode 100644 index 0000000000..2cf186e977 --- /dev/null +++ b/fabric-official/src/main/resources/fabric.mod.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "id": "packetevents-fabric-official", + "version": "${version}", + "name": "PacketEvents (Fabric, official mappings)", + "description": "PacketEvents variant for Minecraft 26.X. Hosts the chain entrypoint that wires fabric-common's bridge classes; per-version subprojects (mc261, future mc26X) contribute the concrete FabricPlayerManager + injection mixin + access widener.", + "authors": ["retrooper", "GrimAnticheat"], + "contact": { + "homepage": "https://github.com/GrimAnticheat/packetevents" + }, + "license": "GPL-3.0", + "environment": "*", + "entrypoints": { + "preLaunch": [ + "io.github.retrooper.packetevents.PacketEventsMod" + ], + "main": [ + "io.github.retrooper.packetevents.PacketEventsMod" + ] + }, + "depends": { + "minecraft": ">=26.1.2 <26.2", + "java": ">=25", + "fabricloader": ">=0.19" + } +} diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 7979506608..f143577057 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -1,11 +1,13 @@ import me.modmuss50.mpp.ModPublishExtension -import me.modmuss50.mpp.PublishModTask import net.fabricmc.loom.task.RemapJarTask -import net.fabricmc.loom.task.RemapSourcesJarTask -import net.fabricmc.loom.task.prod.ServerProductionRunTask + +// Aggregator: JiJ-nests fabric-intermediary + fabric-official + fabric-common into the +// published packetevents-fabric jar. Fabric Loader gates each nested variant by its +// declared minecraft range at runtime. plugins { packetevents.`library-conventions` + packetevents.`publish-conventions` net.fabricmc.`fabric-loom-remap` } @@ -20,147 +22,58 @@ val yarn_mappings: String by project val loader_version: String by project dependencies { + // Floor at oldest supported MC so Loom remap accepts 1.16.1. + minecraft("com.mojang:minecraft:$minecraft_version") + mappings("net.fabricmc:yarn:$yarn_mappings") + modImplementation("net.fabricmc:fabric-loader:$loader_version") + + // api(): re-export so consumers' POMs see them transitively. + // include(): JiJ at runtime. Both are needed. + api(project(":fabric-common")) 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(project(":fabric-common")) include(libs.bundles.adventure) include(project(":api", "shadow")) include(project(":netty-common")) + // Hoisted from variant modules to avoid duplicating the 28KB JiJ. 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") - mappings("net.fabricmc:yarn:$yarn_mappings") - - compileOnly(libs.via.version) - compileOnly("org.slf4j:slf4j-simple:2.0.16") } loom { mods { - register("packetevents-${project.name}") { + register("packetevents") { sourceSet(sourceSets.main.get()) } } } -allprojects { - apply(plugin = "fabric-loom") - apply(plugin = "packetevents.publish-conventions") - - repositories { - maven("https://repo.codemc.io/repository/maven-snapshots/") +tasks { + withType { + options.release = 17 } - dependencies { - modImplementation("net.fabricmc:fabric-loader:$loader_version") + remapJar { + destinationDirectory = rootProject.layout.buildDirectory.dir("libs") + archiveBaseName = "${rootProject.name}-fabric" + archiveVersion = rootProject.ext["artifactVersion"] as String + + // Nest via file path (not project deps) to skip variant project configuration, + // which would otherwise inject dev/namedElements jars into `include`. + // intermediary → remapJar (LoomRemap); official → jar (LoomNoRemap). + dependsOn(":fabric-intermediary:remapJar", ":fabric-official:jar") + nestedJars.from( + rootProject.layout.buildDirectory.file("libs/${rootProject.name}-fabric-intermediary-${rootProject.ext["artifactVersion"]}.jar") + ) + nestedJars.from( + rootProject.layout.buildDirectory.file("libs/${rootProject.name}-fabric-official-${rootProject.ext["artifactVersion"]}.jar") + ) } - - tasks { - withType { - val targetJavaVersion = 17 - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible) { - options.release = targetJavaVersion - } - } - - remapJar { - destinationDirectory = rootProject.layout.buildDirectory.dir("libs") - archiveBaseName = "${rootProject.name}-fabric${if (project.name != "fabric") "-${project.name}" else ""}" - archiveVersion = rootProject.ext["artifactVersion"] as String - } - - remapSourcesJar { - archiveBaseName = "${rootProject.name}-fabric${if (project.name != "fabric") "-${project.name}" else ""}" - archiveVersion = rootProject.ext["artifactVersion"] 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 intermediary names - // This preserves some compile-time safety, reduces jar size but be careful to not inject into wrong methods - useLegacyMixinAp.set(false) - } - - 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 { - name = "ParchmentMC" - url = uri("https://maven.parchmentmc.org") - } - } - - dependencies { - compileOnly(project(":api", "shadow")) - compileOnly(project(":netty-common")) - compileOnly(project(":fabric", configuration = "namedElements")) - } - - // 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( - mapOf( - "version" to project.version, - "modName" to "packetevents-${project.name}", - "minecraft_version" to minecraft_version // Or pull from a variable - ) - ) - } - } - } - - tasks.register("prodServer") { - javaLauncher = javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(21) - } - } -} - -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) - } - } -} - -tasks.withType { - dependsOn(tasks.named("remapJar")) - dependsOn(tasks.named("remapSourcesJar")) } +// publishMods demands `file` set even when publishing.skip_files=true. configure { file = tasks.named("remapJar").flatMap { it.archiveFile } - additionalFiles.from(tasks.named("remapSourcesJar").flatMap { it.archiveFile }) } diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 2a2d2fcea0..2dd2c35751 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -1,15 +1,15 @@ -# 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.14 -yarn_mappings=1.14+build.21 +# Aggregator builds against the lowest-supported MC version (1.16.1) so Loom is happy. +# Per-variant MC versions live in fabric-intermediary/gradle.properties and +# fabric-official/gradle.properties. +minecraft_version=1.16.1 +yarn_mappings=1.16.1+build.21 loader_version=0.16.14 publishing.skip_files=true publishing.platform=fabric publishing.modrinth.loaders=fabric -publishing.modrinth.version.start=1.14 +publishing.modrinth.version.start=1.16.1 publishing.modrinth.version.end=latest diff --git a/fabric/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionMixin.java b/fabric/src/main/java/io/github/retrooper/packetevents/mixin/ConnectionMixin.java deleted file mode 100644 index e69de29bb2..0000000000 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 deleted file mode 100644 index e69de29bb2..0000000000 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 deleted file mode 100644 index 5996a9fc92..0000000000 --- a/fabric/src/main/java/io/github/retrooper/packetevents/util/FabricCustomPipelineUtil.java +++ /dev/null @@ -1,98 +0,0 @@ -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.ChannelHandler; -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.PacketDeflater; -import net.minecraft.network.PacketInflater; - -public class FabricCustomPipelineUtil { - private static final 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 = PacketInflater.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) { - throw new RuntimeException(e); - } - } - - 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) { - e.printStackTrace(); - } - return output; - } -} - - diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 5582fe056f..23b2e0dd99 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -3,27 +3,16 @@ "id": "packetevents", "version": "${version}", "name": "PacketEvents", - "description": "", - "authors": [ - "retrooper" - ], - "contact": {}, + "description": "PacketEvents — Fabric meta-mod aggregator (loads intermediary or official variant by MC range).", + "authors": ["retrooper", "GrimAnticheat"], + "contact": { + "homepage": "https://github.com/GrimAnticheat/packetevents" + }, "license": "GPL-3.0", - "icon": "assets/packetevents/icon.png", "environment": "*", - "entrypoints": { - "preLaunch": [ - "io.github.retrooper.packetevents.PacketEventsMod" - ], - "main": [ - "io.github.retrooper.packetevents.PacketEventsMod" - ] - }, - "mixins": [ - "packetevents.mixins.json" - ], - "accessWidener": "packetevents.accesswidener", "depends": { - "fabricloader": "*" + "minecraft": [">=1.16.1 <26", ">=26.1.2 <26.2"], + "java": ">=17", + "fabricloader": ">=0.16" } } diff --git a/settings.gradle.kts b/settings.gradle.kts index da87313fae..0d67ea8da2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,13 +34,19 @@ include("bungeecord") include("velocity") include("sponge") include("fabric") -include(":fabric:mc1140") -include(":fabric:mc1194") -include(":fabric:mc1202") -include(":fabric:mc1211") -include(":fabric:mc1216") +include("fabric-common") +include("fabric-intermediary") +include(":fabric-intermediary:mc1140") +include(":fabric-intermediary:mc1194") +include(":fabric-intermediary:mc1202") +include(":fabric-intermediary:mc1211") +include(":fabric-intermediary:mc1216") +include("fabric-official") +include(":fabric-official:mc261") // Patch modules include(":patch:adventure-text-serializer-gson") include(":patch:adventure-text-serializer-legacy") +// Workspace composite override (grim.sh writes this file on clone/pull to rename +// rootProject when the workspace pulls multiple sibling repos with the same name). if (file("workspace.gradle.kts").exists()) apply(from = "workspace.gradle.kts")