Skip to content

Commit 966f402

Browse files
committed
fix: dies und das
1 parent 3725bc9 commit 966f402

2 files changed

Lines changed: 103 additions & 41 deletions

File tree

modules/npcs/impl/src/main/java/eu/cloudnetservice/modules/npc/impl/platform/bukkit/BukkitPlatformNPCManagement.java

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
import com.github.juliarn.npclib.api.protocol.PlatformPacketAdapter;
2222
import com.github.juliarn.npclib.bukkit.BukkitPlatform;
2323
import com.github.juliarn.npclib.bukkit.BukkitWorldAccessor;
24-
import com.github.juliarn.npclib.bukkit.protocol.BukkitProtocolAdapter;
2524
import com.github.juliarn.npclib.ext.labymod.LabyModExtension;
26-
import com.github.retrooper.packetevents.manager.server.ServerVersion;
27-
import com.github.retrooper.packetevents.util.PEVersion;
2825
import com.google.common.base.Preconditions;
2926
import eu.cloudnetservice.driver.ComponentInfo;
3027
import eu.cloudnetservice.driver.event.EventManager;
@@ -42,15 +39,13 @@
4239
import eu.cloudnetservice.modules.npc.impl.AbstractNPCManagement;
4340
import eu.cloudnetservice.modules.npc.impl.InternalNPCManagement;
4441
import eu.cloudnetservice.modules.npc.impl.platform.PlatformNPCManagement;
42+
import eu.cloudnetservice.modules.npc.impl.platform.bukkit.util.BukkitPacketAdapterUtil;
4543
import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.EntityBukkitPlatformSelectorEntity;
4644
import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.NPCBukkitPlatformSelector;
4745
import eu.cloudnetservice.modules.npc.platform.PlatformSelectorEntity;
4846
import eu.cloudnetservice.wrapper.configuration.WrapperConfiguration;
4947
import jakarta.inject.Inject;
5048
import jakarta.inject.Singleton;
51-
import java.lang.invoke.MethodHandle;
52-
import java.lang.invoke.MethodHandles;
53-
import java.lang.invoke.MethodType;
5449
import java.util.concurrent.ThreadLocalRandom;
5550
import lombok.NonNull;
5651
import org.bukkit.Location;
@@ -75,19 +70,6 @@
7570
public class BukkitPlatformNPCManagement extends
7671
PlatformNPCManagement<Location, Player, ItemStack, Inventory, Scoreboard> {
7772

78-
private static final MethodHandle SERVER_GET_MINECRAFT_VERSION;
79-
80-
static {
81-
MethodHandle getVersionMh = null;
82-
try {
83-
var lookup = MethodHandles.publicLookup();
84-
getVersionMh = lookup.findVirtual(Server.class, "getMinecraftVersion", MethodType.methodType(String.class));
85-
} catch (Throwable ignored) {
86-
}
87-
88-
SERVER_GET_MINECRAFT_VERSION = getVersionMh;
89-
}
90-
9173
protected final Plugin plugin;
9274
protected final Server server;
9375
protected final BukkitScheduler scheduler;
@@ -306,27 +288,6 @@ protected void startEmoteTask(boolean force) {
306288
}
307289

308290
protected @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> resolvePacketAdapter() {
309-
var bukkitVersion = this.server.getBukkitVersion();
310-
if (SERVER_GET_MINECRAFT_VERSION != null) {
311-
try {
312-
bukkitVersion = SERVER_GET_MINECRAFT_VERSION.invokeExact(this.server).toString();
313-
} catch (Throwable _) {
314-
}
315-
}
316-
317-
try {
318-
var parsedVersion = PEVersion.fromString(bukkitVersion.substring(0, bukkitVersion.indexOf("-")));
319-
var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName());
320-
if (parsedVersion.isNewerThan(latestPEVersion)) {
321-
this.plugin.getLogger().info("NPCs using ProtocolLib for version " + bukkitVersion);
322-
return BukkitProtocolAdapter.protocolLib();
323-
}
324-
325-
this.plugin.getLogger().info("NPCs using PacketEvents for version " + bukkitVersion);
326-
return BukkitProtocolAdapter.packetEvents();
327-
} catch (Throwable ex) {
328-
this.plugin.getLogger().warning("Could not parse Bukkit version, falling back to ProtocolLib");
329-
return BukkitProtocolAdapter.protocolLib();
330-
}
291+
return BukkitPacketAdapterUtil.resolve();
331292
}
332293
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* Copyright 2019-present CloudNetService team & contributors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package eu.cloudnetservice.modules.npc.impl.platform.bukkit.util;
18+
19+
import com.github.juliarn.npclib.api.protocol.PlatformPacketAdapter;
20+
import com.github.juliarn.npclib.bukkit.protocol.BukkitProtocolAdapter;
21+
import com.github.retrooper.packetevents.manager.server.ServerVersion;
22+
import com.github.retrooper.packetevents.util.PEVersion;
23+
import eu.cloudnetservice.utils.base.StringUtil;
24+
import java.lang.invoke.MethodHandle;
25+
import java.lang.invoke.MethodHandles;
26+
import java.lang.invoke.MethodType;
27+
import java.util.function.Supplier;
28+
import lombok.NonNull;
29+
import org.bukkit.Bukkit;
30+
import org.bukkit.Server;
31+
import org.bukkit.World;
32+
import org.bukkit.entity.Player;
33+
import org.bukkit.inventory.ItemStack;
34+
import org.bukkit.plugin.Plugin;
35+
36+
public final class BukkitPacketAdapterUtil {
37+
38+
private static final String NPC_PACKET_ADAPTER = System.getProperty("cloudnet.npcs.packet-adapter");
39+
40+
private static final MethodHandle SERVER_GET_BUKKIT_VERSION;
41+
42+
static {
43+
MethodHandle handle = null;
44+
try {
45+
handle = MethodHandles.publicLookup().findVirtual(Server.class, "getBukkitVersion", MethodType.methodType(String.class));
46+
} catch (Throwable _) {
47+
}
48+
SERVER_GET_BUKKIT_VERSION = handle;
49+
}
50+
51+
private static final Supplier<PlatformPacketAdapter<World, Player, ItemStack, Plugin>> RESOLVED = StableValue.supplier(
52+
BukkitPacketAdapterUtil::resolveAdapter);
53+
54+
private BukkitPacketAdapterUtil() {
55+
throw new UnsupportedOperationException();
56+
}
57+
58+
public static @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> resolve() {
59+
return RESOLVED.get();
60+
}
61+
62+
private static @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> resolveAdapter() {
63+
if (NPC_PACKET_ADAPTER == null) {
64+
return evaluateAdapter();
65+
}
66+
67+
return switch (StringUtil.toLower(NPC_PACKET_ADAPTER)) {
68+
case "protocollib" -> BukkitProtocolAdapter.protocolLib();
69+
case "packetevents" -> BukkitProtocolAdapter.packetEvents();
70+
default -> evaluateAdapter();
71+
};
72+
}
73+
74+
private static @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> evaluateAdapter() {
75+
try {
76+
var bukkitVersion = resolveMinecraftVersion();
77+
var versionStart = bukkitVersion.indexOf('-');
78+
var parsedVersion = PEVersion.fromString(versionStart >= 0 ? bukkitVersion.substring(0, versionStart) : bukkitVersion);
79+
var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName());
80+
if (parsedVersion.isNewerThan(latestPEVersion)) {
81+
return BukkitProtocolAdapter.protocolLib();
82+
}
83+
84+
return BukkitProtocolAdapter.packetEvents();
85+
} catch (Throwable _) {
86+
return BukkitProtocolAdapter.protocolLib();
87+
}
88+
}
89+
90+
private static @NonNull String resolveMinecraftVersion() {
91+
try {
92+
if (SERVER_GET_BUKKIT_VERSION != null) {
93+
return (String) SERVER_GET_BUKKIT_VERSION.invoke(Bukkit.getServer());
94+
}
95+
} catch (Throwable _) {
96+
}
97+
return Bukkit.getBukkitVersion();
98+
}
99+
}
100+
101+

0 commit comments

Comments
 (0)