diff --git a/build.gradle b/build.gradle index 3ce5462a..f020188f 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ description = 'Provides access to the Minecraft protocol' def isSnapshot = version.endsWith('-SNAPSHOT') repositories { - // mavenLocal() // can speed up build, but may fail in CI + mavenLocal() // can speed up build, but may fail in CI mavenCentral() maven { @@ -46,7 +46,7 @@ dependencies { testImplementation 'org.mockito:mockito-inline:4.11.0' testImplementation 'io.netty:netty-common:4.1.77.Final' testImplementation 'io.netty:netty-transport:4.1.77.Final' - testImplementation 'org.spigotmc:spigot:1.20-R0.1-SNAPSHOT' + testImplementation 'org.spigotmc:spigot:1.20.2-R0.1-SNAPSHOT' testImplementation 'net.kyori:adventure-text-serializer-gson:4.13.0' testImplementation 'net.kyori:adventure-text-serializer-plain:4.13.1' } diff --git a/src/main/java/com/comphenix/protocol/PacketType.java b/src/main/java/com/comphenix/protocol/PacketType.java index 4d11f227..433834f2 100644 --- a/src/main/java/com/comphenix/protocol/PacketType.java +++ b/src/main/java/com/comphenix/protocol/PacketType.java @@ -697,6 +697,7 @@ public class PacketType implements Serializable, Cloneable, Comparable STATUS_SERVER = new ConcurrentHashMap<>(); public final Map LOGIN_CLIENT = new ConcurrentHashMap<>(); public final Map LOGIN_SERVER = new ConcurrentHashMap<>(); - + public final Map CONFIGURATION_CLIENT = new ConcurrentHashMap<>(); + public final Map CONFIGURATION_SERVER = new ConcurrentHashMap<>(); + /** * Retrieve the correct integer map for a specific protocol and sender. * @param protocol - the protocol. @@ -77,6 +79,8 @@ class PacketTypeLookup { return sender == Sender.CLIENT ? STATUS_CLIENT : STATUS_SERVER; case LOGIN: return sender == Sender.CLIENT ? LOGIN_CLIENT : LOGIN_SERVER; + case CONFIGURATION: + return sender == Sender.CLIENT ? CONFIGURATION_CLIENT : CONFIGURATION_SERVER; default: throw new IllegalArgumentException("Unable to find protocol " + protocol); } diff --git a/src/main/java/com/comphenix/protocol/ProtocolLibrary.java b/src/main/java/com/comphenix/protocol/ProtocolLibrary.java index 6851037a..2ffc53f1 100644 --- a/src/main/java/com/comphenix/protocol/ProtocolLibrary.java +++ b/src/main/java/com/comphenix/protocol/ProtocolLibrary.java @@ -42,7 +42,7 @@ public class ProtocolLibrary { /** * The date (with ISO 8601 or YYYY-MM-DD) when the most recent version (1.20.2) was released. */ - public static final String MINECRAFT_LAST_RELEASE_DATE = //"2023-06-12"; + public static final String MINECRAFT_LAST_RELEASE_DATE = "2023-09-21"; /** * Plugins that are currently incompatible with ProtocolLib. diff --git a/src/main/java/com/comphenix/protocol/injector/packet/PacketRegistry.java b/src/main/java/com/comphenix/protocol/injector/packet/PacketRegistry.java index e8e93516..d87b655e 100644 --- a/src/main/java/com/comphenix/protocol/injector/packet/PacketRegistry.java +++ b/src/main/java/com/comphenix/protocol/injector/packet/PacketRegistry.java @@ -27,7 +27,9 @@ import com.comphenix.protocol.PacketType.Sender; import com.comphenix.protocol.ProtocolLogger; import com.comphenix.protocol.reflect.FuzzyReflection; import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.reflect.fuzzy.FuzzyClassContract; import com.comphenix.protocol.reflect.fuzzy.FuzzyFieldContract; +import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract; import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftVersion; @@ -158,8 +160,10 @@ public class PacketRegistry { final Map, Integer>> clientMaps = new LinkedHashMap<>(); Register result = new Register(); + Field mainMapField = null; Field packetMapField = null; + Field holderClassField = null; // only 1.20.2+ // Iterate through the protocols for (Object protocol : protocols) { @@ -184,7 +188,26 @@ public class PacketRegistry { for (Map.Entry entry : directionMap.entrySet()) { Object holder = entry.getValue(); if (packetMapField == null) { - FuzzyReflection fuzzy = FuzzyReflection.fromClass(holder.getClass(), true); + Class packetHolderClass = holder.getClass(); + if (MinecraftVersion.CONFIG_PHASE_PROTOCOL_UPDATE.atOrAbove()) { + FuzzyReflection holderFuzzy = FuzzyReflection.fromClass(packetHolderClass, true); + holderClassField = holderFuzzy.getField(FuzzyFieldContract.newBuilder() + .banModifier(Modifier.STATIC) + .requireModifier(Modifier.FINAL) + .typeMatches(FuzzyClassContract.newBuilder() + .method(FuzzyMethodContract.newBuilder() + .returnTypeExact(MinecraftReflection.getPacketClass()) + .parameterCount(2) + .parameterExactType(int.class, 0) + .parameterExactType(MinecraftReflection.getPacketDataSerializerClass(), 1) + .build()) + .build()) + .build()); + holderClassField.setAccessible(true); + packetHolderClass = holderClassField.getType(); + } + + FuzzyReflection fuzzy = FuzzyReflection.fromClass(packetHolderClass, true); packetMapField = fuzzy.getField(FuzzyFieldContract.newBuilder() .banModifier(Modifier.STATIC) .requireModifier(Modifier.FINAL) @@ -193,10 +216,18 @@ public class PacketRegistry { packetMapField.setAccessible(true); } - Map, Integer> packetMap; + Object holderInstance = holder; + if (MinecraftVersion.CONFIG_PHASE_PROTOCOL_UPDATE.atOrAbove()) { + try { + holderInstance = holderClassField.get(holder); + } catch (ReflectiveOperationException ex) { + throw new RuntimeException("Failed to access packet map", ex); + } + } + Map, Integer> packetMap; try { - packetMap = (Map, Integer>) packetMapField.get(holder); + packetMap = (Map, Integer>) packetMapField.get(holderInstance); } catch (ReflectiveOperationException ex) { throw new RuntimeException("Failed to access packet map", ex); } diff --git a/src/main/java/com/comphenix/protocol/wrappers/EnumWrappers.java b/src/main/java/com/comphenix/protocol/wrappers/EnumWrappers.java index 161badbb..e110f191 100644 --- a/src/main/java/com/comphenix/protocol/wrappers/EnumWrappers.java +++ b/src/main/java/com/comphenix/protocol/wrappers/EnumWrappers.java @@ -501,7 +501,12 @@ public abstract class EnumWrappers { DIFFICULTY_CLASS = getEnum(PacketType.Play.Server.LOGIN.getPacketClass(), 1); } - GAMEMODE_CLASS = getEnum(PacketType.Play.Server.LOGIN.getPacketClass(), 0); + if (MinecraftVersion.CONFIG_PHASE_PROTOCOL_UPDATE.atOrAbove()) { + GAMEMODE_CLASS = getEnum(MinecraftReflection.getPlayerInfoDataClass(), 0); + } else { + GAMEMODE_CLASS = getEnum(PacketType.Play.Server.LOGIN.getPacketClass(), 0); + } + RESOURCE_PACK_STATUS_CLASS = getEnum(PacketType.Play.Client.RESOURCE_PACK_STATUS.getPacketClass(), 0); TITLE_ACTION_CLASS = getEnum(PacketType.Play.Server.TITLE.getPacketClass(), 0); WORLD_BORDER_ACTION_CLASS = getEnum(PacketType.Play.Server.WORLD_BORDER.getPacketClass(), 0); diff --git a/src/test/java/com/comphenix/protocol/BukkitInitialization.java b/src/test/java/com/comphenix/protocol/BukkitInitialization.java index 83c082d0..b8cdd0f7 100644 --- a/src/test/java/com/comphenix/protocol/BukkitInitialization.java +++ b/src/test/java/com/comphenix/protocol/BukkitInitialization.java @@ -14,10 +14,10 @@ import org.apache.logging.log4j.LogManager; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_20_R1.CraftServer; -import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemFactory; -import org.bukkit.craftbukkit.v1_20_R1.util.Versioning; +import org.bukkit.craftbukkit.v1_20_R2.CraftServer; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemFactory; +import org.bukkit.craftbukkit.v1_20_R2.util.Versioning; import org.spigotmc.SpigotWorldConfig; import static org.mockito.Mockito.mock; diff --git a/src/test/java/com/comphenix/protocol/PacketTypeTest.java b/src/test/java/com/comphenix/protocol/PacketTypeTest.java index 4ae2f155..77f55366 100644 --- a/src/test/java/com/comphenix/protocol/PacketTypeTest.java +++ b/src/test/java/com/comphenix/protocol/PacketTypeTest.java @@ -297,15 +297,19 @@ public class PacketTypeTest { EnumProtocol[] protocols = EnumProtocol.values(); for (EnumProtocol protocol : protocols) { - Field field = EnumProtocol.class.getDeclaredField("k"); + Field field = EnumProtocol.class.getDeclaredField("h"); field.setAccessible(true); Map map = (Map) field.get(protocol); for (Entry entry : map.entrySet()) { - Field mapField = entry.getValue().getClass().getDeclaredField("b"); + Field holderField = entry.getValue().getClass().getDeclaredField("c"); + holderField.setAccessible(true); + + Object holder = holderField.get(entry.getValue()); + Field mapField = holder.getClass().getDeclaredField("b"); mapField.setAccessible(true); - Map, Integer> reverseMap = (Map, Integer>) mapField.get(entry.getValue()); + Map, Integer> reverseMap = (Map, Integer>) mapField.get(holder); Map> treeMap = new TreeMap<>(); for (Entry, Integer> entry1 : reverseMap.entrySet()) { diff --git a/src/test/java/com/comphenix/protocol/events/PacketContainerTest.java b/src/test/java/com/comphenix/protocol/events/PacketContainerTest.java index e5a79fa6..cfe57f99 100644 --- a/src/test/java/com/comphenix/protocol/events/PacketContainerTest.java +++ b/src/test/java/com/comphenix/protocol/events/PacketContainerTest.java @@ -63,6 +63,7 @@ import net.minecraft.network.protocol.game.PacketPlayOutUpdateAttributes.Attribu import net.minecraft.resources.MinecraftKey; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectList; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.ai.attributes.AttributeBase; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.animal.CatVariant; @@ -79,7 +80,6 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static com.comphenix.protocol.utility.TestUtils.assertItemCollectionsEqual; @@ -487,7 +487,7 @@ public class PacketContainerTest { @SuppressWarnings("deprecation") public void testPotionEffect() { PotionEffect effect = new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 20 * 60, 1); - MobEffect mobEffect = new MobEffect(MobEffectList.a(effect.getType().getId()), effect.getDuration(), + MobEffect mobEffect = new MobEffect(MobEffects.l, effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()); int entityId = 42; diff --git a/src/test/java/com/comphenix/protocol/injector/EntityUtilitiesTest.java b/src/test/java/com/comphenix/protocol/injector/EntityUtilitiesTest.java index 3d637626..482733ae 100644 --- a/src/test/java/com/comphenix/protocol/injector/EntityUtilitiesTest.java +++ b/src/test/java/com/comphenix/protocol/injector/EntityUtilitiesTest.java @@ -12,8 +12,8 @@ import net.minecraft.server.level.PlayerChunkMap; import net.minecraft.server.level.PlayerChunkMap.EntityTracker; import net.minecraft.server.level.WorldServer; import net.minecraft.world.entity.Entity; -import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTest.java b/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTest.java index 1b695ae7..4dae0b0d 100644 --- a/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTest.java +++ b/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTest.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.ChunkCoordIntPair; import net.minecraft.world.level.block.state.IBlockData; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; import org.junit.jupiter.api.AfterAll; diff --git a/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTestUtil.java b/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTestUtil.java index ee6d5c0a..cd858f75 100644 --- a/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTestUtil.java +++ b/src/test/java/com/comphenix/protocol/utility/MinecraftReflectionTestUtil.java @@ -2,8 +2,8 @@ package com.comphenix.protocol.utility; public class MinecraftReflectionTestUtil { - public static final String RELEASE_TARGET = "1.20"; - public static final String PACKAGE_VERSION = "v1_20_R1"; + public static final String RELEASE_TARGET = "1.20.2"; + public static final String PACKAGE_VERSION = "v1_20_R2"; public static final String NMS = "net.minecraft"; public static final String OBC = "org.bukkit.craftbukkit." + PACKAGE_VERSION; diff --git a/src/test/java/com/comphenix/protocol/wrappers/WrappedBlockDataTest.java b/src/test/java/com/comphenix/protocol/wrappers/WrappedBlockDataTest.java index 234b8e1a..9f6d0817 100644 --- a/src/test/java/com/comphenix/protocol/wrappers/WrappedBlockDataTest.java +++ b/src/test/java/com/comphenix/protocol/wrappers/WrappedBlockDataTest.java @@ -19,9 +19,9 @@ import net.minecraft.world.level.block.state.IBlockData; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.block.data.type.GlassPane; -import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R1.block.impl.CraftStainedGlassPane; -import org.bukkit.craftbukkit.v1_20_R1.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R2.block.impl.CraftStainedGlassPane; +import org.bukkit.craftbukkit.v1_20_R2.util.CraftMagicNumbers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/comphenix/protocol/wrappers/WrappedDataWatcherTest.java b/src/test/java/com/comphenix/protocol/wrappers/WrappedDataWatcherTest.java index ff6b5252..015cf743 100644 --- a/src/test/java/com/comphenix/protocol/wrappers/WrappedDataWatcherTest.java +++ b/src/test/java/com/comphenix/protocol/wrappers/WrappedDataWatcherTest.java @@ -19,8 +19,8 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; import net.minecraft.world.entity.projectile.EntityEgg; -import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEgg; -import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEgg; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/comphenix/protocol/wrappers/WrappedGameProfileTest.java b/src/test/java/com/comphenix/protocol/wrappers/WrappedGameProfileTest.java index be47beab..39210818 100644 --- a/src/test/java/com/comphenix/protocol/wrappers/WrappedGameProfileTest.java +++ b/src/test/java/com/comphenix/protocol/wrappers/WrappedGameProfileTest.java @@ -81,8 +81,8 @@ public class WrappedGameProfileTest { PropertyMap properties = profile.getProperties(); Property property = properties.get(name).iterator().next(); - assertEquals(property.getName(), name); - assertEquals(property.getValue(), value); - assertEquals(property.getSignature(), signature); + assertEquals(property.name(), name); + assertEquals(property.value(), value); + assertEquals(property.signature(), signature); } }