From 86bcfee3205e49bf7e5d8a6322e1c3a00e780810 Mon Sep 17 00:00:00 2001 From: Aldin Date: Wed, 11 Dec 2024 21:11:05 +0100 Subject: [PATCH] feat: minecraft 1.21.4 (#1553) ### Motivation MC 1.21.4 was released a few days ago. We want to update our platforms to support it properly. ### Modification Updated downloads, packet events (for npcs) and minestom ### Result 1.21.4 is supported on Fabric, Bukkit, Velocity, Bungee and 1.21.3 on minestom --- .../MinestomPlatformPluginManager.java | 4 +-- gradle/libs.versions.toml | 6 ++--- .../minestom/MinestomBridgeManagement.java | 22 +++++++++++---- .../MinestomDirectPlayerExecutor.java | 5 +++- .../minestom/MinestomPermissionChecker.java | 27 +++++++++++++++++++ .../MinestomPlayerManagementListener.java | 21 ++++++++------- .../minestom/MinestomSignManagement.java | 20 +++++++++----- .../minestom/functionality/SignsCommand.java | 22 ++++++++------- node/src/main/resources/files/versions.json | 26 +++++++++++++++--- 9 files changed, 113 insertions(+), 40 deletions(-) create mode 100644 modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPermissionChecker.java diff --git a/ext/platform-inject-support/runtime/src/main/java/eu/cloudnetservice/ext/platforminject/runtime/platform/minestom/MinestomPlatformPluginManager.java b/ext/platform-inject-support/runtime/src/main/java/eu/cloudnetservice/ext/platforminject/runtime/platform/minestom/MinestomPlatformPluginManager.java index 919a09e2a7..e0688b53a0 100644 --- a/ext/platform-inject-support/runtime/src/main/java/eu/cloudnetservice/ext/platforminject/runtime/platform/minestom/MinestomPlatformPluginManager.java +++ b/ext/platform-inject-support/runtime/src/main/java/eu/cloudnetservice/ext/platforminject/runtime/platform/minestom/MinestomPlatformPluginManager.java @@ -41,7 +41,7 @@ import net.minestom.server.listener.manager.PacketListenerManager; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.PacketProcessor; +import net.minestom.server.network.packet.PacketParser; import net.minestom.server.recipe.RecipeManager; import net.minestom.server.scoreboard.TeamManager; import net.minestom.server.timer.SchedulerManager; @@ -61,10 +61,10 @@ public MinestomPlatformPluginManager() { layer.install(createFixedBinding(MinecraftServer.getTagManager(), TagManager.class)); layer.install(createFixedBinding(MinecraftServer.getTeamManager(), TeamManager.class)); layer.install(createFixedBinding(MinecraftServer.getBlockManager(), BlockManager.class)); + layer.install(createFixedBinding(MinecraftServer.getPacketParser(), PacketParser.class)); layer.install(createFixedBinding(MinecraftServer.getRecipeManager(), RecipeManager.class)); layer.install(createFixedBinding(MinecraftServer.getBossBarManager(), BossBarManager.class)); layer.install(createFixedBinding(MinecraftServer.getCommandManager(), CommandManager.class)); - layer.install(createFixedBinding(MinecraftServer.getPacketProcessor(), PacketProcessor.class)); layer.install(createFixedBinding(MinecraftServer.getInstanceManager(), InstanceManager.class)); layer.install(createFixedBinding(MinecraftServer.getExceptionManager(), ExceptionManager.class)); layer.install(createFixedBinding(MinecraftServer.getBenchmarkManager(), BenchmarkManager.class)); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0602811f38..9f576a7363 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -61,7 +61,7 @@ sponge = "9.0.0" velocity = "3.3.0-SNAPSHOT" waterdogpe = "1.2.4" nukkitX = "1.0-SNAPSHOT" -minestom = "0651c4e401" +minestom = "ccea53ac44" minestomExtensions = "1.2.0" spigot = "1.8.8-R0.1-SNAPSHOT" bungeecord = "1.21-R0.1-SNAPSHOT" @@ -72,13 +72,13 @@ vault = "1.7.1" adventure = "4.17.0" modlauncher = "8.1.3" npcLib = "3.0.0-beta10" -packetEvents = "2.6.0" +packetEvents = "2.7.0" placeholderApi = "2.11.6" adventure-serializer-bungee = "4.3.4" luckPermsApi = "5.4" # fabric platform special dependencies -minecraft = "1.21.3" +minecraft = "1.21.4" fabricLoader = "0.16.9" diff --git a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomBridgeManagement.java b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomBridgeManagement.java index f53f1a4a4d..271aacbafe 100644 --- a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomBridgeManagement.java +++ b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomBridgeManagement.java @@ -40,9 +40,11 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; import java.util.Collections; +import java.util.Objects; import java.util.Optional; import java.util.UUID; import java.util.function.BiFunction; +import java.util.function.Supplier; import lombok.NonNull; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandManager; @@ -57,11 +59,10 @@ @ProvidesFor(platform = "minestom", types = {PlatformBridgeManagement.class, BridgeManagement.class}) public final class MinestomBridgeManagement extends PlatformBridgeManagement { - private static final BiFunction PERM_FUNCTION = Player::hasPermission; - private final CommandManager commandManager; private final ConnectionManager connectionManager; private final PlayerExecutor directGlobalExecutor; + private final Supplier permissionChecker; @Inject public MinestomBridgeManagement( @@ -70,6 +71,7 @@ public MinestomBridgeManagement( @NonNull NetworkClient networkClient, @NonNull CommandManager commandManager, @NonNull GlobalEventHandler eventHandler, + @NonNull ServiceRegistry serviceRegistry, @NonNull ServiceTaskProvider taskProvider, @NonNull BridgeServiceHelper serviceHelper, @NonNull ConnectionManager connectionManager, @@ -89,7 +91,13 @@ public MinestomBridgeManagement( // init fields this.commandManager = commandManager; this.connectionManager = connectionManager; + + this.permissionChecker = () -> Objects.requireNonNullElse( + serviceRegistry.firstProvider(MinestomPermissionChecker.class), + ((player, _) -> player.getPermissionLevel() > 0)); + this.directGlobalExecutor = new MinestomDirectPlayerExecutor( + this.permissionChecker, commandManager, PlayerExecutor.GLOBAL_UNIQUE_ID, connectionManager::getOnlinePlayers); @@ -126,12 +134,15 @@ public void registerServices(@NonNull ServiceRegistry registry) { @Override public @NonNull BiFunction permissionFunction() { - return PERM_FUNCTION; + return this.permissionChecker.get()::hasPermission; } @Override public boolean isOnAnyFallbackInstance(@NonNull Player player) { - return this.isOnAnyFallbackInstance(this.ownNetworkServiceInfo.serverName(), null, player::hasPermission); + return this.isOnAnyFallbackInstance( + this.ownNetworkServiceInfo.serverName(), + null, + perm -> this.permissionFunction().apply(player, perm)); } @Override @@ -141,7 +152,7 @@ public boolean isOnAnyFallbackInstance(@NonNull Player player) { @Override public @NonNull Optional fallback(@NonNull Player player, @Nullable String currServer) { - return this.fallback(player.getUuid(), currServer, null, player::hasPermission); + return this.fallback(player.getUuid(), currServer, null, perm -> this.permissionFunction().apply(player, perm)); } @Override @@ -159,6 +170,7 @@ public void removeFallbackProfile(@NonNull Player player) { return uniqueId.equals(PlayerExecutor.GLOBAL_UNIQUE_ID) ? this.directGlobalExecutor : new MinestomDirectPlayerExecutor( + this.permissionChecker, this.commandManager, uniqueId, () -> Collections.singleton(this.connectionManager.getOnlinePlayerByUuid(uniqueId))); diff --git a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomDirectPlayerExecutor.java b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomDirectPlayerExecutor.java index c6edd60a31..7bc3cee8bf 100644 --- a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomDirectPlayerExecutor.java +++ b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomDirectPlayerExecutor.java @@ -30,14 +30,17 @@ final class MinestomDirectPlayerExecutor extends PlatformPlayerExecutorAdapter { + private final Supplier permissionChecker; private final CommandManager commandManager; public MinestomDirectPlayerExecutor( + @NonNull Supplier permissionChecker, @NonNull CommandManager commandManager, @NonNull UUID uniqueId, @NonNull Supplier> supplier ) { super(uniqueId, supplier); + this.permissionChecker = permissionChecker; this.commandManager = commandManager; } @@ -79,7 +82,7 @@ public void sendTitle(@NonNull Title title) { @Override public void sendChatMessage(@NonNull Component message, @Nullable String permission) { this.forEach(player -> { - if (permission == null || player.hasPermission(permission)) { + if (permission == null || this.permissionChecker.get().hasPermission(player, permission)) { player.sendMessage(message); } }); diff --git a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPermissionChecker.java b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPermissionChecker.java new file mode 100644 index 0000000000..750a5c2f39 --- /dev/null +++ b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPermissionChecker.java @@ -0,0 +1,27 @@ +/* + * Copyright 2019-2024 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.bridge.platform.minestom; + +import lombok.NonNull; +import net.minestom.server.entity.Player; + +@FunctionalInterface +public interface MinestomPermissionChecker { + + boolean hasPermission(@NonNull Player player, @NonNull String permission); + +} diff --git a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPlayerManagementListener.java b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPlayerManagementListener.java index e3edcbcdd6..71f86f604e 100644 --- a/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPlayerManagementListener.java +++ b/modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/minestom/MinestomPlayerManagementListener.java @@ -17,18 +17,14 @@ package eu.cloudnetservice.modules.bridge.platform.minestom; import eu.cloudnetservice.ext.component.ComponentFormats; -import eu.cloudnetservice.modules.bridge.platform.PlatformBridgeManagement; import eu.cloudnetservice.modules.bridge.platform.helper.ServerPlatformHelper; -import eu.cloudnetservice.modules.bridge.player.NetworkPlayerServerInfo; import eu.cloudnetservice.wrapper.holder.ServiceInfoHolder; import jakarta.inject.Inject; import jakarta.inject.Singleton; import lombok.NonNull; -import net.minestom.server.entity.Player; import net.minestom.server.event.EventFilter; import net.minestom.server.event.EventNode; import net.minestom.server.event.GlobalEventHandler; -import net.minestom.server.event.player.AsyncPlayerPreLoginEvent; import net.minestom.server.event.player.PlayerDisconnectEvent; import net.minestom.server.event.player.PlayerSpawnEvent; @@ -37,14 +33,14 @@ public final class MinestomPlayerManagementListener { private final ServiceInfoHolder serviceInfoHolder; private final ServerPlatformHelper serverPlatformHelper; - private final PlatformBridgeManagement management; + private final MinestomBridgeManagement management; @Inject public MinestomPlayerManagementListener( @NonNull GlobalEventHandler eventHandler, @NonNull ServiceInfoHolder serviceInfoHolder, @NonNull ServerPlatformHelper serverPlatformHelper, - @NonNull PlatformBridgeManagement management + @NonNull MinestomBridgeManagement management ) { this.serviceInfoHolder = serviceInfoHolder; this.serverPlatformHelper = serverPlatformHelper; @@ -52,18 +48,23 @@ public MinestomPlayerManagementListener( // listen on these events and redirect them into the methods var node = EventNode.type("cloudnet-bridge", EventFilter.PLAYER); eventHandler.addChild(node - .addListener(AsyncPlayerPreLoginEvent.class, this::handleLogin) + .addListener(PlayerSpawnEvent.class, this::handleLogin) .addListener(PlayerSpawnEvent.class, this::handleJoin) .addListener(PlayerDisconnectEvent.class, this::handleDisconnect)); } - private void handleLogin(@NonNull AsyncPlayerPreLoginEvent event) { + private void handleLogin(@NonNull PlayerSpawnEvent event) { + if (!event.isFirstSpawn()) { + return; + } + var player = event.getPlayer(); var task = this.management.selfTask(); + var permissionFunction = this.management.permissionFunction(); // check if the current task is present if (task != null) { // check if maintenance is activated - if (task.maintenance() && !player.hasPermission("cloudnet.bridge.maintenance")) { + if (task.maintenance() && !permissionFunction.apply(player, "cloudnet.bridge.maintenance")) { this.management.configuration().handleMessage( player.getLocale(), "server-join-cancel-because-maintenance", @@ -73,7 +74,7 @@ private void handleLogin(@NonNull AsyncPlayerPreLoginEvent event) { } // check if a custom permission is required to join var permission = task.propertyHolder().getString("requiredPermission"); - if (permission != null && !player.hasPermission(permission)) { + if (permission != null && !permissionFunction.apply(player, permission)) { this.management.configuration().handleMessage( player.getLocale(), "server-join-cancel-because-permission", diff --git a/modules/signs/src/main/java/eu/cloudnetservice/modules/signs/platform/minestom/MinestomSignManagement.java b/modules/signs/src/main/java/eu/cloudnetservice/modules/signs/platform/minestom/MinestomSignManagement.java index f97e0753d9..2561ade442 100644 --- a/modules/signs/src/main/java/eu/cloudnetservice/modules/signs/platform/minestom/MinestomSignManagement.java +++ b/modules/signs/src/main/java/eu/cloudnetservice/modules/signs/platform/minestom/MinestomSignManagement.java @@ -23,6 +23,7 @@ import eu.cloudnetservice.driver.registry.ServiceRegistry; import eu.cloudnetservice.ext.platforminject.api.stereotype.ProvidesFor; import eu.cloudnetservice.modules.bridge.WorldPosition; +import eu.cloudnetservice.modules.bridge.platform.minestom.MinestomBridgeManagement; import eu.cloudnetservice.modules.signs.Sign; import eu.cloudnetservice.modules.signs.SignManagement; import eu.cloudnetservice.modules.signs.platform.PlatformSign; @@ -51,6 +52,7 @@ public class MinestomSignManagement extends PlatformSignManagement - sender instanceof Player && sender.hasPermission("cloudnet.command.cloudsign"); - private final Argument template = new ArgumentString("templatePath") { @Override public @NonNull String parse(@NonNull CommandSender sender, @NonNull String input) throws ArgumentSyntaxException { @@ -61,25 +59,31 @@ public class SignsCommand extends Command { private final Argument targetGroup; private final Argument world; private final MinestomSignManagement signManagement; + private final MinestomBridgeManagement bridgeManagement; @Inject public SignsCommand( @NonNull MinestomSignManagement signManagement, - @NonNull GroupConfigurationProvider groupProvider + @NonNull GroupConfigurationProvider groupProvider, + @NonNull MinestomBridgeManagement bridgeManagement ) { super("cloudsign", "cs", "signs", "cloudsigns"); this.targetGroup = this.createTargetGroupArgument(groupProvider); + this.bridgeManagement = bridgeManagement; this.world = new ArgumentString("world"); this.signManagement = signManagement; var createLiteral = new ArgumentLiteral("create"); - this.addConditionalSyntax(DEFAULT_CONDITION, this::handleCreate, createLiteral, this.targetGroup, this.template); - this.addConditionalSyntax(DEFAULT_CONDITION, this::handleRemove, REMOVE_LITERAL); - this.addConditionalSyntax(DEFAULT_CONDITION, this::handleRemoveAll, REMOVE_ALL_LITERAL); - this.addConditionalSyntax(DEFAULT_CONDITION, this::handleCleanup, CLEANUP_LITERAL, this.world); - this.addConditionalSyntax(DEFAULT_CONDITION, this::handleCleanupAll, CLEANUP_ALL_LITERAL); + CommandCondition defaultCondition = (sender, _) -> sender instanceof Player player + && bridgeManagement.permissionFunction().apply(player, "cloudnet.command.cloudsign"); + + this.addConditionalSyntax(defaultCondition, this::handleCreate, createLiteral, this.targetGroup, this.template); + this.addConditionalSyntax(defaultCondition, this::handleRemove, REMOVE_LITERAL); + this.addConditionalSyntax(defaultCondition, this::handleRemoveAll, REMOVE_ALL_LITERAL); + this.addConditionalSyntax(defaultCondition, this::handleCleanup, CLEANUP_LITERAL, this.world); + this.addConditionalSyntax(defaultCondition, this::handleCleanupAll, CLEANUP_ALL_LITERAL); } private @NonNull ArgumentString createTargetGroupArgument(@NonNull GroupConfigurationProvider groupProvider) { diff --git a/node/src/main/resources/files/versions.json b/node/src/main/resources/files/versions.json index 8a088d15bd..b5071f27fe 100644 --- a/node/src/main/resources/files/versions.json +++ b/node/src/main/resources/files/versions.json @@ -88,6 +88,22 @@ ], "website": "https://papermc.io", "versions": [ + { + "name": "1.21.4", + "cacheFiles": false, + "properties": { + "copy": { + "cache/.*": "/", + "versions/.*": "/", + "paper\\.jar": "paper.jar" + }, + "jvmOptions": [ + "-Dpaperclip.patchonly=true" + ], + "fetchOverPaperApi": true, + "versionGroup": "1.21.4" + } + }, { "name": "1.21.3", "properties": { @@ -315,8 +331,8 @@ ], "versions": [ { - "name": "latest", - "url": "https://api.purpurmc.org/v2/purpur/1.21.3/latest/download", + "name": "1.21.4", + "url": "https://api.purpurmc.org/v2/purpur/1.21.4/latest/download", "cacheFiles": false, "properties": { "copy": { @@ -527,7 +543,7 @@ "website": "https://fabricmc.net", "versions": [ { - "name": "1.21.3", + "name": "1.21.4", "cacheFiles": false, "properties": { "copy": { @@ -729,6 +745,10 @@ "DOWNLOAD" ], "versions": [ + { + "name": "1.21.4", + "url": "https://ci.loohpjames.com/job/Limbo/47/artifact/target/Limbo-0.7.12-ALPHA-1.21.4.jar" + }, { "name": "1.21.3", "url": "https://ci.loohpjames.com/job/Limbo/47/artifact/target/Limbo-0.7.11-ALPHA-1.21.3.jar"