diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts index af75e84e9..0919122ee 100644 --- a/bukkit/compatibility/build.gradle.kts +++ b/bukkit/compatibility/build.gradle.kts @@ -30,6 +30,8 @@ dependencies { compileOnly("net.momirealms:craft-engine-nms-helper:${rootProject.properties["nms_helper_version"]}") // Platform compileOnly("io.papermc.paper:paper-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT") + // Netty + compileOnly("io.netty:netty-all:${rootProject.properties["netty_version"]}") // NeigeItems compileOnly("pers.neige.neigeitems:NeigeItems:1.21.42") // Placeholder @@ -49,7 +51,8 @@ dependencies { // LuckPerms compileOnly("net.luckperms:api:5.4") // viaversion - compileOnly("com.viaversion:viaversion-api:5.3.2") + compileOnly("com.viaversion:viaversion-api:5.5.1") + compileOnly("com.viaversion:viaversion-bukkit:5.5.1") // Skript compileOnly("com.github.SkriptLang:Skript:2.11.0") // AuraSkills diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index dfc49c624..78fc7c7cf 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -41,6 +41,7 @@ import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition; import net.momirealms.craftengine.core.plugin.context.event.EventConditions; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.plugin.text.minimessage.FormattedLine; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; @@ -364,8 +365,8 @@ public class BukkitCompatibilityManager implements CompatibilityManager { } @Override - public int getPlayerProtocolVersion(UUID uuid) { - return ViaVersionUtils.getPlayerProtocolVersion(uuid); + public int getViaVersionProtocolVersion(NetWorkUser user) { + return ViaVersionUtils.getPlayerProtocolVersion(user); } @Override diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/viaversion/ViaVersionUtils.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/viaversion/ViaVersionUtils.java index d34da59dc..9bb3b205f 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/viaversion/ViaVersionUtils.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/viaversion/ViaVersionUtils.java @@ -1,14 +1,57 @@ package net.momirealms.craftengine.bukkit.compatibility.viaversion; import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.connection.ProtocolInfo; +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.bukkit.handlers.BukkitEncodeHandler; +import io.netty.channel.ChannelHandler; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Field; +import java.util.Objects; import java.util.UUID; public final class ViaVersionUtils { + private static Field CONNECTION_FIELD; + private static final boolean hasBukkitEncodeHandlerClazz = ReflectionUtils.classExists("com.viaversion.viaversion.bukkit.handlers.BukkitEncodeHandler"); private ViaVersionUtils() {} - public static int getPlayerProtocolVersion(UUID uuid) { - return Via.getAPI().getPlayerProtocolVersion(uuid).getVersion(); + public static int getPlayerProtocolVersion(NetWorkUser user) { + if (user.isFakePlayer()) { // 何意味? + return ProtocolVersion.getByName(VersionHelper.MINECRAFT_VERSION.version()).getId(); + } + UUID uuid = user.uuid(); + if (uuid != null) { // 不是过早获取走这里 + return Via.getAPI().getPlayerProtocolVersion(uuid).getVersion(); + } + // 握手阶段获取走这里 + ChannelHandler viaEncoder = user.nettyChannel().pipeline().get("via-encoder"); + UserConnection connection = getUserConnection(viaEncoder); + if (connection != null) { + com.viaversion.viaversion.api.protocol.version.ProtocolVersion protocolInfo = connection.getProtocolInfo().protocolVersion(); + return protocolInfo != null ? protocolInfo.getVersion() : -1; + } else { + return -1; + } + } + + @Nullable + private static UserConnection getUserConnection(ChannelHandler handler) { + if (hasBukkitEncodeHandlerClazz && handler instanceof BukkitEncodeHandler bukkitEncodeHandler) { + return bukkitEncodeHandler.connection(); + } + if (CONNECTION_FIELD == null) { + CONNECTION_FIELD = Objects.requireNonNull(ReflectionUtils.getDeclaredField(handler.getClass(), "connection")); + } + try { + return (UserConnection) CONNECTION_FIELD.get(handler); + } catch (IllegalAccessException e) { + return null; + } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index d9cafa4fa..76ca29fa7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -22,6 +22,7 @@ import net.kyori.adventure.nbt.api.BinaryTagHolder; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.DataComponentValue; import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; @@ -40,9 +41,9 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.feature.TotemAnimationCommand; import net.momirealms.craftengine.bukkit.plugin.injector.ProtectedFieldVisitor; import net.momirealms.craftengine.bukkit.plugin.network.handler.*; +import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIdHelper; import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20; import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20_5; -import net.momirealms.craftengine.bukkit.plugin.network.id.PlayPacketIdHelper; import net.momirealms.craftengine.bukkit.plugin.network.listener.ByteBufferPacketListener; import net.momirealms.craftengine.bukkit.plugin.network.listener.ByteBufferPacketListenerHolder; import net.momirealms.craftengine.bukkit.plugin.network.listener.NMSPacketListener; @@ -87,6 +88,8 @@ import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextPar import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.plugin.network.*; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.*; @@ -136,8 +139,16 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private final BukkitCraftEngine plugin; private final Map, NMSPacketListener> nmsPacketListeners = new IdentityHashMap<>(128); - private final ByteBufferPacketListenerHolder[] s2cGamePacketListeners; - private final ByteBufferPacketListenerHolder[] c2sGamePacketListeners; + private final ByteBufferPacketListenerHolder[] s2cHandshakingPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.CLIENTBOUND, ConnectionState.HANDSHAKING)]; + private final ByteBufferPacketListenerHolder[] c2sHandshakingPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.SERVERBOUND, ConnectionState.HANDSHAKING)]; + private final ByteBufferPacketListenerHolder[] s2cStatusPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.CLIENTBOUND, ConnectionState.STATUS)]; + private final ByteBufferPacketListenerHolder[] c2sStatusPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.SERVERBOUND, ConnectionState.STATUS)]; + private final ByteBufferPacketListenerHolder[] s2cLoginPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.CLIENTBOUND, ConnectionState.LOGIN)]; + private final ByteBufferPacketListenerHolder[] c2sLoginPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.SERVERBOUND, ConnectionState.LOGIN)]; + private final ByteBufferPacketListenerHolder[] s2cPlayPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.CLIENTBOUND, ConnectionState.PLAY)]; + private final ByteBufferPacketListenerHolder[] c2sPlayPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.SERVERBOUND, ConnectionState.PLAY)]; + private final ByteBufferPacketListenerHolder[] s2cConfigurationPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.CLIENTBOUND, ConnectionState.CONFIGURATION)]; + private final ByteBufferPacketListenerHolder[] c2sConfigurationPacketListeners = new ByteBufferPacketListenerHolder[PacketIdHelper.count(PacketFlow.SERVERBOUND, ConnectionState.CONFIGURATION)]; private final TriConsumer packetConsumer; private final TriConsumer, Object> packetsConsumer; @@ -158,6 +169,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private static final String PACKET_DECODER = "craftengine_decoder"; private final boolean hasModelEngine; + private final boolean hasViaVersion; private int[] blockStateRemapper; private int[] modBlockStateRemapper; @@ -165,10 +177,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @SuppressWarnings("unchecked") public BukkitNetworkManager(BukkitCraftEngine plugin) { instance = this; - this.s2cGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.CLIENTBOUND)]; - this.c2sGamePacketListeners = new ByteBufferPacketListenerHolder[PlayPacketIdHelper.count(PacketFlow.SERVERBOUND)]; Plugin modelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine"); this.hasModelEngine = modelEngine != null && modelEngine.getPluginMeta().getVersion().startsWith("R4"); + this.hasViaVersion = Bukkit.getPluginManager().getPlugin("ViaVersion") != null; this.plugin = plugin; // set up packet id this.packetIds = VersionHelper.isOrAbove1_20_5() ? new PacketIds1_20_5() : new PacketIds1_20(); @@ -231,20 +242,28 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes this.nmsPacketListeners.put(packet, listener); } - private void registerS2CGamePacketListener(final ByteBufferPacketListener listener, int id, String name) { + private void registerByteBufferPacketListener(final ByteBufferPacketListener listener, int id, String name, ConnectionState state, PacketFlow direction) { if (id == -1) return; - if (id < 0 || id >= this.s2cGamePacketListeners.length) { + ByteBufferPacketListenerHolder[] listeners = switch (direction) { + case SERVERBOUND -> switch (state) { + case HANDSHAKING -> this.c2sHandshakingPacketListeners; + case STATUS -> this.c2sStatusPacketListeners; + case LOGIN -> this.c2sLoginPacketListeners; + case PLAY -> this.c2sPlayPacketListeners; + case CONFIGURATION -> this.c2sConfigurationPacketListeners; + }; + case CLIENTBOUND -> switch (state) { + case HANDSHAKING -> this.s2cHandshakingPacketListeners; + case STATUS -> this.s2cStatusPacketListeners; + case LOGIN -> this.s2cLoginPacketListeners; + case PLAY -> this.s2cPlayPacketListeners; + case CONFIGURATION -> this.s2cConfigurationPacketListeners; + }; + }; + if (id < 0 || id >= listeners.length) { throw new IllegalArgumentException("Invalid packet id: " + id); } - this.s2cGamePacketListeners[id] = new ByteBufferPacketListenerHolder(name, listener); - } - - private void registerC2SGamePacketListener(final ByteBufferPacketListener listener, int id, String name) { - if (id == -1) return; - if (id < 0 || id >= this.c2sGamePacketListeners.length) { - throw new IllegalArgumentException("Invalid packet id: " + id); - } - this.c2sGamePacketListeners[id] = new ByteBufferPacketListenerHolder(name, listener); + listeners[id] = new ByteBufferPacketListenerHolder(name, listener); } @Override @@ -262,6 +281,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes public void addFakePlayer(Player player) { FakeBukkitServerPlayer fakePlayer = new FakeBukkitServerPlayer(this.plugin); + fakePlayer.setConnectionState(ConnectionState.PLAY); fakePlayer.setPlayer(player); this.onlineUsers.put(player.getUniqueId(), fakePlayer); this.resetUserArray(); @@ -319,24 +339,24 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } this.blockStateRemapper = newMappings; this.modBlockStateRemapper = newMappingsMOD; - registerS2CGamePacketListener(new LevelChunkWithLightListener( + registerByteBufferPacketListener(new LevelChunkWithLightListener( newMappings, newMappingsMOD, newMappings.length, RegistryUtils.currentBiomeRegistrySize(), occlusionPredicate - ), this.packetIds.clientboundLevelChunkWithLightPacket(), "ClientboundLevelChunkWithLightPacket"); - registerS2CGamePacketListener(new SectionBlockUpdateListener(newMappings, newMappingsMOD, occlusionPredicate), this.packetIds.clientboundSectionBlocksUpdatePacket(), "ClientboundSectionBlocksUpdatePacket"); - registerS2CGamePacketListener(new BlockUpdateListener(newMappings, newMappingsMOD, occlusionPredicate), this.packetIds.clientboundBlockUpdatePacket(), "ClientboundBlockUpdatePacket"); - registerS2CGamePacketListener( + ), this.packetIds.clientboundLevelChunkWithLightPacket(), "ClientboundLevelChunkWithLightPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SectionBlockUpdateListener(newMappings, newMappingsMOD, occlusionPredicate), this.packetIds.clientboundSectionBlocksUpdatePacket(), "ClientboundSectionBlocksUpdatePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new BlockUpdateListener(newMappings, newMappingsMOD, occlusionPredicate), this.packetIds.clientboundBlockUpdatePacket(), "ClientboundBlockUpdatePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener( VersionHelper.isOrAbove1_21_4() ? new LevelParticleListener1_21_4(newMappings, newMappingsMOD) : (VersionHelper.isOrAbove1_20_5() ? new LevelParticleListener1_20_5(newMappings, newMappingsMOD) : new LevelParticleListener1_20(newMappings, newMappingsMOD)), - this.packetIds.clientboundLevelParticlesPacket(), "ClientboundLevelParticlesPacket" + this.packetIds.clientboundLevelParticlesPacket(), "ClientboundLevelParticlesPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener(new LevelEventListener(newMappings, newMappingsMOD), this.packetIds.clientboundLevelEventPacket(), "ClientboundLevelEventPacket"); + registerByteBufferPacketListener(new LevelEventListener(newMappings, newMappingsMOD), this.packetIds.clientboundLevelEventPacket(), "ClientboundLevelEventPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); } private void registerPacketListeners() { @@ -359,91 +379,110 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(new EntityEventListener(), NetworkReflections.clazz$ClientboundEntityEventPacket); registerNMSPacketConsumer(new MovePosAndRotateEntityListener(), NetworkReflections.clazz$ClientboundMoveEntityPacket$PosRot); registerNMSPacketConsumer(new MovePosEntityListener(), NetworkReflections.clazz$ClientboundMoveEntityPacket$Pos); - registerNMSPacketConsumer(new FinishConfigurationListener(), NetworkReflections.clazz$ClientboundFinishConfigurationPacket); - registerNMSPacketConsumer(new LoginFinishedListener(), NetworkReflections.clazz$ClientboundLoginFinishedPacket); registerNMSPacketConsumer(new UpdateTagsListener(), NetworkReflections.clazz$ClientboundUpdateTagsPacket); registerNMSPacketConsumer(new ClientInformationListener(), VersionHelper.isOrAbove1_20_2() ? NetworkReflections.clazz$ServerboundClientInformationPacket1 : NetworkReflections.clazz$ServerboundClientInformationPacket0); registerNMSPacketConsumer(new ContainerClickListener1_21_5(), VersionHelper.isOrAbove1_21_5() ? NetworkReflections.clazz$ServerboundContainerClickPacket : null); - registerS2CGamePacketListener(new ForgetLevelChunkListener(), this.packetIds.clientboundForgetLevelChunkPacket(), "ClientboundForgetLevelChunkPacket"); - registerS2CGamePacketListener(new SetScoreListener1_20_3(), VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1, "ClientboundSetScorePacket"); - registerS2CGamePacketListener(new AddRecipeBookListener(), this.packetIds.clientboundRecipeBookAddPacket(), "ClientboundRecipeBookAddPacket"); - registerS2CGamePacketListener(new PlaceGhostRecipeListener(), this.packetIds.clientboundPlaceGhostRecipePacket(), "ClientboundPlaceGhostRecipePacket"); - registerS2CGamePacketListener(VersionHelper.isOrAbove1_21_2() ? new UpdateRecipesListener1_21_2() : new UpdateRecipesListener1_20(), this.packetIds.clientboundUpdateRecipesPacket(), "ClientboundUpdateRecipesPacket"); - registerS2CGamePacketListener(new UpdateAdvancementsListener(), this.packetIds.clientboundUpdateAdvancementsPacket(), "ClientboundUpdateAdvancementsPacket"); - registerS2CGamePacketListener(new RemoveEntityListener(), this.packetIds.clientboundRemoveEntitiesPacket(), "ClientboundRemoveEntitiesPacket"); - registerS2CGamePacketListener(new SoundListener(), this.packetIds.clientboundSoundPacket(), "ClientboundSoundPacket"); - registerS2CGamePacketListener(new ContainerSetContentListener(), this.packetIds.clientboundContainerSetContentPacket(), "ClientboundContainerSetContentPacket"); - registerS2CGamePacketListener(new ContainerSetSlotListener(), this.packetIds.clientboundContainerSetSlotPacket(), "ClientboundContainerSetSlotPacket"); - registerS2CGamePacketListener(new SetCursorItemListener(), this.packetIds.clientboundSetCursorItemPacket(), "ClientboundSetCursorItemPacket"); - registerS2CGamePacketListener(new SetEquipmentListener(), this.packetIds.clientboundSetEquipmentPacket(), "ClientboundSetEquipmentPacket"); - registerS2CGamePacketListener(new SetPlayerInventoryListener1_21_2(), VersionHelper.isOrAbove1_21_2() ? this.packetIds.clientboundSetPlayerInventoryPacket() : -1, "ClientboundSetPlayerInventoryPacket"); - registerS2CGamePacketListener(new SetEntityDataListener(), this.packetIds.clientboundSetEntityDataPacket(), "ClientboundSetEntityDataPacket"); - registerC2SGamePacketListener(new SetCreativeModeSlotListener(), this.packetIds.serverboundSetCreativeModeSlotPacket(), "ServerboundSetCreativeModeSlotPacket"); - registerC2SGamePacketListener(new ContainerClick1_20(), VersionHelper.isOrAbove1_21_5() ? -1 : this.packetIds.serverboundContainerClickPacket(), "ServerboundContainerClickPacket"); - registerC2SGamePacketListener(new InteractEntityListener(), this.packetIds.serverboundInteractPacket(), "ServerboundInteractPacket"); - registerC2SGamePacketListener(new CustomPayloadListener1_20(), VersionHelper.isOrAbove1_20_2() ? -1 : this.packetIds.serverboundCustomPayloadPacket(), "ServerboundCustomPayloadPacket"); - registerS2CGamePacketListener(VersionHelper.isOrAbove1_20_5() ? new MerchantOffersListener1_20_5() : new MerchantOffersListener1_20(), this.packetIds.clientBoundMerchantOffersPacket(), "ClientboundMerchantOffersPacket"); - registerS2CGamePacketListener(new AddEntityListener(RegistryUtils.currentEntityTypeRegistrySize()), this.packetIds.clientboundAddEntityPacket(), "ClientboundAddEntityPacket"); - registerS2CGamePacketListener(new BlockEntityDataListener(), this.packetIds.clientboundBlockEntityDataPacket(), "ClientboundBlockEntityDataPacket"); - registerS2CGamePacketListener( + registerNMSPacketConsumer(new StatusResponseListener(), NetworkReflections.clazz$ClientboundStatusResponsePacket); + registerNMSPacketConsumer(new ServerDataListener(), NetworkReflections.clazz$ClientboundServerDataPacket); + registerNMSPacketConsumer(new ChatSessionUpdateListener(), NetworkReflections.clazz$ServerboundChatSessionUpdatePacket); + registerNMSPacketConsumer(new LoginAcknowledgedListener(), NetworkReflections.clazz$ServerboundLoginAcknowledgedPacket); + registerNMSPacketConsumer(new ConfigurationAcknowledgedListener(), NetworkReflections.clazz$ServerboundConfigurationAcknowledgedPacket); + registerNMSPacketConsumer(new C2SFinishConfigurationListener(), NetworkReflections.clazz$ServerboundFinishConfigurationPacket); + registerNMSPacketConsumer(new S2CFinishConfigurationListener(), NetworkReflections.clazz$ClientboundFinishConfigurationPacket); + registerNMSPacketConsumer(new LoginFinishedListener(), NetworkReflections.clazz$ClientboundLoginFinishedPacket); + registerNMSPacketConsumer(new StartConfigurationListener(), NetworkReflections.clazz$ClientboundStartConfigurationPacket); + registerByteBufferPacketListener(new IntentionListener(), this.packetIds.clientIntentionPacket(), "ClientIntentionPacket", ConnectionState.HANDSHAKING, PacketFlow.SERVERBOUND); + registerByteBufferPacketListener(new ForgetLevelChunkListener(), this.packetIds.clientboundForgetLevelChunkPacket(), "ClientboundForgetLevelChunkPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SetScoreListener1_20_3(), VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1, "ClientboundSetScorePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new AddRecipeBookListener(), this.packetIds.clientboundRecipeBookAddPacket(), "ClientboundRecipeBookAddPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new PlaceGhostRecipeListener(), this.packetIds.clientboundPlaceGhostRecipePacket(), "ClientboundPlaceGhostRecipePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(VersionHelper.isOrAbove1_21_2() ? new UpdateRecipesListener1_21_2() : new UpdateRecipesListener1_20(), this.packetIds.clientboundUpdateRecipesPacket(), "ClientboundUpdateRecipesPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new UpdateAdvancementsListener(), this.packetIds.clientboundUpdateAdvancementsPacket(), "ClientboundUpdateAdvancementsPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new RemoveEntityListener(), this.packetIds.clientboundRemoveEntitiesPacket(), "ClientboundRemoveEntitiesPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SoundListener(), this.packetIds.clientboundSoundPacket(), "ClientboundSoundPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new ContainerSetContentListener(), this.packetIds.clientboundContainerSetContentPacket(), "ClientboundContainerSetContentPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new ContainerSetSlotListener(), this.packetIds.clientboundContainerSetSlotPacket(), "ClientboundContainerSetSlotPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SetCursorItemListener(), this.packetIds.clientboundSetCursorItemPacket(), "ClientboundSetCursorItemPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SetEquipmentListener(), this.packetIds.clientboundSetEquipmentPacket(), "ClientboundSetEquipmentPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SetPlayerInventoryListener1_21_2(), VersionHelper.isOrAbove1_21_2() ? this.packetIds.clientboundSetPlayerInventoryPacket() : -1, "ClientboundSetPlayerInventoryPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SetEntityDataListener(), this.packetIds.clientboundSetEntityDataPacket(), "ClientboundSetEntityDataPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new SetCreativeModeSlotListener(), this.packetIds.serverboundSetCreativeModeSlotPacket(), "ServerboundSetCreativeModeSlotPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); + registerByteBufferPacketListener(new ContainerClick1_20(), VersionHelper.isOrAbove1_21_5() ? -1 : this.packetIds.serverboundContainerClickPacket(), "ServerboundContainerClickPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); + registerByteBufferPacketListener(new InteractEntityListener(), this.packetIds.serverboundInteractPacket(), "ServerboundInteractPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); + registerByteBufferPacketListener(new CustomPayloadListener1_20(), VersionHelper.isOrAbove1_20_2() ? -1 : this.packetIds.serverboundCustomPayloadPacket(), "ServerboundCustomPayloadPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); + registerByteBufferPacketListener(VersionHelper.isOrAbove1_20_5() ? new MerchantOffersListener1_20_5() : new MerchantOffersListener1_20(), this.packetIds.clientBoundMerchantOffersPacket(), "ClientboundMerchantOffersPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new AddEntityListener(RegistryUtils.currentEntityTypeRegistrySize()), this.packetIds.clientboundAddEntityPacket(), "ClientboundAddEntityPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener(new BlockEntityDataListener(), this.packetIds.clientboundBlockEntityDataPacket(), "ClientboundBlockEntityDataPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new OpenScreenListener1_20_3() : new OpenScreenListener1_20(), - this.packetIds.clientboundOpenScreenPacket(), "ClientboundOpenScreenPacket" + this.packetIds.clientboundOpenScreenPacket(), "ClientboundOpenScreenPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new SystemChatListener1_20_3() : new SystemChatListener1_20(), - this.packetIds.clientboundSystemChatPacket(), "ClientboundSystemChatPacket" + this.packetIds.clientboundSystemChatPacket(), "ClientboundSystemChatPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new SetActionBarListener1_20_3() : new SetActionBarListener1_20(), - this.packetIds.clientboundSetActionBarTextPacket(), "ClientboundSetActionBarTextPacket" + this.packetIds.clientboundSetActionBarTextPacket(), "ClientboundSetActionBarTextPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new TabListListener1_20_3() : new TabListListener1_20(), - this.packetIds.clientboundTabListPacket(), "ClientboundTabListPacket" + this.packetIds.clientboundTabListPacket(), "ClientboundTabListPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new SetTitleListener1_20_3() : new SetTitleListener1_20(), - this.packetIds.clientboundSetTitleTextPacket(), "ClientboundSetTitleTextPacket" + this.packetIds.clientboundSetTitleTextPacket(), "ClientboundSetTitleTextPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new SetSubtitleListener1_20_3() : new SetSubtitleListener1_20(), - this.packetIds.clientboundSetSubtitleTextPacket(), "ClientboundSetSubtitleTextPacket" + this.packetIds.clientboundSetSubtitleTextPacket(), "ClientboundSetSubtitleTextPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new BossEventListener1_20_3() : new BossEventListener1_20(), - this.packetIds.clientboundBossEventPacket(), "ClientboundBossEventPacket" + this.packetIds.clientboundBossEventPacket(), "ClientboundBossEventPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new TeamListener1_20_3() : new TeamListener1_20(), - this.packetIds.clientboundSetPlayerTeamPacket(), "ClientboundSetPlayerTeamPacket" + this.packetIds.clientboundSetPlayerTeamPacket(), "ClientboundSetPlayerTeamPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new SetObjectiveListener1_20_3() : new SetObjectiveListener1_20(), - this.packetIds.clientboundSetObjectivePacket(), "ClientboundSetObjectivePacket" + this.packetIds.clientboundSetObjectivePacket(), "ClientboundSetObjectivePacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); - registerS2CGamePacketListener( + registerByteBufferPacketListener( VersionHelper.isOrAbove1_20_3() ? new PlayerChatListener_1_20_3() : new PlayerChatListener_1_20(), - this.packetIds.clientboundPlayerChatPacket(), "ClientboundPlayerChatPacket"); + this.packetIds.clientboundPlayerChatPacket(), "ClientboundPlayerChatPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND + ); } @EventHandler(priority = EventPriority.LOWEST) @@ -695,6 +734,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } BukkitServerPlayer user = new BukkitServerPlayer(plugin, channel); + user.setConnectionState(state); if (channel.pipeline().get("splitter") == null) { channel.close(); return; @@ -828,26 +868,24 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } private void onByteBufSend(ByteBuf buffer) { - // I don't care packets before PLAY for the moment - if (player.encoderState() != ConnectionState.PLAY) return; - int size = buffer.readableBytes(); - if (size != 0) { - FriendlyByteBuf buf = new FriendlyByteBuf(buffer); - int preProcessIndex = buf.readerIndex(); - int packetId = buf.readVarInt(); - int preIndex = buf.readerIndex(); - try { - ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex); - BukkitNetworkManager.this.handleS2CByteBufPacket(this.player, event); - if (event.isCancelled()) { - buf.clear(); - } else if (!event.changed()) { - buf.readerIndex(preProcessIndex); - } - } catch (Throwable e) { - CraftEngine.instance().logger().warn("An error occurred when writing packet " + packetId, e); + if (buffer.readableBytes() == 0) { + return; + } + FriendlyByteBuf buf = new FriendlyByteBuf(buffer); + int preProcessIndex = buf.readerIndex(); + int packetId = buf.readVarInt(); + int preIndex = buf.readerIndex(); + try { + ByteBufPacketEvent event = ByteBufPacketEvent.create(packetId, buf, preIndex, this.player.encoderState(), PacketFlow.CLIENTBOUND); + BukkitNetworkManager.this.handleS2CByteBufPacket(this.player, event); + if (event.isCancelled()) { + buf.clear(); + } else if (!event.changed()) { buf.readerIndex(preProcessIndex); } + } catch (Throwable e) { + CraftEngine.instance().logger().warn("An error occurred when writing packet " + packetId, e); + buf.readerIndex(preProcessIndex); } } } @@ -874,26 +912,24 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } private void onByteBufReceive(ByteBuf buffer) { - // I don't care packets before PLAY for the moment - if (player.decoderState() != ConnectionState.PLAY) return; - int size = buffer.readableBytes(); - if (size != 0) { - FriendlyByteBuf buf = new FriendlyByteBuf(buffer); - int preProcessIndex = buf.readerIndex(); - int packetId = buf.readVarInt(); - int preIndex = buf.readerIndex(); - try { - ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex); - BukkitNetworkManager.this.handleC2SByteBufPacket(this.player, event); - if (event.isCancelled()) { - buf.clear(); - } else if (!event.changed()) { - buf.readerIndex(preProcessIndex); - } - } catch (Throwable e) { - CraftEngine.instance().logger().warn("An error occurred when reading packet " + packetId, e); + if (buffer.readableBytes() == 0) { + return; + } + FriendlyByteBuf buf = new FriendlyByteBuf(buffer); + int preProcessIndex = buf.readerIndex(); + int packetId = buf.readVarInt(); + int preIndex = buf.readerIndex(); + try { + ByteBufPacketEvent event = ByteBufPacketEvent.create(packetId, buf, preIndex, this.player.decoderState(), PacketFlow.SERVERBOUND); + BukkitNetworkManager.this.handleC2SByteBufPacket(this.player, event); + if (event.isCancelled()) { + buf.clear(); + } else if (!event.changed()) { buf.readerIndex(preProcessIndex); } + } catch (Throwable e) { + CraftEngine.instance().logger().warn("An error occurred when reading packet " + packetId, e); + buf.readerIndex(preProcessIndex); } } } @@ -939,7 +975,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes protected void handleS2CByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { int packetID = event.packetID(); - ByteBufferPacketListenerHolder holder = this.s2cGamePacketListeners[packetID]; + ByteBufferPacketListenerHolder holder; + if (event.state() == ConnectionState.PLAY) { + holder = this.s2cPlayPacketListeners[packetID]; + } else { + holder = switch (event.state()) { + case HANDSHAKING -> this.s2cHandshakingPacketListeners[packetID]; + case STATUS -> this.s2cStatusPacketListeners[packetID]; + case LOGIN -> this.s2cLoginPacketListeners[packetID]; + case CONFIGURATION -> this.s2cConfigurationPacketListeners[packetID]; + default -> null; + }; + } if (holder != null) { try { holder.listener().onPacketSend(user, event); @@ -951,7 +998,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes protected void handleC2SByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { int packetID = event.packetID(); - ByteBufferPacketListenerHolder holder = this.c2sGamePacketListeners[packetID]; + ByteBufferPacketListenerHolder holder; + if (event.state() == ConnectionState.PLAY) { + holder = this.c2sPlayPacketListeners[packetID]; + } else { + holder = switch (event.state()) { + case HANDSHAKING -> this.c2sHandshakingPacketListeners[packetID]; + case STATUS -> this.c2sStatusPacketListeners[packetID]; + case LOGIN -> this.c2sLoginPacketListeners[packetID]; + case CONFIGURATION -> this.c2sConfigurationPacketListeners[packetID]; + default -> null; + }; + } if (holder != null) { try { holder.listener().onPacketReceive(user, event); @@ -1319,7 +1377,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { - if (VersionHelper.isOrAbove1_21_4()) return; + if (user.protocolVersion().isVersionNewerThan(ProtocolVersion.V1_21_4)) return; if (!user.isOnline()) return; BukkitServerPlayer player = (BukkitServerPlayer) user; if (VersionHelper.isFolia()) { @@ -1421,7 +1479,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { BukkitServerPlayer player = (BukkitServerPlayer) user; - player.setConnectionState(ConnectionState.PLAY); Object dimensionKey; try { if (!VersionHelper.isOrAbove1_20_2()) { @@ -1441,6 +1498,43 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } else { CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginPacket: World " + location + " does not exist"); } + if (VersionHelper.isOrAbove1_20_5()) { + try { + NetworkReflections.methodHandle$ClientboundLoginPacket$enforcesSecureChatSetter.invoke(packet, true); + } catch (Throwable t) { + CraftEngine.instance().logger().warn("Failed to set enforcesSecureChat to false"); + } + } + } + } + + public static class StatusResponseListener implements NMSPacketListener { + + @Override + public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { + } + } + + public static class ServerDataListener implements NMSPacketListener { + + @Override + public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { + if (VersionHelper.isOrAbove1_20_5()) { + return; + } + try { + NetworkReflections.methodHandle$ClientboundServerDataPacket$enforcesSecureChatSetter.invokeExact(packet, true); + } catch (Throwable t) { + CraftEngine.instance().logger().warn("Failed to set enforcesSecureChat to false"); + } + } + } + + public static class ChatSessionUpdateListener implements NMSPacketListener { + + @Override + public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + event.setCancelled(true); } } @@ -1764,7 +1858,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } - public static class FinishConfigurationListener implements NMSPacketListener { + public static class S2CFinishConfigurationListener implements NMSPacketListener { private void returnToWorld(NetWorkUser user, Queue configurationTasks, Object packetListener) { configurationTasks.add(CoreReflections.instance$JoinWorldTask); @@ -1781,12 +1875,17 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes if (!VersionHelper.isOrAbove1_20_2() || !Config.sendPackOnJoin()) { // 防止后期调试进配置阶段造成问题 user.setShouldProcessFinishConfiguration(false); + user.setEncoderState(ConnectionState.PLAY); return; } - if (!user.shouldProcessFinishConfiguration()) return; + if (!user.shouldProcessFinishConfiguration()) { + user.setEncoderState(ConnectionState.PLAY); + return; + } Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection()); if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) { + user.setEncoderState(ConnectionState.PLAY); return; } @@ -1825,30 +1924,34 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes // 请求资源包 ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost(); host.requestResourcePackDownloadLink(user.uuid()).whenComplete((dataList, t) -> { - Queue configurationTasks; try { - configurationTasks = (Queue) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener); - } catch (Throwable e) { - CraftEngine.instance().logger().warn("Failed to get configuration tasks for player " + user.name(), e); - FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); - return; - } - if (t != null) { - CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t); + Queue configurationTasks; + try { + configurationTasks = (Queue) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener); + } catch (Throwable e) { + CraftEngine.instance().logger().warn("Failed to get configuration tasks for player " + user.name(), e); + FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); + return; + } + if (t != null) { + CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t); + returnToWorld(user, configurationTasks, packetListener); + return; + } + if (dataList.isEmpty()) { + returnToWorld(user, configurationTasks, packetListener); + return; + } + // 向配置阶段连接的任务重加入资源包的任务 + for (ResourcePackDownloadData data : dataList) { + configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1()))); + user.addResourcePackUUID(data.uuid()); + } + // 最后再加入一个 JoinWorldTask 并开始资源包任务 returnToWorld(user, configurationTasks, packetListener); - return; + } finally { + user.setEncoderState(ConnectionState.PLAY); } - if (dataList.isEmpty()) { - returnToWorld(user, configurationTasks, packetListener); - return; - } - // 向配置阶段连接的任务重加入资源包的任务 - for (ResourcePackDownloadData data : dataList) { - configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1()))); - user.addResourcePackUUID(data.uuid()); - } - // 最后再加入一个 JoinWorldTask 并开始资源包任务 - returnToWorld(user, configurationTasks, packetListener); }); } } @@ -1857,6 +1960,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { + user.setEncoderState(VersionHelper.isOrAbove1_20_2() ? ConnectionState.CONFIGURATION : ConnectionState.PLAY); GameProfile gameProfile = FastNMS.INSTANCE.field$ClientboundLoginFinishedPacket$gameProfile(packet); if (VersionHelper.isOrAbove1_21_9()) { user.setVerifiedName(gameProfile.name()); @@ -1907,6 +2011,66 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } + public static class LoginAcknowledgedListener implements NMSPacketListener { + + @Override + public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + user.setDecoderState(ConnectionState.CONFIGURATION); + } + } + + public static class ConfigurationAcknowledgedListener implements NMSPacketListener { + + @Override + public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + user.setDecoderState(ConnectionState.CONFIGURATION); + } + } + + public static class C2SFinishConfigurationListener implements NMSPacketListener { + + @Override + public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + user.setDecoderState(ConnectionState.PLAY); + } + } + + public static class StartConfigurationListener implements NMSPacketListener { + + @Override + public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { + user.setEncoderState(ConnectionState.CONFIGURATION); + } + } + + public static class IntentionListener implements ByteBufferPacketListener { + + @Override + public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { + FriendlyByteBuf buf = event.getBuffer(); + int protocolVersion = buf.readVarInt(); + buf.readUtf(); // serverAddress + buf.readUnsignedShort(); // serverPort + ConnectionState nextState = switch (buf.readVarInt()) { + case 1 -> ConnectionState.STATUS; + case 2, 3 -> ConnectionState.LOGIN; + default -> null; + }; + if (nextState == null) { + user.kick(Component.text("Illegal packet", NamedTextColor.RED)); + return; + } + if (BukkitNetworkManager.instance.hasViaVersion) { + int viaVersionProtocolVersion = CraftEngine.instance().compatibilityManager().getViaVersionProtocolVersion(user); + if (viaVersionProtocolVersion != -1) { + protocolVersion = viaVersionProtocolVersion; + } + } + user.setProtocolVersion(ProtocolVersion.getById(protocolVersion)); + user.setConnectionState(nextState); + } + } + public static class ForgetLevelChunkListener implements ByteBufferPacketListener { @Override @@ -1977,7 +2141,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes // 读取区块数据 int heightmapsCount = 0; Map heightmapsMap = null; - net.momirealms.sparrow.nbt.Tag heightmaps = null; + Tag heightmaps = null; if (VersionHelper.isOrAbove1_21_5()) { heightmapsMap = new HashMap<>(); heightmapsCount = buf.readVarInt(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index 67936ef29..5f663cb4c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -77,4 +77,6 @@ public interface PacketIds { int serverboundCustomPayloadPacket(); int clientboundPlayerChatPacket(); + + int clientIntentionPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java index 672394811..6d08819b9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ArmorStandPacketHandler.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.util.AdventureHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java index fa86d8d8f..28df80ea4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/BlockDisplayPacketHandler.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.util.AdventureHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java index 4e264198e..f6ffc975e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/CommonItemPacketHandler.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.bukkit.util.EntityDataUtils; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import org.bukkit.inventory.ItemStack; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/EndermanPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/EndermanPacketHandler.java index 760820024..eed379c5f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/EndermanPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/EndermanPacketHandler.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.util.AdventureHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java index 63332219f..f690ff15d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurnitureCollisionPacketHandler.java @@ -1,7 +1,7 @@ package net.momirealms.craftengine.bukkit.plugin.network.handler; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; -import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; public class FurnitureCollisionPacketHandler implements EntityPacketHandler { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java index a73ebc3e2..794414898 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/FurniturePacketHandler.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.plugin.network.handler; import it.unimi.dsi.fastutil.ints.IntList; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; -import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; public class FurniturePacketHandler implements EntityPacketHandler { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java index 52bf764e4..0bc787038 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemDisplayPacketHandler.java @@ -5,7 +5,7 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import org.bukkit.inventory.ItemStack; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java index b413c087b..ee05e0ae2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java @@ -8,7 +8,7 @@ import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import org.bukkit.inventory.ItemStack; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemPacketHandler.java index 78e62a2d1..f3df21cd0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemPacketHandler.java @@ -16,7 +16,7 @@ import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.text.minimessage.CustomTagResolver; import net.momirealms.craftengine.core.util.AdventureHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java index ff4c81023..758172d4e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/PrimedTNTPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/PrimedTNTPacketHandler.java index 6fab87f02..fdb6d772a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/PrimedTNTPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/PrimedTNTPacketHandler.java @@ -11,7 +11,7 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.util.AdventureHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java index 81ad7c893..669aaa9f0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java @@ -11,9 +11,9 @@ import net.momirealms.craftengine.core.entity.projectile.ProjectileMeta; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; -import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.MiscUtils; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java index 8b7fc31b9..c639d95a1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/TextDisplayPacketHandler.java @@ -9,7 +9,7 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; import net.momirealms.craftengine.core.util.AdventureHelper; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java new file mode 100644 index 000000000..11b9ab96b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.bukkit.plugin.network.id; + +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.Map; + +public final class PacketIdHelper { + // 1.20.5-latest + private static final Map>> byName = VersionHelper.isOrAbove1_20_5() ? FastNMS.INSTANCE.gamePacketIdsByName() : Map.of(); + // 1.20-1.20.4 + private static final Map, Integer>>> byClazz = VersionHelper.isOrAbove1_20_5() ? Map.of() : FastNMS.INSTANCE.gamePacketIdsByClazz(); + + private PacketIdHelper() {} + + public static int count(PacketFlow direction, ConnectionState state) { + if (VersionHelper.isOrAbove1_20_5()) { + return byName.getOrDefault(state, Map.of()).getOrDefault(direction, Map.of()).size(); + } else { + return byClazz.getOrDefault(state, Map.of()).getOrDefault(direction, Map.of()).size(); + } + } + + public static int byName(String packetName, PacketFlow direction, ConnectionState state) { + return byName.getOrDefault(state, Map.of()).getOrDefault(direction, Map.of()).getOrDefault(packetName, -1); + } + + public static int byClazz(Class clazz, PacketFlow direction, ConnectionState state) { + return byClazz.getOrDefault(state, Map.of()).getOrDefault(direction, Map.of()).getOrDefault(clazz, -1); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index 2245921ae..5bfc2804f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java @@ -2,197 +2,203 @@ package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.PacketFlow; public class PacketIds1_20 implements PacketIds { @Override public int clientboundBlockUpdatePacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockUpdatePacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockUpdatePacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSectionBlocksUpdatePacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSectionBlocksUpdatePacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSectionBlocksUpdatePacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundLevelParticlesPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelParticlesPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelParticlesPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundLevelEventPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelEventPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelEventPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundAddEntityPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundAddEntityPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundAddEntityPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundOpenScreenPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundOpenScreenPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundOpenScreenPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSoundPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSoundPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSoundPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundRemoveEntitiesPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundRemoveEntitiesPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundRemoveEntitiesPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetEntityDataPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetEntityDataPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetEntityDataPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetTitleTextPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetTitleTextPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetTitleTextPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetSubtitleTextPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetSubtitleTextPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetSubtitleTextPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetActionBarTextPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetActionBarTextPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetActionBarTextPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundBossEventPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBossEventPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBossEventPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSystemChatPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSystemChatPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSystemChatPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundTabListPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundTabListPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundTabListPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetPlayerTeamPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetPlayerTeamPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetPlayerTeamPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetObjectivePacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetObjectivePacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetObjectivePacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundLevelChunkWithLightPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelChunkWithLightPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLevelChunkWithLightPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundPlayerInfoUpdatePacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlayerInfoUpdatePacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlayerInfoUpdatePacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetScorePacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetScorePacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetScorePacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundContainerSetContentPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundContainerSetContentPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundContainerSetContentPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundContainerSetSlotPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundContainerSetSlotPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundContainerSetSlotPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetCursorItemPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetCursorItemPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetCursorItemPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetEquipmentPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetEquipmentPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetEquipmentPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetPlayerInventoryPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetPlayerInventoryPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundSetPlayerInventoryPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundRecipeBookAddPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundRecipeBookAddPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundRecipeBookAddPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundPlaceGhostRecipePacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlaceGhostRecipePacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlaceGhostRecipePacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundUpdateRecipesPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundUpdateRecipesPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundUpdateRecipesPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundUpdateAdvancementsPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundUpdateAdvancementsPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundUpdateAdvancementsPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundForgetLevelChunkPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundForgetLevelChunkPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundForgetLevelChunkPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundBlockEventPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockEventPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockEventPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientBoundMerchantOffersPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundMerchantOffersPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundMerchantOffersPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundBlockEntityDataPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockEntityDataPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundBlockEntityDataPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int serverboundContainerClickPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundContainerClickPacket, PacketFlow.SERVERBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundContainerClickPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int serverboundSetCreativeModeSlotPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundSetCreativeModeSlotPacket, PacketFlow.SERVERBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundSetCreativeModeSlotPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int serverboundInteractPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundInteractPacket, PacketFlow.SERVERBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundInteractPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int serverboundCustomPayloadPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundCustomPayloadPacket, PacketFlow.SERVERBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundCustomPayloadPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int clientboundPlayerChatPacket() { - return PlayPacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlayerChatPacket, PacketFlow.CLIENTBOUND); + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlayerChatPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + + @Override + public int clientIntentionPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientIntentionPacket, PacketFlow.SERVERBOUND, ConnectionState.HANDSHAKING); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java index 9ea4b0483..1ee063175 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java @@ -1,197 +1,203 @@ package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.PacketFlow; public class PacketIds1_20_5 implements PacketIds { @Override public int clientboundBlockUpdatePacket() { - return PlayPacketIdHelper.byName("minecraft:block_update", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:block_update", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSectionBlocksUpdatePacket() { - return PlayPacketIdHelper.byName("minecraft:section_blocks_update", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:section_blocks_update", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundLevelParticlesPacket() { - return PlayPacketIdHelper.byName("minecraft:level_particles", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:level_particles", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundLevelEventPacket() { - return PlayPacketIdHelper.byName("minecraft:level_event", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:level_event", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundAddEntityPacket() { - return PlayPacketIdHelper.byName("minecraft:add_entity", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:add_entity", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundOpenScreenPacket() { - return PlayPacketIdHelper.byName("minecraft:open_screen", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:open_screen", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSoundPacket() { - return PlayPacketIdHelper.byName("minecraft:sound", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:sound", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundRemoveEntitiesPacket() { - return PlayPacketIdHelper.byName("minecraft:remove_entities", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:remove_entities", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetEntityDataPacket() { - return PlayPacketIdHelper.byName("minecraft:set_entity_data", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_entity_data", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetTitleTextPacket() { - return PlayPacketIdHelper.byName("minecraft:set_title_text", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_title_text", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetSubtitleTextPacket() { - return PlayPacketIdHelper.byName("minecraft:set_subtitle_text", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_subtitle_text", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetActionBarTextPacket() { - return PlayPacketIdHelper.byName("minecraft:set_action_bar_text", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_action_bar_text", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundBossEventPacket() { - return PlayPacketIdHelper.byName("minecraft:boss_event", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:boss_event", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSystemChatPacket() { - return PlayPacketIdHelper.byName("minecraft:system_chat", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:system_chat", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundTabListPacket() { - return PlayPacketIdHelper.byName("minecraft:tab_list", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:tab_list", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetPlayerTeamPacket() { - return PlayPacketIdHelper.byName("minecraft:set_player_team", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_player_team", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetObjectivePacket() { - return PlayPacketIdHelper.byName("minecraft:set_objective", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_objective", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundLevelChunkWithLightPacket() { - return PlayPacketIdHelper.byName("minecraft:level_chunk_with_light", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:level_chunk_with_light", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundPlayerInfoUpdatePacket() { - return PlayPacketIdHelper.byName("minecraft:player_info_update", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:player_info_update", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetScorePacket() { - return PlayPacketIdHelper.byName("minecraft:set_score", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_score", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundContainerSetContentPacket() { - return PlayPacketIdHelper.byName("minecraft:container_set_content", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:container_set_content", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundContainerSetSlotPacket() { - return PlayPacketIdHelper.byName("minecraft:container_set_slot", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:container_set_slot", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetCursorItemPacket() { - return PlayPacketIdHelper.byName("minecraft:set_cursor_item", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_cursor_item", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetEquipmentPacket() { - return PlayPacketIdHelper.byName("minecraft:set_equipment", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_equipment", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundSetPlayerInventoryPacket() { - return PlayPacketIdHelper.byName("minecraft:set_player_inventory", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:set_player_inventory", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundBlockEventPacket() { - return PlayPacketIdHelper.byName("minecraft:block_event", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:block_event", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundRecipeBookAddPacket() { - return PlayPacketIdHelper.byName("minecraft:recipe_book_add", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:recipe_book_add", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundPlaceGhostRecipePacket() { - return PlayPacketIdHelper.byName("minecraft:place_ghost_recipe", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:place_ghost_recipe", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundUpdateRecipesPacket() { - return PlayPacketIdHelper.byName("minecraft:update_recipes", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:update_recipes", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundUpdateAdvancementsPacket() { - return PlayPacketIdHelper.byName("minecraft:update_advancements", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:update_advancements", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundForgetLevelChunkPacket() { - return PlayPacketIdHelper.byName("minecraft:forget_level_chunk", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:forget_level_chunk", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientBoundMerchantOffersPacket() { - return PlayPacketIdHelper.byName("minecraft:merchant_offers", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:merchant_offers", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int clientboundBlockEntityDataPacket() { - return PlayPacketIdHelper.byName("minecraft:block_entity_data", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:block_entity_data", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); } @Override public int serverboundContainerClickPacket() { - return PlayPacketIdHelper.byName("minecraft:container_click", PacketFlow.SERVERBOUND); + return PacketIdHelper.byName("minecraft:container_click", PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int serverboundSetCreativeModeSlotPacket() { - return PlayPacketIdHelper.byName("minecraft:set_creative_mode_slot", PacketFlow.SERVERBOUND); + return PacketIdHelper.byName("minecraft:set_creative_mode_slot", PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int serverboundInteractPacket() { - return PlayPacketIdHelper.byName("minecraft:interact", PacketFlow.SERVERBOUND); + return PacketIdHelper.byName("minecraft:interact", PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int serverboundCustomPayloadPacket() { - return PlayPacketIdHelper.byName("minecraft:custom_payload", PacketFlow.SERVERBOUND); + return PacketIdHelper.byName("minecraft:custom_payload", PacketFlow.SERVERBOUND, ConnectionState.PLAY); } @Override public int clientboundPlayerChatPacket() { - return PlayPacketIdHelper.byName("minecraft:player_chat", PacketFlow.CLIENTBOUND); + return PacketIdHelper.byName("minecraft:player_chat", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + + @Override + public int clientIntentionPacket() { + return PacketIdHelper.byName("minecraft:intention", PacketFlow.SERVERBOUND, ConnectionState.HANDSHAKING); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PlayPacketIdHelper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PlayPacketIdHelper.java deleted file mode 100644 index 2748aa4a5..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PlayPacketIdHelper.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.momirealms.craftengine.bukkit.plugin.network.id; - -import net.momirealms.craftengine.bukkit.nms.FastNMS; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.network.ConnectionState; -import net.momirealms.craftengine.core.plugin.network.PacketFlow; -import net.momirealms.craftengine.core.util.VersionHelper; - -import java.util.Collections; -import java.util.EnumMap; -import java.util.Map; - -public class PlayPacketIdHelper { - // 1.20.5-latest - private static final Map> byName = new EnumMap<>(PacketFlow.class); - private static final Map byId = new EnumMap<>(PacketFlow.class); - // 1.20-1.20.4 - private static final Map, Integer>> byClazz = new EnumMap<>(PacketFlow.class); - - static { - try { - if (VersionHelper.isOrAbove1_20_5()) { - byName.putAll(FastNMS.INSTANCE.gamePacketIdsByName().get(ConnectionState.PLAY)); - } else { - byClazz.putAll(FastNMS.INSTANCE.gamePacketIdsByClazz().get(ConnectionState.PLAY)); - } - if (!byName.isEmpty()) { - for (Map.Entry> entry : byName.entrySet()) { - String[] ids = new String[entry.getValue().size()]; - for (Map.Entry nameIdEntry : entry.getValue().entrySet()) { - ids[nameIdEntry.getValue()] = nameIdEntry.getKey(); - } - byId.put(entry.getKey(), ids); - } - } - } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to init packet registry", e); - } - } - - public static int count(PacketFlow direction) { - if (VersionHelper.isOrAbove1_20_5()) { - return byName.getOrDefault(direction, Collections.emptyMap()).size(); - } else { - return byClazz.getOrDefault(direction, Collections.emptyMap()).size(); - } - } - - public static String byId(int id, PacketFlow direction) { - return byId.get(direction)[id]; - } - - public static int byName(String packetName, PacketFlow direction) { - return byName.get(direction).getOrDefault(packetName, -1); - } - - public static int byClazz(Class clazz, PacketFlow direction) { - return byClazz.get(direction).getOrDefault(clazz, -1); - } -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/ByteBufferPacketListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/ByteBufferPacketListener.java index ebc7dbe34..b88b1b984 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/ByteBufferPacketListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/ByteBufferPacketListener.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.bukkit.plugin.network.listener; -import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; public interface ByteBufferPacketListener { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/NMSPacketListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/NMSPacketListener.java index b7471726b..880408ccc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/NMSPacketListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/listener/NMSPacketListener.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.bukkit.plugin.network.listener; -import net.momirealms.craftengine.core.plugin.network.NMSPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.NMSPacketEvent; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; public interface NMSPacketListener { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java index 048e99073..6055ad4f3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java @@ -1743,4 +1743,73 @@ public final class NetworkReflections { BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundPlayerChatPacket") ) ); + + // 1.20.5+ + public static final Field field$ClientboundLoginPacket$enforcesSecureChat = MiscUtils.requireNonNullIf( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLoginPacket, boolean.class, 4 + ), + VersionHelper.isOrAbove1_20_5() + ); + + // 1.20.5+ + public static final MethodHandle methodHandle$ClientboundLoginPacket$enforcesSecureChatSetter = Optional.ofNullable(field$ClientboundLoginPacket$enforcesSecureChat) + .map(it -> requireNonNull(ReflectionUtils.unreflectSetter(it)).asType(MethodType.methodType(void.class, Object.class, boolean.class))) + .orElse(null); + + public static final Class clazz$ClientboundStatusResponsePacket = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "network.protocol.status.PacketStatusOutServerInfo", + "network.protocol.status.ClientboundStatusResponsePacket" + ) + ); + + public static final Class clazz$ClientboundServerDataPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundServerDataPacket") + ) + ); + + // 1.20~1.20.4 + public static final Field field$ClientboundServerDataPacket$enforcesSecureChat = MiscUtils.requireNonNullIf( + ReflectionUtils.getDeclaredField( + clazz$ClientboundServerDataPacket, boolean.class, 0 + ), + !VersionHelper.isOrAbove1_20_5() + ); + + // 1.20~1.20.4 + public static final MethodHandle methodHandle$ClientboundServerDataPacket$enforcesSecureChatSetter = Optional.ofNullable(field$ClientboundServerDataPacket$enforcesSecureChat) + .map(it -> requireNonNull(ReflectionUtils.unreflectSetter(it)).asType(MethodType.methodType(void.class, Object.class, boolean.class))) + .orElse(null); + + public static final Class clazz$ServerboundChatSessionUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundChatSessionUpdatePacket") + ) + ); + + // 1.20.2+ + public static final Class clazz$ServerboundConfigurationAcknowledgedPacket = MiscUtils.requireNonNullIf( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundConfigurationAcknowledgedPacket") + ), + VersionHelper.isOrAbove1_20_2() + ); + + // 1.20.2+ + public static final Class clazz$ServerboundFinishConfigurationPacket = MiscUtils.requireNonNullIf( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.configuration.ServerboundFinishConfigurationPacket") + ), + VersionHelper.isOrAbove1_20_2() + ); + + // 1.20.2+ + public static final Class clazz$ClientboundStartConfigurationPacket = MiscUtils.requireNonNullIf( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundStartConfigurationPacket") + ), + VersionHelper.isOrAbove1_20_2() + ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 7f4b54512..8fa28280b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -42,6 +42,7 @@ import net.momirealms.craftengine.core.plugin.entityculling.EntityCulling; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; +import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; import net.momirealms.craftengine.core.sound.SoundData; import net.momirealms.craftengine.core.sound.SoundSource; import net.momirealms.craftengine.core.util.*; @@ -170,6 +171,8 @@ public class BukkitServerPlayer extends Player { private double displayEntityViewDistance; // 是否是基岩版 private Tristate isBedrock = Tristate.UNDEFINED; + // 客户端协议 + private ProtocolVersion protocolVersion = ProtocolVersion.UNKNOWN; public BukkitServerPlayer(BukkitCraftEngine plugin, @Nullable Channel channel) { this.channel = channel; @@ -1187,6 +1190,16 @@ public class BukkitServerPlayer extends Player { this.blockList = blockList; } + @Override + public ProtocolVersion protocolVersion() { + return this.protocolVersion; + } + + @Override + public void setProtocolVersion(ProtocolVersion protocolVersion) { + this.protocolVersion = protocolVersion; + } + @Override public IntIdentityList clientBlockList() { return this.blockList; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java index 1a89da040..090f2d0fd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java @@ -4,8 +4,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.furniture.ExternalModel; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.Context; - -import java.util.UUID; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; public interface CompatibilityManager { @@ -37,7 +36,7 @@ public interface CompatibilityManager { String parse(Player player1, Player player2, String text); - int getPlayerProtocolVersion(UUID uuid); + int getViaVersionProtocolVersion(NetWorkUser user); void executeMMSkill(String skill, float power, Player player); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ByteBufPacketEvent.java deleted file mode 100644 index 585921ca0..000000000 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ByteBufPacketEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.momirealms.craftengine.core.plugin.network; - -import net.momirealms.craftengine.core.util.Cancellable; -import net.momirealms.craftengine.core.util.FriendlyByteBuf; - -public class ByteBufPacketEvent implements Cancellable { - private boolean cancelled; - private final FriendlyByteBuf buf; - private boolean changed; - private final int packetID; - private final int preIndex; - - public ByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex) { - this.buf = buf; - this.packetID = packetID; - this.preIndex = preIndex; - } - - public int packetID() { - return this.packetID; - } - - public FriendlyByteBuf getBuffer() { - this.buf.readerIndex(this.preIndex); - return this.buf; - } - - public void setChanged(boolean dirty) { - this.changed = dirty; - } - - public boolean changed() { - return this.changed; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - cancelled = cancel; - } -} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java index 233b09cf5..f7dcd064e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/EntityPacketHandler.java @@ -2,6 +2,8 @@ package net.momirealms.craftengine.core.plugin.network; import it.unimi.dsi.fastutil.ints.IntList; import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.network.event.ByteBufPacketEvent; +import net.momirealms.craftengine.core.plugin.network.event.NMSPacketEvent; public interface EntityPacketHandler { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index ab1d0d520..e925eb355 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -100,4 +100,14 @@ public interface NetWorkUser { IntIdentityList clientBlockList(); void setClientBlockList(IntIdentityList integers); + + ProtocolVersion protocolVersion(); + + void setProtocolVersion(ProtocolVersion protocolVersion); + + void setConnectionState(ConnectionState connectionState); + + void setDecoderState(ConnectionState decoderState); + + void setEncoderState(ConnectionState encoderState); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/PacketFlow.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/PacketFlow.java index 2311d2fad..a7ba8dc58 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/PacketFlow.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/PacketFlow.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.core.plugin.network; public enum PacketFlow { - SERVERBOUND, - CLIENTBOUND; + SERVERBOUND, // c2s + CLIENTBOUND; // s2c } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java index 5da16f46b..f76bebbd9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java @@ -1,33 +1,42 @@ package net.momirealms.craftengine.core.plugin.network; -public enum ProtocolVersion { - UNKNOWN(-1, "Unknown"), - V1_20(763, "1.20"), - V1_20_1(763, "1.20.1"), - V1_20_2(764, "1.20.2"), - V1_20_3(765, "1.20.3"), - V1_20_4(765, "1.20.4"), - V1_20_5(766, "1.20.5"), - V1_20_6(766, "1.20.6"), - V1_21(767, "1.21"), - V1_21_1(767, "1.21.1"), - V1_21_2(768, "1.21.2"), - V1_21_3(768, "1.21.3"), - V1_21_4(769, "1.21.4"), - V1_21_5(770, "1.21.5"), - V1_21_6(771, "1.21.6"), - V1_21_7(772, "1.21.7"), - V1_21_8(772, "1.21.8"), - V1_21_9(773, "1.21.9"), - V1_21_10(773, "1.21.10"), - V1_21_11(774, "1.21.11"); +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + +import java.util.Map; + +public final class ProtocolVersion { + public static final ProtocolVersion UNKNOWN = new ProtocolVersion(-1, "Unknown"); + public static final ProtocolVersion V1_20 = new ProtocolVersion(763, "1.20"); + public static final ProtocolVersion V1_20_1 = new ProtocolVersion(763, "1.20.1"); + public static final ProtocolVersion V1_20_2 = new ProtocolVersion(764, "1.20.2"); + public static final ProtocolVersion V1_20_3 = new ProtocolVersion(765, "1.20.3"); + public static final ProtocolVersion V1_20_4 = new ProtocolVersion(765, "1.20.4"); + public static final ProtocolVersion V1_20_5 = new ProtocolVersion(766, "1.20.5"); + public static final ProtocolVersion V1_20_6 = new ProtocolVersion(766, "1.20.6"); + public static final ProtocolVersion V1_21 = new ProtocolVersion(767, "1.21"); + public static final ProtocolVersion V1_21_1 = new ProtocolVersion(767, "1.21.1"); + public static final ProtocolVersion V1_21_2 = new ProtocolVersion(768, "1.21.2"); + public static final ProtocolVersion V1_21_3 = new ProtocolVersion(768, "1.21.3"); + public static final ProtocolVersion V1_21_4 = new ProtocolVersion(769, "1.21.4"); + public static final ProtocolVersion V1_21_5 = new ProtocolVersion(770, "1.21.5"); + public static final ProtocolVersion V1_21_6 = new ProtocolVersion(771, "1.21.6"); + public static final ProtocolVersion V1_21_7 = new ProtocolVersion(772, "1.21.7"); + public static final ProtocolVersion V1_21_8 = new ProtocolVersion(772, "1.21.8"); + public static final ProtocolVersion V1_21_9 = new ProtocolVersion(773, "1.21.9"); + public static final ProtocolVersion V1_21_10 = new ProtocolVersion(773, "1.21.10"); + public static final ProtocolVersion V1_21_11 = new ProtocolVersion(774, "1.21.11"); + private static final Map BY_ID = new Int2ObjectOpenHashMap<>(); + private static final Map BY_NAME = new Object2ObjectOpenHashMap<>(); private final int id; private final String name; - ProtocolVersion(int id, String name) { + private ProtocolVersion(int id, String name) { this.id = id; this.name = name; + BY_ID.put(id, this); + BY_NAME.put(name, this); } public int getId() { @@ -43,20 +52,18 @@ public enum ProtocolVersion { } public static ProtocolVersion getByName(String name) { - for (ProtocolVersion version : values()) { - if (version.getName().equals(name)) { - return version; - } - } - return UNKNOWN; + return BY_NAME.getOrDefault(name, UNKNOWN); } public static ProtocolVersion getById(int id) { - for (ProtocolVersion version : values()) { - if (version.getId() == id) { - return version; - } - } - return UNKNOWN; + return BY_ID.getOrDefault(id, UNKNOWN); + } + + @Override + public String toString() { + return "ProtocolVersion{" + + "id=" + id + + ", name=" + name + + '}'; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/ByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/ByteBufPacketEvent.java new file mode 100644 index 000000000..582716d6e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/ByteBufPacketEvent.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.core.plugin.network.event; + +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.Cancellable; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public abstract class ByteBufPacketEvent implements Cancellable { + private boolean cancelled; + private final FriendlyByteBuf buf; + private boolean changed; + private final int packetID; + private final int preIndex; + private final ConnectionState state; + private final PacketFlow direction; + + protected ByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex, ConnectionState state, PacketFlow direction) { + this.buf = buf; + this.packetID = packetID; + this.preIndex = preIndex; + this.state = state; + this.direction = direction; + } + + public int packetID() { + return this.packetID; + } + + public FriendlyByteBuf getBuffer() { + this.buf.readerIndex(this.preIndex); + return this.buf; + } + + public void setChanged(boolean dirty) { + this.changed = dirty; + } + + public boolean changed() { + return this.changed; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } + + public ConnectionState state() { + return state; + } + + public PacketFlow direction() { + return direction; + } + + public static ByteBufPacketEvent create(int packetID, FriendlyByteBuf buf, int preIndex, ConnectionState state, PacketFlow direction) { + return switch (state) { + case HANDSHAKING -> new HandshakingByteBufPacketEvent(packetID, buf, preIndex, direction); + case STATUS -> new StatusByteBufPacketEvent(packetID, buf, preIndex, direction); + case LOGIN -> new LoginByteBufPacketEvent(packetID, buf, preIndex, direction); + case PLAY -> new PlayByteBufPacketEvent(packetID, buf, preIndex, direction); + case CONFIGURATION -> new ConfigurationByteBufPacketEvent(packetID, buf, preIndex, direction); + }; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/ConfigurationByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/ConfigurationByteBufPacketEvent.java new file mode 100644 index 000000000..01777c24a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/ConfigurationByteBufPacketEvent.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.network.event; + +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class ConfigurationByteBufPacketEvent extends ByteBufPacketEvent { + + public ConfigurationByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex, PacketFlow direction) { + super(packetID, buf, preIndex, ConnectionState.CONFIGURATION, direction); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/HandshakingByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/HandshakingByteBufPacketEvent.java new file mode 100644 index 000000000..1b2eccd05 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/HandshakingByteBufPacketEvent.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.network.event; + +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class HandshakingByteBufPacketEvent extends ByteBufPacketEvent { + + public HandshakingByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex, PacketFlow direction) { + super(packetID, buf, preIndex, ConnectionState.HANDSHAKING, direction); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/LoginByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/LoginByteBufPacketEvent.java new file mode 100644 index 000000000..404dcc5cd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/LoginByteBufPacketEvent.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.network.event; + +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class LoginByteBufPacketEvent extends ByteBufPacketEvent { + + public LoginByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex, PacketFlow direction) { + super(packetID, buf, preIndex, ConnectionState.LOGIN, direction); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NMSPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/NMSPacketEvent.java similarity index 93% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/network/NMSPacketEvent.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/NMSPacketEvent.java index 765fdcf28..41838f71f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NMSPacketEvent.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/NMSPacketEvent.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.core.plugin.network; +package net.momirealms.craftengine.core.plugin.network.event; import net.momirealms.craftengine.core.util.Cancellable; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/PlayByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/PlayByteBufPacketEvent.java new file mode 100644 index 000000000..c4d3fe8a7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/PlayByteBufPacketEvent.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.network.event; + +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class PlayByteBufPacketEvent extends ByteBufPacketEvent { + + public PlayByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex, PacketFlow direction) { + super(packetID, buf, preIndex, ConnectionState.PLAY, direction); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/StatusByteBufPacketEvent.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/StatusByteBufPacketEvent.java new file mode 100644 index 000000000..918bfb7d0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/event/StatusByteBufPacketEvent.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.network.event; + +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +public class StatusByteBufPacketEvent extends ByteBufPacketEvent { + + public StatusByteBufPacketEvent(int packetID, FriendlyByteBuf buf, int preIndex, PacketFlow direction) { + super(packetID, buf, preIndex, ConnectionState.STATUS, direction); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java index 703571af4..e72879f6d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java @@ -13,15 +13,28 @@ import java.util.Arrays; import java.util.List; public class ReflectionUtils { - private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - public static final Unsafe UNSAFE; + public static final MethodHandles.Lookup LOOKUP; + private static final MethodHandle methodHandle$MethodHandleNatives$refKindIsSetter; + private static final MethodHandle methodHandle$constructor$MemberName; + private static final MethodHandle methodHandle$MemberName$getReferenceKind; + private static final MethodHandle methodHandle$MethodHandles$Lookup$getDirectField; static { try { Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); unsafeField.setAccessible(true); UNSAFE = (Unsafe) unsafeField.get(null); + Field implLookup = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); + @SuppressWarnings("deprecation") Object base = UNSAFE.staticFieldBase(implLookup); + @SuppressWarnings("deprecation") long offset = UNSAFE.staticFieldOffset(implLookup); + LOOKUP = (MethodHandles.Lookup) UNSAFE.getObject(base, offset); // 获取神权lookup + Class clazz$MethodHandleNatives = Class.forName("java.lang.invoke.MethodHandleNatives"); + Class clazz$MemberName = Class.forName("java.lang.invoke.MemberName"); + methodHandle$MethodHandleNatives$refKindIsSetter = LOOKUP.unreflect(clazz$MethodHandleNatives.getDeclaredMethod("refKindIsSetter", byte.class)); + methodHandle$constructor$MemberName = LOOKUP.unreflectConstructor(clazz$MemberName.getDeclaredConstructor(Field.class, boolean.class)); + methodHandle$MemberName$getReferenceKind = LOOKUP.unreflect(clazz$MemberName.getDeclaredMethod("getReferenceKind")); + methodHandle$MethodHandles$Lookup$getDirectField = LOOKUP.unreflect(MethodHandles.Lookup.class.getDeclaredMethod("getDirectField", byte.class, Class.class, clazz$MemberName)); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } @@ -510,12 +523,19 @@ public class ReflectionUtils { } } - public static MethodHandle unreflectSetter(Field field) throws IllegalAccessException { + @Nullable + public static MethodHandle unreflectSetter(Field field) { try { return LOOKUP.unreflectSetter(field); } catch (IllegalAccessException e) { - field.setAccessible(true); - return LOOKUP.unreflectSetter(field); + try { // 绕过final限制获取方法句柄 + Object memberName = methodHandle$constructor$MemberName.invoke(field, true); + Object refKind = methodHandle$MemberName$getReferenceKind.invoke(memberName); + methodHandle$MethodHandleNatives$refKindIsSetter.invoke(refKind); + return (MethodHandle) methodHandle$MethodHandles$Lookup$getDirectField.invoke(LOOKUP, refKind, field.getDeclaringClass(), memberName); + } catch (Throwable ex) { + return null; + } } }