From 0f1c3cb400befb60d0b724e09d08a580112714c0 Mon Sep 17 00:00:00 2001 From: 0utplay Date: Thu, 11 Jun 2026 21:18:01 +0200 Subject: [PATCH 1/5] fix: dies und das --- .../bukkit/BukkitPlatformNPCManagement.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java index 4242c05740..a8a09ce01a 100644 --- a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java +++ b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java @@ -48,6 +48,8 @@ import eu.cloudnetservice.wrapper.configuration.WrapperConfiguration; import jakarta.inject.Inject; import jakarta.inject.Singleton; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodType; import java.util.concurrent.ThreadLocalRandom; import lombok.NonNull; import org.bukkit.Location; @@ -72,6 +74,19 @@ public class BukkitPlatformNPCManagement extends PlatformNPCManagement { + private static final MethodHandle SERVER_GET_MINECRAFT_VERSION; + + static { + MethodHandle getVersionMh = null; + try { + var lookup = java.lang.invoke.MethodHandles.publicLookup(); + getVersionMh = lookup.findVirtual(Server.class, "getMinecraftVersion", MethodType.methodType(String.class)); + } catch (Throwable ignored) { + } + + SERVER_GET_MINECRAFT_VERSION = getVersionMh; + } + protected final Plugin plugin; protected final Server server; protected final BukkitScheduler scheduler; @@ -291,14 +306,26 @@ protected void startEmoteTask(boolean force) { protected @NonNull PlatformPacketAdapter resolvePacketAdapter() { var bukkitVersion = this.server.getBukkitVersion(); - var parsedVersion = PEVersion.fromString(bukkitVersion.substring(0, bukkitVersion.indexOf("-"))); - var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName()); - if (parsedVersion.isNewerThan(latestPEVersion)) { - this.plugin.getLogger().info("NPCs using ProtocolLib for version " + bukkitVersion); - return BukkitProtocolAdapter.protocolLib(); + if (SERVER_GET_MINECRAFT_VERSION != null) { + try { + bukkitVersion = SERVER_GET_MINECRAFT_VERSION.invoke(this.server).toString(); + } catch (Throwable _) { + } } - this.plugin.getLogger().info("NPCs using PacketEvents for version " + bukkitVersion); - return BukkitProtocolAdapter.packetEvents(); + try { + var parsedVersion = PEVersion.fromString(bukkitVersion.substring(0, bukkitVersion.indexOf("-"))); + var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName()); + if (parsedVersion.isNewerThan(latestPEVersion)) { + this.plugin.getLogger().info("NPCs using ProtocolLib for version " + bukkitVersion); + return BukkitProtocolAdapter.protocolLib(); + } + + this.plugin.getLogger().info("NPCs using PacketEvents for version " + bukkitVersion); + return BukkitProtocolAdapter.packetEvents(); + } catch (Throwable ex) { + this.plugin.getLogger().warning("Could not parse Bukkit version, falling back to ProtocolLib"); + return BukkitProtocolAdapter.protocolLib(); + } } } From 68c7174b2feb547b5ad5ede4d74a3a9d4f0157df Mon Sep 17 00:00:00 2001 From: 0utplay Date: Thu, 11 Jun 2026 21:19:08 +0200 Subject: [PATCH 2/5] fix: danke ij --- .../npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java index a8a09ce01a..d41ff61898 100644 --- a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java +++ b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java @@ -49,6 +49,7 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.concurrent.ThreadLocalRandom; import lombok.NonNull; @@ -79,7 +80,7 @@ public class BukkitPlatformNPCManagement extends static { MethodHandle getVersionMh = null; try { - var lookup = java.lang.invoke.MethodHandles.publicLookup(); + var lookup = MethodHandles.publicLookup(); getVersionMh = lookup.findVirtual(Server.class, "getMinecraftVersion", MethodType.methodType(String.class)); } catch (Throwable ignored) { } From 3725bc943d15f8c3019ad39f6d21abaf3f898e1d Mon Sep 17 00:00:00 2001 From: 0utplay Date: Thu, 11 Jun 2026 21:20:16 +0200 Subject: [PATCH 3/5] fix: use invoke exact --- .../npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java index d41ff61898..390ad394b5 100644 --- a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java +++ b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java @@ -309,7 +309,7 @@ protected void startEmoteTask(boolean force) { var bukkitVersion = this.server.getBukkitVersion(); if (SERVER_GET_MINECRAFT_VERSION != null) { try { - bukkitVersion = SERVER_GET_MINECRAFT_VERSION.invoke(this.server).toString(); + bukkitVersion = SERVER_GET_MINECRAFT_VERSION.invokeExact(this.server).toString(); } catch (Throwable _) { } } From 966f402f798edcd8efdb839b58a30b38e26eb64e Mon Sep 17 00:00:00 2001 From: 0utplay Date: Thu, 11 Jun 2026 23:00:54 +0200 Subject: [PATCH 4/5] fix: dies und das --- .../bukkit/BukkitPlatformNPCManagement.java | 43 +------- .../bukkit/util/BukkitPacketAdapterUtil.java | 101 ++++++++++++++++++ 2 files changed, 103 insertions(+), 41 deletions(-) create mode 100644 modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/util/BukkitPacketAdapterUtil.java diff --git a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java index 390ad394b5..380b313dcc 100644 --- a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java +++ b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java @@ -21,10 +21,7 @@ import com.github.juliarn.npclib.api.protocol.PlatformPacketAdapter; import com.github.juliarn.npclib.bukkit.BukkitPlatform; import com.github.juliarn.npclib.bukkit.BukkitWorldAccessor; -import com.github.juliarn.npclib.bukkit.protocol.BukkitProtocolAdapter; import com.github.juliarn.npclib.ext.labymod.LabyModExtension; -import com.github.retrooper.packetevents.manager.server.ServerVersion; -import com.github.retrooper.packetevents.util.PEVersion; import com.google.common.base.Preconditions; import eu.cloudnetservice.driver.ComponentInfo; import eu.cloudnetservice.driver.event.EventManager; @@ -42,15 +39,13 @@ import eu.cloudnetservice.modules.npc.impl.AbstractNPCManagement; import eu.cloudnetservice.modules.npc.impl.InternalNPCManagement; import eu.cloudnetservice.modules.npc.impl.platform.PlatformNPCManagement; +import eu.cloudnetservice.modules.npc.impl.platform.bukkit.util.BukkitPacketAdapterUtil; import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.EntityBukkitPlatformSelectorEntity; import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.NPCBukkitPlatformSelector; import eu.cloudnetservice.modules.npc.platform.PlatformSelectorEntity; import eu.cloudnetservice.wrapper.configuration.WrapperConfiguration; import jakarta.inject.Inject; import jakarta.inject.Singleton; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.util.concurrent.ThreadLocalRandom; import lombok.NonNull; import org.bukkit.Location; @@ -75,19 +70,6 @@ public class BukkitPlatformNPCManagement extends PlatformNPCManagement { - private static final MethodHandle SERVER_GET_MINECRAFT_VERSION; - - static { - MethodHandle getVersionMh = null; - try { - var lookup = MethodHandles.publicLookup(); - getVersionMh = lookup.findVirtual(Server.class, "getMinecraftVersion", MethodType.methodType(String.class)); - } catch (Throwable ignored) { - } - - SERVER_GET_MINECRAFT_VERSION = getVersionMh; - } - protected final Plugin plugin; protected final Server server; protected final BukkitScheduler scheduler; @@ -306,27 +288,6 @@ protected void startEmoteTask(boolean force) { } protected @NonNull PlatformPacketAdapter resolvePacketAdapter() { - var bukkitVersion = this.server.getBukkitVersion(); - if (SERVER_GET_MINECRAFT_VERSION != null) { - try { - bukkitVersion = SERVER_GET_MINECRAFT_VERSION.invokeExact(this.server).toString(); - } catch (Throwable _) { - } - } - - try { - var parsedVersion = PEVersion.fromString(bukkitVersion.substring(0, bukkitVersion.indexOf("-"))); - var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName()); - if (parsedVersion.isNewerThan(latestPEVersion)) { - this.plugin.getLogger().info("NPCs using ProtocolLib for version " + bukkitVersion); - return BukkitProtocolAdapter.protocolLib(); - } - - this.plugin.getLogger().info("NPCs using PacketEvents for version " + bukkitVersion); - return BukkitProtocolAdapter.packetEvents(); - } catch (Throwable ex) { - this.plugin.getLogger().warning("Could not parse Bukkit version, falling back to ProtocolLib"); - return BukkitProtocolAdapter.protocolLib(); - } + return BukkitPacketAdapterUtil.resolve(); } } diff --git a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/util/BukkitPacketAdapterUtil.java b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/util/BukkitPacketAdapterUtil.java new file mode 100644 index 0000000000..29ec22a831 --- /dev/null +++ b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/util/BukkitPacketAdapterUtil.java @@ -0,0 +1,101 @@ +/* + * Copyright 2019-present CloudNetService team & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package eu.cloudnetservice.modules.npc.impl.platform.bukkit.util; + +import com.github.juliarn.npclib.api.protocol.PlatformPacketAdapter; +import com.github.juliarn.npclib.bukkit.protocol.BukkitProtocolAdapter; +import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.util.PEVersion; +import eu.cloudnetservice.utils.base.StringUtil; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.function.Supplier; +import lombok.NonNull; +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; + +public final class BukkitPacketAdapterUtil { + + private static final String NPC_PACKET_ADAPTER = System.getProperty("cloudnet.npcs.packet-adapter"); + + private static final MethodHandle SERVER_GET_BUKKIT_VERSION; + + static { + MethodHandle handle = null; + try { + handle = MethodHandles.publicLookup().findVirtual(Server.class, "getBukkitVersion", MethodType.methodType(String.class)); + } catch (Throwable _) { + } + SERVER_GET_BUKKIT_VERSION = handle; + } + + private static final Supplier> RESOLVED = StableValue.supplier( + BukkitPacketAdapterUtil::resolveAdapter); + + private BukkitPacketAdapterUtil() { + throw new UnsupportedOperationException(); + } + + public static @NonNull PlatformPacketAdapter resolve() { + return RESOLVED.get(); + } + + private static @NonNull PlatformPacketAdapter resolveAdapter() { + if (NPC_PACKET_ADAPTER == null) { + return evaluateAdapter(); + } + + return switch (StringUtil.toLower(NPC_PACKET_ADAPTER)) { + case "protocollib" -> BukkitProtocolAdapter.protocolLib(); + case "packetevents" -> BukkitProtocolAdapter.packetEvents(); + default -> evaluateAdapter(); + }; + } + + private static @NonNull PlatformPacketAdapter evaluateAdapter() { + try { + var bukkitVersion = resolveMinecraftVersion(); + var versionStart = bukkitVersion.indexOf('-'); + var parsedVersion = PEVersion.fromString(versionStart >= 0 ? bukkitVersion.substring(0, versionStart) : bukkitVersion); + var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName()); + if (parsedVersion.isNewerThan(latestPEVersion)) { + return BukkitProtocolAdapter.protocolLib(); + } + + return BukkitProtocolAdapter.packetEvents(); + } catch (Throwable _) { + return BukkitProtocolAdapter.protocolLib(); + } + } + + private static @NonNull String resolveMinecraftVersion() { + try { + if (SERVER_GET_BUKKIT_VERSION != null) { + return (String) SERVER_GET_BUKKIT_VERSION.invoke(Bukkit.getServer()); + } + } catch (Throwable _) { + } + return Bukkit.getBukkitVersion(); + } +} + + From 90f00098e809fc0a1270b5eff979d6251a920986 Mon Sep 17 00:00:00 2001 From: 0utplay Date: Thu, 11 Jun 2026 23:05:55 +0200 Subject: [PATCH 5/5] fix: dies und das --- .../npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java index 380b313dcc..3571077b97 100644 --- a/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java +++ b/modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java @@ -39,9 +39,9 @@ import eu.cloudnetservice.modules.npc.impl.AbstractNPCManagement; import eu.cloudnetservice.modules.npc.impl.InternalNPCManagement; import eu.cloudnetservice.modules.npc.impl.platform.PlatformNPCManagement; -import eu.cloudnetservice.modules.npc.impl.platform.bukkit.util.BukkitPacketAdapterUtil; import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.EntityBukkitPlatformSelectorEntity; import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.NPCBukkitPlatformSelector; +import eu.cloudnetservice.modules.npc.impl.platform.bukkit.util.BukkitPacketAdapterUtil; import eu.cloudnetservice.modules.npc.platform.PlatformSelectorEntity; import eu.cloudnetservice.wrapper.configuration.WrapperConfiguration; import jakarta.inject.Inject;