Skip to content

Commit f76cdf1

Browse files
committed
Merge branch 'nightly' into feat/sql-module
# Conflicts: # gradle/libs.versions.toml
2 parents 7fbd22d + bc4ebcb commit f76cdf1

8 files changed

Lines changed: 358 additions & 51 deletions

File tree

.idea/codeStyles/Project.xml

Lines changed: 0 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/platform-inject-support/runtime/src/main/java/eu/cloudnetservice/ext/platforminject/runtime/platform/minestom/MinestomPlatformPluginManager.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535
import net.minestom.server.instance.InstanceManager;
3636
import net.minestom.server.instance.block.BlockManager;
3737
import net.minestom.server.listener.manager.PacketListenerManager;
38-
import net.minestom.server.monitoring.BenchmarkManager;
3938
import net.minestom.server.network.ConnectionManager;
40-
import net.minestom.server.network.packet.PacketParser;
4139
import net.minestom.server.recipe.RecipeManager;
4240
import net.minestom.server.scoreboard.TeamManager;
4341
import net.minestom.server.timer.SchedulerManager;
@@ -61,10 +59,8 @@ public MinestomPlatformPluginManager() {
6159
layer.install(builder.bind(RecipeManager.class).toInstance(MinecraftServer.getRecipeManager()));
6260
layer.install(builder.bind(BossBarManager.class).toInstance(MinecraftServer.getBossBarManager()));
6361
layer.install(builder.bind(CommandManager.class).toInstance(MinecraftServer.getCommandManager()));
64-
layer.install(builder.bind(PacketParser.class).toInstance(MinecraftServer.getPacketParser()));
6562
layer.install(builder.bind(InstanceManager.class).toInstance(MinecraftServer.getInstanceManager()));
6663
layer.install(builder.bind(ExceptionManager.class).toInstance(MinecraftServer.getExceptionManager()));
67-
layer.install(builder.bind(BenchmarkManager.class).toInstance(MinecraftServer.getBenchmarkManager()));
6864
layer.install(builder.bind(SchedulerManager.class).toInstance(MinecraftServer.getSchedulerManager()));
6965
layer.install(builder.bind(ConnectionManager.class).toInstance(MinecraftServer.getConnectionManager()));
7066
layer.install(builder.bind(ExtensionManager.class).toInstance(ExtensionBootstrap.getExtensionManager()));

gradle/libs.versions.toml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@ checkstyleTools = "13.0.0"
1010

1111
# google libs
1212
gson = "2.13.2"
13-
guava = "33.5.0-jre"
13+
guava = "33.6.0-jre"
1414

1515
# testing
16-
junit = "6.0.2"
16+
junit = "6.0.3"
1717
mockito = "5.21.0"
18-
testcontainers = "2.0.3"
18+
testcontainers = "2.0.4"
1919

2020
# compile time processing
21-
lombok = "1.18.42"
21+
lombok = "1.18.44"
2222
javapoet = "1.13.0"
2323

2424
# console
25-
jline = "3.30.6"
25+
jline = "3.30.9"
2626
cloud = "2.0.0-cn1"
2727
cloudApi = "2.0.0"
2828
stringSimilarity = "2.0.0"
@@ -32,55 +32,55 @@ cloudConfirmation = "1.0.0-rc.1"
3232
jooq = "3.20.10"
3333
h2 = "1.4.197" # do not update, leads to database incompatibility
3434
xodus = "2.0.1"
35-
mongodb = "5.6.2"
35+
mongodb = "5.6.5"
3636
hikariCp = "7.0.2"
37-
mysqlConnector = "9.6.0"
37+
mysqlConnector = "9.7.0"
3838
sqliteConnector = "3.51.1.0"
3939
postgresqlConnector = "42.7.9"
4040
mariadbConnector = "3.5.7"
4141

4242
# general
4343
oshi = "6.9.2"
4444
gulf = "0.0.1"
45-
vavr = "0.11.0"
45+
vavr = "1.0.1"
4646
sshj = "0.40.0"
4747
aerogel = "3.1.0"
4848
awsSdk = "2.41.11"
4949
unirest = "4.7.4"
5050
caffeine = "3.2.3"
5151
reflexion = "2.0.0"
5252
geantyref = "2.0.1"
53-
dockerJava = "3.7.0"
54-
nightConfig = "3.8.3"
55-
annotations = "26.0.2-1"
53+
dockerJava = "3.7.1"
54+
nightConfig = "3.8.4"
55+
annotations = "26.1.0"
5656
influxClient = "7.4.0"
5757
netty = "2025.11.08-3a259e91"
5858

5959
# logging
6060
slf4j = "2.0.17"
61-
logback = "1.5.25"
61+
logback = "1.5.32"
6262

6363
# platform api versions
6464
sponge = "9.0.0"
6565
velocity = "3.5.0-SNAPSHOT"
6666
waterdogpe = "1.2.4"
6767
nukkitX = "1.0-SNAPSHOT"
68-
minestom = "2026.01.08-1.21.11"
68+
minestom = "2026.07.22-26.2"
6969
minestomExtensions = "1.2.0"
7070
spigot = "1.8.8-R0.1-SNAPSHOT"
71-
bungeecord = "1.21-R0.5-SNAPSHOT"
71+
bungeecord = "26.1-R0.1-SNAPSHOT"
7272
limboloohp = "0.7.9-ALPHA"
7373
folia = "1.21.11-R0.1-SNAPSHOT"
7474

7575
# platform extensions
7676
adventure = "4.26.1"
7777
modlauncher = "8.1.3"
78-
npcLib = "3.0.0-beta.16"
79-
packetEvents = "2.11.1"
78+
npcLib = "3.0.0-beta.17"
79+
packetEvents = "2.13.0"
8080
placeholderApi = "2.11.7"
8181
adventure-serializer-bungee = "4.4.1"
8282
luckPermsApi = "5.5"
83-
fabricLoader = "0.18.4"
83+
fabricLoader = "0.19.3"
8484

8585

8686
[libraries]

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

Lines changed: 2 additions & 13 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;
@@ -44,6 +41,7 @@
4441
import eu.cloudnetservice.modules.npc.impl.platform.PlatformNPCManagement;
4542
import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.EntityBukkitPlatformSelectorEntity;
4643
import eu.cloudnetservice.modules.npc.impl.platform.bukkit.entity.NPCBukkitPlatformSelector;
44+
import eu.cloudnetservice.modules.npc.impl.platform.bukkit.util.BukkitPacketAdapterUtil;
4745
import eu.cloudnetservice.modules.npc.platform.PlatformSelectorEntity;
4846
import eu.cloudnetservice.wrapper.configuration.WrapperConfiguration;
4947
import jakarta.inject.Inject;
@@ -290,15 +288,6 @@ protected void startEmoteTask(boolean force) {
290288
}
291289

292290
protected @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> resolvePacketAdapter() {
293-
var bukkitVersion = this.server.getBukkitVersion();
294-
var parsedVersion = PEVersion.fromString(bukkitVersion.substring(0, bukkitVersion.indexOf("-")));
295-
var latestPEVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName());
296-
if (parsedVersion.isNewerThan(latestPEVersion)) {
297-
this.plugin.getLogger().info("NPCs using ProtocolLib for version " + bukkitVersion);
298-
return BukkitProtocolAdapter.protocolLib();
299-
}
300-
301-
this.plugin.getLogger().info("NPCs using PacketEvents for version " + bukkitVersion);
302-
return BukkitProtocolAdapter.packetEvents();
291+
return BukkitPacketAdapterUtil.resolve();
303292
}
304293
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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.MethodHandles;
25+
import java.lang.invoke.MethodType;
26+
import java.util.function.Supplier;
27+
import lombok.NonNull;
28+
import org.bukkit.Bukkit;
29+
import org.bukkit.Server;
30+
import org.bukkit.World;
31+
import org.bukkit.entity.Player;
32+
import org.bukkit.inventory.ItemStack;
33+
import org.bukkit.plugin.Plugin;
34+
import org.slf4j.Logger;
35+
import org.slf4j.LoggerFactory;
36+
37+
public final class BukkitPacketAdapterUtil {
38+
39+
private static final Logger LOGGER = LoggerFactory.getLogger(BukkitPacketAdapterUtil.class);
40+
41+
private static final String SYS_PROP_PACKET_ADAPTER = "cloudnet.npcs.packet-adapter";
42+
private static final Supplier<PlatformPacketAdapter<World, Player, ItemStack, Plugin>> PACKET_ADAPTER_HOLDER =
43+
StableValue.supplier(BukkitPacketAdapterUtil::resolveAdapter);
44+
45+
private BukkitPacketAdapterUtil() {
46+
throw new UnsupportedOperationException();
47+
}
48+
49+
/**
50+
* Resolves the packet adapter to use, either using a specific override or the Minecraft version of the server. This
51+
* method lazily initializes the version and always returns the same value after the first invocation.
52+
*
53+
* @return the npc packet adapter to use.
54+
*/
55+
public static @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> resolve() {
56+
return PACKET_ADAPTER_HOLDER.get();
57+
}
58+
59+
/**
60+
* Resolves the packet adapter to use, either using a specific override or the Minecraft version of the server.
61+
*
62+
* @return the npc packet adapter to use.
63+
*/
64+
private static @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> resolveAdapter() {
65+
var overriddenAdapterName = System.getProperty(SYS_PROP_PACKET_ADAPTER);
66+
return switch (StringUtil.toLower(overriddenAdapterName)) {
67+
case "protocollib" -> BukkitProtocolAdapter.protocolLib();
68+
case "packetevents" -> BukkitProtocolAdapter.packetEvents();
69+
case null, default -> evaluateAdapter();
70+
};
71+
}
72+
73+
/**
74+
* Evaluates the packet adapter to use based on the current Minecraft version running on the server. If no reliable
75+
* guess can be made, this method returns the {@code ProtocolLib} packet adapter implementation.
76+
*
77+
* @return the packet adapter to use based on the current Minecraft version running on the server.
78+
*/
79+
private static @NonNull PlatformPacketAdapter<World, Player, ItemStack, Plugin> evaluateAdapter() {
80+
try {
81+
var minecraftVersion = resolveMinecraftVersion();
82+
var parsedMinecraftVersion = PEVersion.fromString(minecraftVersion);
83+
var latestPeSupportedMinecraftVersion = PEVersion.fromString(ServerVersion.getLatest().getReleaseName());
84+
var packetEventsNotSupported = parsedMinecraftVersion.isNewerThan(latestPeSupportedMinecraftVersion);
85+
return packetEventsNotSupported ? BukkitProtocolAdapter.protocolLib() : BukkitProtocolAdapter.packetEvents();
86+
} catch (Exception exception) {
87+
LOGGER.warn(
88+
"Failed to reliably determine supported packet adapter ({}: {}), falling back to ProtocolLib",
89+
exception.getClass().getSimpleName(), exception.getMessage());
90+
return BukkitProtocolAdapter.protocolLib();
91+
}
92+
}
93+
94+
/**
95+
* Resolves the Minecraft version currently running on the server.
96+
*
97+
* @return the Minecraft version currently running on the server.
98+
* @throws RuntimeException if no reliable guess can be made about the running version.
99+
*/
100+
private static @NonNull String resolveMinecraftVersion() {
101+
try {
102+
var lookup = MethodHandles.publicLookup();
103+
var getMinecraftVersion = lookup.findVirtual(
104+
Server.class,
105+
"getMinecraftVersion",
106+
MethodType.methodType(String.class));
107+
return (String) getMinecraftVersion.invokeExact(Bukkit.getServer());
108+
} catch (Throwable _) {
109+
var bukkitVersion = Bukkit.getBukkitVersion();
110+
var maybeMinecraftVersion = bukkitVersion.split("-", 2)[0];
111+
if (maybeMinecraftVersion.indexOf('.') == -1) {
112+
var msg = String.format(
113+
"Failed to determine Minecraft version from '%s'. Use the system property '%s' to set a packet adapter",
114+
bukkitVersion, SYS_PROP_PACKET_ADAPTER);
115+
throw new RuntimeException(msg);
116+
}
117+
118+
return maybeMinecraftVersion;
119+
}
120+
}
121+
}

modules/storage-s3/impl/src/test/java/eu/cloudnetservice/modules/s3/S3TemplateStorageTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,21 @@
4141
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
4242
class S3TemplateStorageTest {
4343

44-
// default localstack port, maps all services to that port
45-
private static final int PORT = 4566;
44+
// default rustfs port
45+
private static final int PORT = 9000;
4646
private static final ServiceTemplate TEMPLATE = ServiceTemplate.builder()
4747
.prefix("global")
4848
.name("proxy")
4949
.storage("s3")
5050
.build();
5151

5252
@Container
53-
private static final GenericContainer<?> S3 = new GenericContainer<>("localstack/localstack:latest")
53+
private static final GenericContainer<?> S3 = new GenericContainer<>("rustfs/rustfs:latest")
5454
.withExposedPorts(PORT)
55-
.withEnv("SERVICES", "s3")
56-
.waitingFor(Wait.forLogMessage(".*Ready\\.\n", 1));
55+
.withEnv("RUSTFS_ACCESS_KEY", "accesskey")
56+
.withEnv("RUSTFS_SECRET_KEY", "secretkey")
57+
.withEnv("RUSTFS_ADDRESS", ":" + PORT)
58+
.waitingFor(Wait.forListeningPort());
5759

5860
private static S3TemplateStorage storage;
5961

0 commit comments

Comments
 (0)