From bea9e6f1da159644fa33c9e63592b98abd32434d Mon Sep 17 00:00:00 2001 From: granny Date: Fri, 23 Aug 2024 02:36:32 -0700 Subject: [PATCH 01/11] =?UTF-8?q?it=20compiles=20=F0=9F=91=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- forge/build.gradle | 42 ---- .../forge/CloudForgeEntrypoint.java | 149 ------------ .../forge/ContextualArgumentTypeProvider.java | 114 --------- .../forge/ForgeClientCommandManager.java | 203 ---------------- .../forge/ForgeCommandContextKeys.java | 40 ---- .../forge/ForgeCommandManager.java | 104 --------- .../forge/ForgeCommandPreprocessor.java | 47 ---- .../ForgeCommandRegistrationHandler.java | 217 ------------------ .../commandframework/forge/ForgeExecutor.java | 201 ---------------- .../forge/ForgeServerCommandManager.java | 108 --------- .../java/net/pl3x/map/forge/ForgeNetwork.java | 127 ---------- .../forge/capability/HiddenCapability.java | 126 ---------- .../resources/META-INF/accesstransformer.cfg | 5 - gradle/libs.versions.toml | 10 +- neoforge/build.gradle.kts | 105 +++++++++ .../forge/NeoForgeServerAudiences.java | 6 +- .../net/pl3x/map/forge/NeoForgeNetwork.java | 116 ++++++++++ .../net/pl3x/map/forge/NeoForgePlayer.java | 27 ++- .../net/pl3x/map/forge/NeoForgeWorld.java | 8 +- .../net/pl3x/map/forge/Pl3xMapNeoForge.java | 82 +++---- .../forge/command/NeoForgeCommandManager.java | 31 ++- .../map/forge/command/NeoForgeParsers.java | 52 +++++ .../map/forge/command/NeoForgeSender.java | 14 +- .../common/network/ClientboundMapPayload.java | 62 +++++ .../network/ClientboundServerPayload.java | 44 ++++ .../common/network/ServerboundMapPayload.java | 30 +++ .../network/ServerboundServerPayload.java | 25 ++ .../resources/META-INF/accesstransformer.cfg | 3 + .../resources/META-INF/neoforge.mods.toml | 20 +- .../src/main/resources/pack.mcmeta | 0 .../src/main/resources/pl3xmap.png | Bin settings.gradle.kts | 4 +- 33 files changed, 557 insertions(+), 1567 deletions(-) delete mode 100644 forge/build.gradle delete mode 100644 forge/src/main/java/cloud/commandframework/forge/CloudForgeEntrypoint.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ContextualArgumentTypeProvider.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeClientCommandManager.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeCommandContextKeys.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeCommandManager.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeCommandPreprocessor.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeCommandRegistrationHandler.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeExecutor.java delete mode 100644 forge/src/main/java/cloud/commandframework/forge/ForgeServerCommandManager.java delete mode 100644 forge/src/main/java/net/pl3x/map/forge/ForgeNetwork.java delete mode 100644 forge/src/main/java/net/pl3x/map/forge/capability/HiddenCapability.java delete mode 100644 forge/src/main/resources/META-INF/accesstransformer.cfg create mode 100644 neoforge/build.gradle.kts rename forge/src/main/java/net/kyori/adventure/platform/forge/ForgeServerAudiences.java => neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java (95%) create mode 100644 neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java rename forge/src/main/java/net/pl3x/map/forge/ForgePlayer.java => neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java (86%) rename forge/src/main/java/net/pl3x/map/forge/ForgeWorld.java => neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java (95%) rename forge/src/main/java/net/pl3x/map/forge/Pl3xMapForge.java => neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java (79%) rename forge/src/main/java/net/pl3x/map/forge/command/ForgeCommandManager.java => neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java (65%) create mode 100644 neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java rename forge/src/main/java/net/pl3x/map/forge/command/ForgeSender.java => neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java (88%) create mode 100644 neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java create mode 100644 neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java create mode 100644 neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java create mode 100644 neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java create mode 100644 neoforge/src/main/resources/META-INF/accesstransformer.cfg rename forge/src/main/resources/META-INF/mods.toml => neoforge/src/main/resources/META-INF/neoforge.mods.toml (68%) rename {forge => neoforge}/src/main/resources/pack.mcmeta (100%) rename {forge => neoforge}/src/main/resources/pl3xmap.png (100%) diff --git a/build.gradle.kts b/build.gradle.kts index 093a6b30b..8ad6c93d0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,7 +54,7 @@ modrinth { // rootProject.layout.buildDirectory.file("libs/${rootProject.name}-${project.version}-sources.jar").get() //]) gameVersions.addAll(listOf(libs.versions.minecraft.get())) - loaders.addAll(listOf("bukkit", "fabric", /*"forge",*/ "paper", "purpur", "quilt", "spigot", "folia")) + loaders.addAll(listOf("bukkit", "fabric", "neoforge", "paper", "purpur", "quilt", "spigot", "folia")) changelog = System.getenv("COMMIT_MESSAGE") dependencies { required.project("fabric-api") diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index ef6a67e7e..000000000 --- a/forge/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id 'net.minecraftforge.gradle' version "$forgeGradleVersion" -} - -group = "${rootProject.group}.forge" -version = rootProject.version - -minecraft { - mappings channel: 'official', version: minecraftVersion - accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -dependencies { - compileOnly project(':core') - - minecraft "net.minecraftforge:forge:$forgeVersion" -} - -base { - archivesName = "${rootProject.name}-${project.name}" -} - -jar { - finalizedBy 'reobfJar' -} - -processResources { - filesMatching('META-INF/mods.toml') { - expand( - 'name': rootProject.name, - 'version': project.version, - 'authors': authors, - 'description': project.properties['description'], - 'website': website, - 'issues': issues, - 'forgeLoaderVersion': forgeLoaderVersion, - 'minecraftVersion': minecraftVersion, - ) - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/CloudForgeEntrypoint.java b/forge/src/main/java/cloud/commandframework/forge/CloudForgeEntrypoint.java deleted file mode 100644 index 33829701d..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/CloudForgeEntrypoint.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.Command; -import cloud.commandframework.CommandTree; -import cloud.commandframework.arguments.CommandArgument; -import cloud.commandframework.arguments.standard.StringArgument; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.permission.AndPermission; -import cloud.commandframework.permission.CommandPermission; -import cloud.commandframework.permission.OrPermission; -import cloud.commandframework.permission.Permission; -import cloud.commandframework.permission.PredicatePermission; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.server.permission.events.PermissionGatherEvent; -import net.minecraftforge.server.permission.nodes.PermissionDynamicContext; -import net.minecraftforge.server.permission.nodes.PermissionNode; -import net.minecraftforge.server.permission.nodes.PermissionTypes; -import org.checkerframework.checker.nullness.qual.Nullable; - -//@Mod("cloud") // there can be only one serverStartingCalled = true); - MinecraftForge.EVENT_BUS.addListener(EventPriority.LOW, CloudForgeEntrypoint::registerPermissions); - - if (Boolean.getBoolean("cloud.test_commands")) { - testServerManager(); - testClientManager(); - } - } - - public static boolean hasServerAlreadyStarted() { - return serverStartingCalled; - } - - private static void registerPermissions(final PermissionGatherEvent.Nodes event) { - event.addNodes(new PermissionNode<>( - "cloud", - "hover-stacktrace", - PermissionTypes.BOOLEAN, - CloudForgeEntrypoint::defaultPermissionHandler - )); - for (final ForgeCommandManager manager : ForgeServerCommandManager.INSTANCES) { - registerPermissionsForManager(event, manager); - } - } - - private static void registerPermissionsForManager(final PermissionGatherEvent.Nodes event, final ForgeCommandManager manager) { - final Set permissions = new HashSet<>(); - collectPermissions(permissions, manager.commandTree().getRootNodes()); - permissions.stream() - .filter(permissionString -> event.getNodes().stream().noneMatch(node -> node.getNodeName().equals(permissionString))) - .map(permissionString -> { - final int i = permissionString.indexOf("."); - return new PermissionNode<>( - permissionString.substring(0, i), - permissionString.substring(i + 1), - PermissionTypes.BOOLEAN, - CloudForgeEntrypoint::defaultPermissionHandler - ); - }) - .forEach(event::addNodes); - } - - private static void collectPermissions( - final Set permissions, - final Collection>> nodes - ) { - for (final CommandTree.Node> node : nodes) { - final @Nullable Command owningCommand = node.getValue().getOwningCommand(); - if (owningCommand != null) { - recurseCommandPermission(permissions, owningCommand.getCommandPermission()); - } - collectPermissions(permissions, node.getChildren()); - } - } - - private static void recurseCommandPermission(final Set permissions, final CommandPermission permission) { - if (permission instanceof PredicatePermission || permission == Permission.empty()) { - return; - } - if (permission instanceof OrPermission || permission instanceof AndPermission) { - for (final CommandPermission child : permission.getPermissions()) { - recurseCommandPermission(permissions, child); - } - } else if (permission instanceof Permission p) { - permissions.add(p.getPermission()); - } else { - throw new IllegalStateException(); - } - } - - private static Boolean defaultPermissionHandler(final @Nullable ServerPlayer player, final UUID uuid, final PermissionDynamicContext... contexts) { - return player != null && player.hasPermissions(player.server.getOperatorUserPermissionLevel()); - } - - private static void testClientManager() { - final ForgeClientCommandManager manager = ForgeClientCommandManager.createNative(CommandExecutionCoordinator.simpleCoordinator()); - manager.brigadierManager().setNativeNumberSuggestions(false); - manager.command(manager.commandBuilder("cloud_client") - .literal("forge") - .argument(StringArgument.greedy("string")) - .handler(ctx -> ctx.getSender().sendSystemMessage(Component.literal(ctx.get("string"))))); - } - - private static void testServerManager() { - final ForgeServerCommandManager manager = ForgeServerCommandManager.createNative(CommandExecutionCoordinator.simpleCoordinator()); - manager.brigadierManager().setNativeNumberSuggestions(false); - manager.command(manager.commandBuilder("cloud") - .literal("forge") - .argument(StringArgument.greedy("string")) - .permission("cloud.hello") - .handler(ctx -> ctx.getSender().sendSystemMessage(Component.literal(ctx.get("string"))))); - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ContextualArgumentTypeProvider.java b/forge/src/main/java/cloud/commandframework/forge/ContextualArgumentTypeProvider.java deleted file mode 100644 index 076eb6aa6..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ContextualArgumentTypeProvider.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import com.mojang.brigadier.arguments.ArgumentType; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.WeakHashMap; -import java.util.function.Function; -import java.util.function.Supplier; -import net.minecraft.commands.CommandBuildContext; - -//@ApiStatus.Internal -public final class ContextualArgumentTypeProvider implements Supplier> { - - private static final ThreadLocal CONTEXT = new ThreadLocal<>(); - private static final Map, Set>> INSTANCES = new WeakHashMap<>(); - - private final Function> provider; - private volatile ArgumentType provided; - - /** - * Temporarily expose a command build context to providers called from this thread. - * - * @param ctx the context - * @param commandManager command manager to use - * @param resetExisting whether to clear cached state from existing provider instances for this command type - * @param action an action to perform while the context is exposed - */ - public static void withBuildContext( - final ForgeCommandManager commandManager, - final CommandBuildContext ctx, - final boolean resetExisting, - final Runnable action - ) { - final ThreadLocalContext context = new ThreadLocalContext(commandManager, ctx); - CONTEXT.set(context); - - try { - if (resetExisting) { - synchronized (INSTANCES) { - for (final ContextualArgumentTypeProvider contextualArgumentTypeProvider : context.instances()) { - contextualArgumentTypeProvider.provided = null; - } - } - } - - action.run(); - } finally { - CONTEXT.remove(); - } - } - - private record ThreadLocalContext( - ForgeCommandManager commandManager, - CommandBuildContext commandBuildContext - ) { - private Set> instances() { - return INSTANCES.computeIfAbsent(this.commandManager, $ -> Collections.newSetFromMap(new WeakHashMap<>())); - } - } - - ContextualArgumentTypeProvider(final Function> provider) { - this.provider = provider; - } - - @Override - public ArgumentType get() { - final ThreadLocalContext ctx = CONTEXT.get(); - - if (ctx != null) { - synchronized (INSTANCES) { - ctx.instances().add(this); - } - } - - ArgumentType provided = this.provided; - if (provided == null) { - synchronized (this) { - if (this.provided == null) { - if (ctx == null) { - throw new IllegalStateException( - "No build context was available while trying to compute an argument type"); - } - provided = this.provider.apply(ctx.commandBuildContext); - this.provided = provided; - } - } - } - return provided; - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeClientCommandManager.java b/forge/src/main/java/cloud/commandframework/forge/ForgeClientCommandManager.java deleted file mode 100644 index 7fd21835d..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeClientCommandManager.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.CommandTree; -import cloud.commandframework.execution.AsynchronousCommandExecutionCoordinator; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.permission.PredicatePermission; -import java.util.function.Function; -import net.minecraft.client.Minecraft; -import net.minecraft.commands.CommandSource; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.Component; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.client.ClientCommandSourceStack; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.NotNull; - -/** - * A command manager for registering client-side commands. - * - *

All commands should be registered within mod initializers. Any registrations occurring after the first call to - * {@link net.minecraftforge.client.event.RegisterClientCommandsEvent} will be considered unsafe, and will only be permitted when the unsafe - * registration manager option is enabled.

- * - * @param the command sender type - */ -public final class ForgeClientCommandManager extends ForgeCommandManager { - - /** - * Create a command manager using native source types. - * - * @param execCoordinator Execution coordinator instance. - * @return a new command manager - * @see #ForgeClientCommandManager(Function, Function, Function) for a more thorough explanation - */ - public static ForgeClientCommandManager createNative( - final Function, CommandExecutionCoordinator> execCoordinator - ) { - return new ForgeClientCommandManager<>(execCoordinator, Function.identity(), Function.identity()); - } - - /** - * Create a new command manager instance. - * - * @param commandExecutionCoordinator Execution coordinator instance. The coordinator is in charge of executing incoming - * commands. Some considerations must be made when picking a suitable execution coordinator - * for your platform. For example, an entirely asynchronous coordinator is not suitable - * when the parsers used in that particular platform are not thread safe. If you have - * commands that perform blocking operations, however, it might not be a good idea to - * use a synchronous execution coordinator. In most cases you will want to pick between - * {@link CommandExecutionCoordinator#simpleCoordinator()} and - * {@link AsynchronousCommandExecutionCoordinator} - * @param commandSourceMapper Function that maps {@link CommandSourceStack} to the command sender type - * @param backwardsCommandSourceMapper Function that maps the command sender type to {@link CommandSourceStack} - */ - public ForgeClientCommandManager( - final Function, CommandExecutionCoordinator> commandExecutionCoordinator, - final Function commandSourceMapper, - final Function backwardsCommandSourceMapper - ) { - super( - commandExecutionCoordinator, - commandSourceMapper, - backwardsCommandSourceMapper, - new ForgeCommandRegistrationHandler.Client<>(), - () -> new ClientCommandSourceStack( - CommandSource.NULL, - Vec3.ZERO, - Vec2.ZERO, - 4, - "", - Component.empty(), - null - ) - ); - - this.registerParsers(); - } - - private void registerParsers() { - } - - /** - * Check if a sender has a certain permission. - * - *

The implementation for client commands always returns true.

- * - * @param sender Command sender - * @param permission Permission node - * @return whether the sender has the specified permission - */ - @Override - public boolean hasPermission(final @NotNull C sender, final @NotNull String permission) { - return true; - } - - /** - * Get a permission predicate which passes when the integrated server is running. - * - * @param sender type - * @return a predicate permission - */ - public static @NonNull PredicatePermission integratedServerRunning() { - return sender -> Minecraft.getInstance().hasSingleplayerServer(); - } - - /** - * Get a permission predicate which passes when the integrated server is not running. - * - * @param sender type - * @return a predicate permission - */ - public static @NonNull PredicatePermission integratedServerNotRunning() { - return sender -> !Minecraft.getInstance().hasSingleplayerServer(); - } - - /** - * Get a permission predicate which passes when cheats are enabled on the currently running integrated server. - * - *

This predicate will always pass if there is no integrated server running, i.e. when connected to a multiplayer server.

- * - * @param sender type - * @return a predicate permission - */ - public static @NonNull PredicatePermission cheatsAllowed() { - return cheatsAllowed(true); - } - - /** - * Get a permission predicate which passes when cheats are enabled on the currently running integrated server. - * - *

When there is no integrated server running, i.e. when connected to a multiplayer server, the predicate will - * fall back to the provided boolean argument.

- * - * @param allowOnMultiplayer whether the predicate should pass on multiplayer servers - * @param sender type - * @return a predicate permission - */ - public static @NonNull PredicatePermission cheatsAllowed(final boolean allowOnMultiplayer) { - return sender -> { - if (!Minecraft.getInstance().hasSingleplayerServer()) { - return allowOnMultiplayer; - } - return Minecraft.getInstance().getSingleplayerServer().getPlayerList().isAllowCheatsForAllPlayers() - || Minecraft.getInstance().getSingleplayerServer().getWorldData().getAllowCommands(); - }; - } - - /** - * Get a permission predicate which passes when cheats are disabled on the currently running integrated server. - * - *

This predicate will always pass if there is no integrated server running, i.e. when connected to a multiplayer server.

- * - * @param sender type - * @return a predicate permission - */ - public static @NonNull PredicatePermission cheatsDisallowed() { - return cheatsDisallowed(true); - } - - /** - * Get a permission predicate which passes when cheats are disabled on the currently running integrated server. - * - *

When there is no integrated server running, i.e. when connected to a multiplayer server, the predicate will - * fall back to the provided boolean argument.

- * - * @param allowOnMultiplayer whether the predicate should pass on multiplayer servers - * @param sender type - * @return a predicate permission - */ - public static @NonNull PredicatePermission cheatsDisallowed(final boolean allowOnMultiplayer) { - return sender -> { - if (!Minecraft.getInstance().hasSingleplayerServer()) { - return allowOnMultiplayer; - } - return !Minecraft.getInstance().getSingleplayerServer().getPlayerList().isAllowCheatsForAllPlayers() - && !Minecraft.getInstance().getSingleplayerServer().getWorldData().getAllowCommands(); - }; - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandContextKeys.java b/forge/src/main/java/cloud/commandframework/forge/ForgeCommandContextKeys.java deleted file mode 100644 index c5967eae5..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandContextKeys.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.keys.CloudKey; -import cloud.commandframework.keys.SimpleCloudKey; -import io.leangen.geantyref.TypeToken; -import net.minecraft.commands.CommandSourceStack; - -public final class ForgeCommandContextKeys { - - private ForgeCommandContextKeys() { - } - - public static final CloudKey NATIVE_COMMAND_SOURCE = SimpleCloudKey.of( - "cloud:forge_command_source", - TypeToken.get(CommandSourceStack.class) - ); -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandManager.java b/forge/src/main/java/cloud/commandframework/forge/ForgeCommandManager.java deleted file mode 100644 index 5b6103d12..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandManager.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.CommandManager; -import cloud.commandframework.CommandTree; -import cloud.commandframework.brigadier.BrigadierManagerHolder; -import cloud.commandframework.brigadier.CloudBrigadierManager; -import cloud.commandframework.context.CommandContext; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.execution.FilteringCommandSuggestionProcessor; -import cloud.commandframework.meta.CommandMeta; -import cloud.commandframework.meta.SimpleCommandMeta; -import java.util.Collections; -import java.util.Set; -import java.util.WeakHashMap; -import java.util.function.Function; -import java.util.function.Supplier; -import net.minecraft.commands.CommandSourceStack; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.framework.qual.DefaultQualifier; -import org.jetbrains.annotations.NotNull; - -@DefaultQualifier(NonNull.class) -public abstract class ForgeCommandManager - extends CommandManager implements BrigadierManagerHolder { - static final Set> INSTANCES = Collections.synchronizedSet(Collections.newSetFromMap(new WeakHashMap<>())); - - private final Function commandSourceMapper; - private final Function backwardsCommandSourceMapper; - private final CloudBrigadierManager brigadierManager; - - protected ForgeCommandManager( - final Function, CommandExecutionCoordinator> commandExecutionCoordinator, - final Function commandSourceMapper, - final Function backwardsCommandSourceMapper, - final ForgeCommandRegistrationHandler registrationHandler, - final Supplier dummyCommandSourceProvider - ) { - super(commandExecutionCoordinator, registrationHandler); - INSTANCES.add(this); - this.commandSourceMapper = commandSourceMapper; - this.backwardsCommandSourceMapper = backwardsCommandSourceMapper; - this.brigadierManager = new CloudBrigadierManager<>(this, () -> new CommandContext<>( - this.commandSourceMapper.apply(dummyCommandSourceProvider.get()), - this - )); - this.brigadierManager.backwardsBrigadierSenderMapper(this.backwardsCommandSourceMapper); - this.brigadierManager.brigadierSenderMapper(this.commandSourceMapper); - this.registerCommandPreProcessor(new ForgeCommandPreprocessor<>(this)); - this.commandSuggestionProcessor(new FilteringCommandSuggestionProcessor<>( - FilteringCommandSuggestionProcessor.Filter.startsWith(true).andTrimBeforeLastSpace() - )); - registrationHandler.initialize(this); - } - - Function backwardsCommandSourceMapper() { - return this.backwardsCommandSourceMapper; - } - - Function commandSourceMapper() { - return this.commandSourceMapper; - } - - @Override - public boolean hasPermission(final @NotNull C sender, final @NotNull String permission) { - return false; - } - - @Override - public final CommandMeta createDefaultCommandMeta() { - return SimpleCommandMeta.empty(); - } - - @Override - public CloudBrigadierManager brigadierManager() { - return this.brigadierManager; - } - - final void registrationCalled() { - this.lockRegistration(); - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandPreprocessor.java b/forge/src/main/java/cloud/commandframework/forge/ForgeCommandPreprocessor.java deleted file mode 100644 index b28e16db9..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandPreprocessor.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; -import cloud.commandframework.execution.preprocessor.CommandPreprocessor; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.framework.qual.DefaultQualifier; - -@DefaultQualifier(NonNull.class) -final class ForgeCommandPreprocessor implements CommandPreprocessor { - - private final ForgeCommandManager manager; - - ForgeCommandPreprocessor(final ForgeCommandManager manager) { - this.manager = manager; - } - - @Override - public void accept(final CommandPreprocessingContext context) { - context.getCommandContext().store( - ForgeCommandContextKeys.NATIVE_COMMAND_SOURCE, - this.manager.backwardsCommandSourceMapper().apply(context.getCommandContext().getSender()) - ); - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandRegistrationHandler.java b/forge/src/main/java/cloud/commandframework/forge/ForgeCommandRegistrationHandler.java deleted file mode 100644 index 921e76c6d..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeCommandRegistrationHandler.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.Command; -import cloud.commandframework.arguments.StaticArgument; -import cloud.commandframework.internal.CommandRegistrationHandler; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.tree.CommandNode; -import com.mojang.brigadier.tree.LiteralCommandNode; -import com.mojang.brigadier.tree.RootCommandNode; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.commands.CommandBuildContext; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraftforge.client.ClientCommandHandler; -import net.minecraftforge.client.event.ClientPlayerNetworkEvent; -import net.minecraftforge.client.event.RegisterClientCommandsEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.NonNull; - -/** - * A registration handler for Minecraft Forge. - * - *

Subtypes exist for client and server commands.

- * - * @param command sender type - */ -abstract class ForgeCommandRegistrationHandler implements CommandRegistrationHandler { - - private @MonotonicNonNull ForgeCommandManager commandManager; - - void initialize(final ForgeCommandManager manager) { - this.commandManager = manager; - } - - ForgeCommandManager commandManager() { - return this.commandManager; - } - - @SuppressWarnings("unchecked") - protected final void registerCommand(final Command command, final CommandDispatcher dispatcher) { - final RootCommandNode rootNode = dispatcher.getRoot(); - final StaticArgument first = ((StaticArgument) command.getArguments().get(0)); - final CommandNode baseNode = this.commandManager() - .brigadierManager() - .createLiteralCommandNode( - first.getName(), - command, - (src, perm) -> this.commandManager().hasPermission( - this.commandManager().commandSourceMapper().apply(src), - perm - ), - true, - new ForgeExecutor<>(this.commandManager()) - ); - - rootNode.addChild(baseNode); - - for (final String alias : first.getAlternativeAliases()) { - rootNode.addChild(buildRedirect(alias, baseNode)); - } - } - - /** - * Returns a literal node that redirects its execution to - * the given destination node. - * - *

This method is taken from MIT licensed code in the Velocity project, see - * - * Velocity's BrigadierUtils class

- * - * @param alias the command alias - * @param destination the destination node - * @param brig sender type - * @return the built node - */ - private static LiteralCommandNode buildRedirect( - final @NonNull String alias, - final @NonNull CommandNode destination - ) { - // Redirects only work for nodes with children, but break the top argument-less command. - // Manually adding the root command after setting the redirect doesn't fix it. - // (See https://github.com/Mojang/brigadier/issues/46) Manually clone the node instead. - final LiteralArgumentBuilder builder = LiteralArgumentBuilder - .literal(alias) - .requires(destination.getRequirement()) - .forward( - destination.getRedirect(), - destination.getRedirectModifier(), - destination.isFork() - ) - .executes(destination.getCommand()); - for (final CommandNode child : destination.getChildren()) { - builder.then(child); - } - return builder.build(); - } - - static class Client extends ForgeCommandRegistrationHandler { - - private final Set> registeredCommands = ConcurrentHashMap.newKeySet(); - private volatile boolean registerEventFired = false; - - @Override - void initialize(final ForgeCommandManager manager) { - super.initialize(manager); - MinecraftForge.EVENT_BUS.addListener(this::registerCommands); - MinecraftForge.EVENT_BUS.addListener((ClientPlayerNetworkEvent.LoggingOut event) -> this.registerEventFired = false); - } - - @Override - @SuppressWarnings("unchecked") - public boolean registerCommand(final @NonNull Command command) { - this.registeredCommands.add((Command) command); - if (this.registerEventFired) { - final ClientPacketListener connection = Minecraft.getInstance().getConnection(); - if (connection == null) { - throw new IllegalStateException("Expected connection to be present but it wasn't!"); - } - final CommandDispatcher dispatcher = ClientCommandHandler.getDispatcher(); - if (dispatcher == null) { - throw new IllegalStateException("Expected an active dispatcher!"); - } - ContextualArgumentTypeProvider.withBuildContext( - this.commandManager(), - CommandBuildContext.simple(connection.registryAccess(), connection.enabledFeatures()), - false, - () -> this.registerCommand((Command) command, dispatcher) - ); - } - return true; - } - - public void registerCommands(final RegisterClientCommandsEvent event) { - this.registerEventFired = true; - ContextualArgumentTypeProvider.withBuildContext( - this.commandManager(), - event.getBuildContext(), - true, - () -> { - for (final Command command : this.registeredCommands) { - this.registerCommand(command, event.getDispatcher()); - } - } - ); - } - } - - static class Server extends ForgeCommandRegistrationHandler { - - private final Set> registeredCommands = ConcurrentHashMap.newKeySet(); - - @Override - void initialize(final ForgeCommandManager manager) { - super.initialize(manager); - MinecraftForge.EVENT_BUS.addListener(this::registerAllCommands); - } - - @Override - @SuppressWarnings("unchecked") - public boolean registerCommand(@NonNull final Command command) { - return this.registeredCommands.add((Command) command); - } - - private void registerAllCommands(final RegisterCommandsEvent event) { - this.commandManager().registrationCalled(); - ContextualArgumentTypeProvider.withBuildContext( - this.commandManager(), - event.getBuildContext(), - true, - () -> { - for (final Command command : this.registeredCommands) { - /* Only register commands in the declared environment */ - final Commands.CommandSelection env = command.getCommandMeta().getOrDefault( - ForgeServerCommandManager.META_REGISTRATION_ENVIRONMENT, - Commands.CommandSelection.ALL - ); - - if ((env == Commands.CommandSelection.INTEGRATED && !event.getCommandSelection().includeIntegrated) - || (env == Commands.CommandSelection.DEDICATED && !event.getCommandSelection().includeDedicated)) { - continue; - } - this.registerCommand(command, event.getDispatcher()); - } - } - ); - } - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeExecutor.java b/forge/src/main/java/cloud/commandframework/forge/ForgeExecutor.java deleted file mode 100644 index 798303103..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeExecutor.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.exceptions.ArgumentParseException; -import cloud.commandframework.exceptions.CommandExecutionException; -import cloud.commandframework.exceptions.InvalidCommandSenderException; -import cloud.commandframework.exceptions.InvalidSyntaxException; -import cloud.commandframework.exceptions.NoPermissionException; -import cloud.commandframework.exceptions.NoSuchCommandException; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.logging.LogUtils; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.concurrent.CompletionException; -import java.util.function.BiConsumer; -import java.util.function.Function; -import net.minecraft.ChatFormatting; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.ClickEvent; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.MutableComponent; -import org.slf4j.Logger; - -final class ForgeExecutor implements Command { - - private static final Logger LOGGER = LogUtils.getLogger(); - - private static final Component NEWLINE = Component.literal("\n"); - private static final String MESSAGE_INTERNAL_ERROR = "An internal error occurred while attempting to perform this command."; - private static final String MESSAGE_NO_PERMS = - "I'm sorry, but you do not have permission to perform this command. " - + "Please contact the server administrators if you believe that this is in error."; - private static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command. Type \"/help\" for help."; - - private final ForgeCommandManager manager; - private final Function getName; - private final BiConsumer sendError; - - ForgeExecutor( - final ForgeCommandManager manager - ) { - this(manager, CommandSourceStack::getTextName, CommandSourceStack::sendFailure); - } - - ForgeExecutor( - final ForgeCommandManager manager, - final Function getName, - final BiConsumer sendError - ) { - this.manager = manager; - this.getName = getName; - this.sendError = sendError; - } - - @Override - public int run(final CommandContext ctx) { - final CommandSourceStack source = ctx.getSource(); - final String input = ctx.getInput().substring(ctx.getLastChild().getNodes().get(0).getRange().getStart()); - final C sender = this.manager.commandSourceMapper().apply(source); - - this.manager.executeCommand(sender, input).whenComplete((result, throwable) -> { - if (throwable == null) { - return; - } - if (throwable instanceof CompletionException) { - throwable = throwable.getCause(); - } - this.handleThrowable(source, sender, throwable); - }); - return Command.SINGLE_SUCCESS; - } - - private void handleThrowable(final CommandSourceStack source, final C sender, final Throwable throwable) { - if (throwable instanceof InvalidSyntaxException) { - this.manager.handleException( - sender, - InvalidSyntaxException.class, - (InvalidSyntaxException) throwable, - (c, e) -> this.sendError.accept( - source, - Component.literal("Invalid Command Syntax. Correct command syntax is: ") - .append(Component.literal(String.format("/%s", e.getCorrectSyntax())) - .withStyle(style -> style.withColor(ChatFormatting.GRAY))) - ) - ); - } else if (throwable instanceof InvalidCommandSenderException) { - this.manager.handleException( - sender, - InvalidCommandSenderException.class, - (InvalidCommandSenderException) throwable, - (c, e) -> this.sendError.accept(source, Component.literal(throwable.getMessage())) - ); - } else if (throwable instanceof NoPermissionException) { - this.manager.handleException( - sender, - NoPermissionException.class, - (NoPermissionException) throwable, - (c, e) -> this.sendError.accept(source, Component.literal(MESSAGE_NO_PERMS)) - ); - } else if (throwable instanceof NoSuchCommandException) { - this.manager.handleException( - sender, - NoSuchCommandException.class, - (NoSuchCommandException) throwable, - (c, e) -> this.sendError.accept(source, Component.literal(MESSAGE_UNKNOWN_COMMAND)) - ); - } else if (throwable instanceof ArgumentParseException) { - this.manager.handleException( - sender, - ArgumentParseException.class, - (ArgumentParseException) throwable, - (c, e) -> { - if (throwable.getCause() instanceof CommandSyntaxException) { - this.sendError.accept(source, Component.literal("Invalid Command Argument: ") - .append(Component.literal("") - .append(ComponentUtils - .fromMessage(((CommandSyntaxException) throwable.getCause()).getRawMessage())) - .withStyle(ChatFormatting.GRAY))); - } else { - this.sendError.accept(source, Component.literal("Invalid Command Argument: ") - .append(Component.literal(throwable.getCause().getMessage()) - .withStyle(ChatFormatting.GRAY))); - } - } - ); - } else if (throwable instanceof CommandExecutionException) { - this.manager.handleException( - sender, - CommandExecutionException.class, - (CommandExecutionException) throwable, - (c, e) -> { - this.sendError.accept(source, this.decorateHoverStacktrace( - Component.literal(MESSAGE_INTERNAL_ERROR), - throwable.getCause(), - sender - )); - LOGGER.warn( - "Error occurred while executing command for user {}:", - this.getName.apply(source), - throwable - ); - } - ); - } else { - this.sendError.accept(source, this.decorateHoverStacktrace( - Component.literal(MESSAGE_INTERNAL_ERROR), - throwable, - sender - )); - LOGGER.warn("Error occurred while executing command for user {}:", this.getName.apply(source), throwable); - } - } - - private MutableComponent decorateHoverStacktrace(final MutableComponent input, final Throwable cause, final C sender) { - if (!this.manager.hasPermission(sender, "cloud.hover-stacktrace")) { - return input; - } - - final StringWriter writer = new StringWriter(); - cause.printStackTrace(new PrintWriter(writer)); - final String stackTrace = writer.toString().replace("\t", " "); - return input.withStyle(style -> style - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Component.literal(stackTrace) - .append(NEWLINE) - .append(Component.literal(" Click to copy") - .withStyle(s2 -> s2.withColor(ChatFormatting.GRAY).withItalic(true))) - )) - .withClickEvent(new ClickEvent( - ClickEvent.Action.COPY_TO_CLIPBOARD, - stackTrace - ))); - } -} diff --git a/forge/src/main/java/cloud/commandframework/forge/ForgeServerCommandManager.java b/forge/src/main/java/cloud/commandframework/forge/ForgeServerCommandManager.java deleted file mode 100644 index c204d94fb..000000000 --- a/forge/src/main/java/cloud/commandframework/forge/ForgeServerCommandManager.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2023 Cloud Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package cloud.commandframework.forge; - -import cloud.commandframework.CommandTree; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.meta.CommandMeta; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import java.util.concurrent.ExecutionException; -import java.util.function.Function; -import net.minecraft.commands.CommandSource; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.network.chat.Component; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; -import net.minecraftforge.server.permission.PermissionAPI; -import net.minecraftforge.server.permission.nodes.PermissionNode; -import net.minecraftforge.server.permission.nodes.PermissionTypes; -import org.jetbrains.annotations.NotNull; - -public final class ForgeServerCommandManager extends ForgeCommandManager { - - public static final CommandMeta.Key META_REGISTRATION_ENVIRONMENT = CommandMeta.Key.of( - Commands.CommandSelection.class, - "cloud:registration-environment" - ); - - private final Cache> permissionNodeCache = CacheBuilder.newBuilder().maximumSize(100).build(); - - public static ForgeServerCommandManager createNative( - final Function, - CommandExecutionCoordinator> execCoordinator - ) { - return new ForgeServerCommandManager<>(execCoordinator, Function.identity(), Function.identity()); - } - - public ForgeServerCommandManager( - final Function, - CommandExecutionCoordinator> commandExecutionCoordinator, - final Function commandSourceMapper, - final Function backwardsCommandSourceMapper - ) { - super( - commandExecutionCoordinator, - commandSourceMapper, - backwardsCommandSourceMapper, - new ForgeCommandRegistrationHandler.Server<>(), - () -> new CommandSourceStack( - CommandSource.NULL, - Vec3.ZERO, - Vec2.ZERO, - null, - 4, - "", - Component.empty(), - null, - null - ) - ); - - if (CloudForgeEntrypoint.hasServerAlreadyStarted()) { - throw new IllegalStateException("ForgeServerCommandManager was created too late! Because command registration " - + "occurs before the server instance is created, commands should be registered in mod initializers."); - } - } - - @SuppressWarnings("unchecked") - @Override - public boolean hasPermission(final @NotNull C sender, final @NotNull String permission) { - final CommandSourceStack source = this.backwardsCommandSourceMapper().apply(sender); - if (source.isPlayer()) { - final PermissionNode node; - try { - node = this.permissionNodeCache.get(permission, () -> (PermissionNode) PermissionAPI.getRegisteredNodes().stream() - .filter(n -> n.getNodeName().equals(permission) && n.getType() == PermissionTypes.BOOLEAN) - .findFirst() - .orElseThrow(() -> new IllegalStateException("Could not find registered node for permission " + permission))); - } catch (final ExecutionException e) { - throw new RuntimeException("Exception location permission node", e); - } - return PermissionAPI.getPermission(source.getPlayer(), node); - } - return source.hasPermission(source.getServer().getOperatorUserPermissionLevel()); - } -} diff --git a/forge/src/main/java/net/pl3x/map/forge/ForgeNetwork.java b/forge/src/main/java/net/pl3x/map/forge/ForgeNetwork.java deleted file mode 100644 index cdaa6ac64..000000000 --- a/forge/src/main/java/net/pl3x/map/forge/ForgeNetwork.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-2023 William Blake Galbreath - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package net.pl3x.map.forge; - -import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteArrayDataOutput; -import io.netty.buffer.Unpooled; -import java.util.function.Consumer; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.MapItem; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.event.EventNetworkChannel; -import net.pl3x.map.core.network.Constants; -import net.pl3x.map.core.network.Network; - -public class ForgeNetwork extends Network { - private final Pl3xMapForge mod; - private final ResourceLocation channel; - private final EventNetworkChannel network; - - private Consumer listener; - - public ForgeNetwork(Pl3xMapForge mod) { - this.mod = mod; - this.channel = new ResourceLocation(Network.CHANNEL); - - String protocol = String.valueOf(Constants.PROTOCOL); - this.network = NetworkRegistry.newEventChannel(this.channel, () -> protocol, v -> true, v -> true); - } - - @Override - public void register() { - this.listener = (NetworkEvent.ClientCustomPayloadEvent event) -> { - ServerPlayer player = event.getSource().get().getSender(); - if (player == null) { - return; - } - event.getSource().get().setPacketHandled(true); - ByteArrayDataInput in = in(event.getPayload().accessByteBufWithCorrectSize()); - int action = in.readInt(); - switch (action) { - case Constants.SERVER_DATA -> sendServerData(player); - case Constants.MAP_DATA -> sendMapData(player, in.readInt()); - } - }; - - - this.network.addListener(this.listener); - } - - @Override - public void unregister() { - this.network.unregisterObject(this.listener); - } - - @Override - protected void sendMapData(T player, int id) { - ByteArrayDataOutput out = out(); - - out.writeInt(Constants.PROTOCOL); - out.writeInt(Constants.MAP_DATA); - out.writeInt(Constants.RESPONSE_SUCCESS); - - MinecraftServer server = this.mod.getServer(); - if (server == null) { - return; - } - - @SuppressWarnings("DataFlowIssue") - MapItemSavedData map = MapItem.getSavedData(id, server.getLevel(Level.OVERWORLD)); - if (map == null) { - out.writeInt(Constants.ERROR_NO_SUCH_MAP); - out.writeInt(id); - return; - } - - ServerLevel level = this.mod.getServer().getLevel(map.dimension); - if (level == null) { - out.writeInt(Constants.ERROR_NO_SUCH_WORLD); - out.writeInt(id); - return; - } - - out.writeInt(id); - out.writeByte(map.scale); - out.writeInt(map.centerX); - out.writeInt(map.centerZ); - out.writeUTF(level.dimension().location().toString()); - - send(player, out); - } - - @Override - protected void send(T player, ByteArrayDataOutput out) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.wrappedBuffer(out.toByteArray())); - ((ServerPlayer) player).connection.send(new ClientboundCustomPayloadPacket(this.channel, byteBuf)); - } -} diff --git a/forge/src/main/java/net/pl3x/map/forge/capability/HiddenCapability.java b/forge/src/main/java/net/pl3x/map/forge/capability/HiddenCapability.java deleted file mode 100644 index f49eb1e2c..000000000 --- a/forge/src/main/java/net/pl3x/map/forge/capability/HiddenCapability.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-2023 William Blake Galbreath - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package net.pl3x.map.forge.capability; - -import net.minecraft.core.Direction; -import net.minecraft.nbt.ByteTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.AutoRegisterCapability; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.common.capabilities.CapabilityToken; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.pl3x.map.core.Pl3xMap; -import net.pl3x.map.core.player.PlayerRegistry; -import net.pl3x.map.forge.ForgePlayer; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -@AutoRegisterCapability -public class HiddenCapability { - private static final ResourceLocation KEY = new ResourceLocation("pl3xmap", "hidden"); - private static final Capability<@NotNull HiddenCapability> CAPABILITY = CapabilityManager.get(new HiddenCapability.Token()); - - public static @NotNull LazyOptional<@NotNull HiddenCapability> get(@NotNull ServerPlayer player) { - return player.getCapability(CAPABILITY); - } - - private boolean hidden; - - public boolean isHidden() { - return this.hidden; - } - - public void setHidden(boolean hidden) { - this.hidden = hidden; - } - - @SubscribeEvent - public void onAttachCapabilitiesEvent(@NotNull AttachCapabilitiesEvent<@NotNull Entity> event) { - if (event.getObject() instanceof ServerPlayer) { - event.addCapability(HiddenCapability.KEY, new HiddenCapability.Provider()); - } - } - - @SubscribeEvent - public void onPlayerCloneEvent(PlayerEvent.@NotNull Clone event) { - if (!(event.getEntity() instanceof ServerPlayer newPlayer)) { - return; - } - if (!(event.getOriginal() instanceof ServerPlayer oldPlayer)) { - return; - } - - PlayerRegistry registry = Pl3xMap.api().getPlayerRegistry(); - registry.unregister(oldPlayer.getUUID()); - - oldPlayer.reviveCaps(); - get(oldPlayer).ifPresent(oldCap -> - get(newPlayer).ifPresent(newCap -> - newCap.setHidden(oldCap.isHidden()) - ) - ); - oldPlayer.invalidateCaps(); - - registry.getOrDefault(newPlayer.getUUID(), () -> new ForgePlayer(newPlayer)); - } - - public static class Provider implements ICapabilityProvider, INBTSerializable { - private final LazyOptional<@NotNull HiddenCapability> supplier = LazyOptional.of(this::getOrCreate); - - private HiddenCapability capability; - - private @NotNull HiddenCapability getOrCreate() { - if (this.capability == null) { - this.capability = new HiddenCapability(); - } - return this.capability; - } - - @Override - public @NotNull LazyOptional<@NotNull T> getCapability(@NotNull Capability<@NotNull T> cap, @Nullable Direction facing) { - return CAPABILITY.orEmpty(cap, this.supplier); - } - - @Override - public @NotNull ByteTag serializeNBT() { - return ByteTag.valueOf(getOrCreate().isHidden()); - } - - @Override - public void deserializeNBT(@NotNull ByteTag nbt) { - getOrCreate().setHidden(nbt.getAsByte() != (byte) 0); - } - } - - private static class Token extends CapabilityToken<@NotNull HiddenCapability> { - } -} diff --git a/forge/src/main/resources/META-INF/accesstransformer.cfg b/forge/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index 50f5397ae..000000000 --- a/forge/src/main/resources/META-INF/accesstransformer.cfg +++ /dev/null @@ -1,5 +0,0 @@ -public net.minecraft.commands.Commands$CommandSelection f_82144_ -public net.minecraft.commands.Commands$CommandSelection f_82145_ -public net.minecraft.world.level.biome.Biome$ClimateSettings -#public net.minecraft.world.level.biome.Biome f_47437_ #climateSettings #this throws errors at startup for some reason.. used reflection instead -public net.minecraft.world.level.storage.DimensionDataStorage f_78146_ #dataFolder diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fb4e4c056..8408d5acc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,9 +7,9 @@ fabricApi="0.102.1+1.21.1" fabricLoader="0.16.2" fabricLoom="1.7-SNAPSHOT" -#forge="1.20.2-48.0.6" -#forgeGradle="[6.0,6.2)" -#forgeLoader="[48,)" +neoforge="21.1.23" +neoGradle="7.0.145" +neoforgeLoader="[20.5,)" minotaur="2.+" # https://github.com/modrinth/minotaur paperweight="1.7.2" # https://github.com/PaperMC/Paperweight @@ -45,6 +45,7 @@ shadow = { id = "com.gradleup.shadow", version.ref = "shadowJar" } fabric-loom = { id = "fabric-loom", version.ref = "fabricLoom" } indra-git = { id = "net.kyori.indra.git", version.ref = "indra-git" } paperweight-userdev = { id = "io.papermc.paperweight.userdev", version.ref = "paperweight" } +neoforged-userdev = { id = "net.neoforged.gradle.userdev", version.ref = "neoGradle" } [libraries] @@ -59,11 +60,14 @@ undertow = { group = "io.undertow", name = "undertow-core", version.ref = "under fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabricLoader" } fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabricApi" } +neoforge-loader = { group = "net.neoforged", name = "neoforge", version.ref = "neoforge" } + cloudCore = { group = "org.incendo", name = "cloud-core", version.ref = "cloud" } cloudBrigadier = { group = "org.incendo", name = "cloud-brigadier", version.ref = "cloud-minecraft" } cloudPaper = { group = "org.incendo", name = "cloud-paper", version.ref = "cloud-minecraft" } cloudMinecraftExtras = { group = "org.incendo", name = "cloud-minecraft-extras", version.ref = "cloud-minecraft" } cloudFabric = { group = "org.incendo", name = "cloud-fabric", version.ref = "cloud-minecraft-modded" } +cloudNeoforge = { group = "org.incendo", name = "cloud-neoforge", version.ref = "cloud-minecraft-modded" } cloudProcessorsConfirmation = { group = "org.incendo", name = "cloud-processors-confirmation", version.ref = "cloud-processors" } adventureApi = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts new file mode 100644 index 000000000..2f8d60b0b --- /dev/null +++ b/neoforge/build.gradle.kts @@ -0,0 +1,105 @@ +plugins { + alias(libs.plugins.neoforged.userdev) + alias(libs.plugins.shadow) +} + +val buildNum = System.getenv("NEXT_BUILD_NUMBER") ?: "SNAPSHOT" +project.version = "${libs.versions.minecraft.get()}-$buildNum" +project.group = "net.pl3x.map.neoforge" + +base { + archivesName = "${rootProject.name}-${project.name}" +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(21)) + } +} + +repositories { + maven("https://oss.sonatype.org/content/repositories/snapshots/") { + name = "sonatype-snapshots" + mavenContent { + snapshotsOnly() + } + } + maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") { + name = "s01-sonatype-snapshots" + mavenContent { + snapshotsOnly() + } + } + maven("https://maven.fabricmc.net/") + maven("https://jitpack.io") +} + +dependencies { + implementation(libs.neoforge.loader) + implementation(project(path = ":core", configuration = "shadow")) + implementation("net.kyori:adventure-text-serializer-gson:4.17.0") + + implementation(libs.cloudNeoforge) + jarJar(libs.cloudNeoforge) +} + +jarJar.enable() + +minecraft { + accessTransformers { + files("src/main/resources/META-INF/accesstransformer.cfg") + } +} + +tasks { + assemble { + dependsOn(shadowJar) + } + + // needed for below jank + compileJava { + dependsOn(":core:jar") + } + + shadowJar { + mergeServiceFiles() + + dependencies { + include(project(":core")) + } + + // this is janky, but it works + manifest { + from(project(":core").tasks.named("shadowJar").get().manifest) + } + } + + build { + dependsOn(jarJar) + } + + sourceSets { + main { + resources { + srcDirs("src/generated/resources") + } + } + } + + processResources { + inputs.properties(mapOf( + "name" to rootProject.name, + "version" to project.version, + "authors" to project.properties["authors"], + "description" to rootProject.properties["description"], + "website" to rootProject.properties["website"], + "issues" to rootProject.properties["issues"], + "minecraftVersion" to libs.versions.minecraft.get(), + "neoforgeLoaderVersion" to libs.versions.neoforgeLoader.get(), + )) + + filesMatching("META-INF/neoforge.mods.toml") { + expand(inputs.properties) + } + } +} diff --git a/forge/src/main/java/net/kyori/adventure/platform/forge/ForgeServerAudiences.java b/neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java similarity index 95% rename from forge/src/main/java/net/kyori/adventure/platform/forge/ForgeServerAudiences.java rename to neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java index 760b8e51b..a855b3ec9 100644 --- a/forge/src/main/java/net/kyori/adventure/platform/forge/ForgeServerAudiences.java +++ b/neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java @@ -42,16 +42,16 @@ import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.NotNull; -public class ForgeServerAudiences implements AudienceProvider { +public class NeoForgeServerAudiences implements AudienceProvider { private final MinecraftServer server; - public ForgeServerAudiences(@NotNull MinecraftServer server) { + public NeoForgeServerAudiences(@NotNull MinecraftServer server) { this.server = server; } private net.minecraft.network.chat.@NotNull Component toNative(@NotNull Component component) { JsonElement tree = GsonComponentSerializer.gson().serializeToTree(component); - return Objects.requireNonNull(net.minecraft.network.chat.Component.Serializer.fromJson(tree)); + return Objects.requireNonNull(net.minecraft.network.chat.Component.Serializer.fromJson(tree, server.registryAccess())); } public @NotNull Audience audience(@NotNull CommandSource source) { diff --git a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java b/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java new file mode 100644 index 000000000..c275649ee --- /dev/null +++ b/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java @@ -0,0 +1,116 @@ +/* + * MIT License + * + * Copyright (c) 2020-2023 William Blake Galbreath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.pl3x.map.forge; + +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.maps.MapId; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.handling.IPayloadHandler; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; +import net.pl3x.map.core.configuration.Config; +import net.pl3x.map.core.network.Constants; +import net.pl3x.map.core.network.Network; +import net.pl3x.map.forge.common.network.ClientboundMapPayload; +import net.pl3x.map.forge.common.network.ClientboundServerPayload; +import net.pl3x.map.forge.common.network.ServerboundMapPayload; +import net.pl3x.map.forge.common.network.ServerboundServerPayload; + +public class NeoForgeNetwork extends Network { + public static IPayloadHandler NOOP_HANDLER = (payload, context) -> {}; + + private final Pl3xMapNeoForge mod; + + public NeoForgeNetwork(Pl3xMapNeoForge mod) { + this.mod = mod; + } + + @Override + public void register() { + new PayloadRegistrar(Constants.MODID) + .playToServer(ServerboundServerPayload.TYPE, ServerboundServerPayload.STREAM_CODEC, (payload, context) -> { + if (!(context.player() instanceof ServerPlayer serverPlayer)) { + return; // not a server player + } + + PacketDistributor.sendToPlayer(serverPlayer, new ClientboundServerPayload(Constants.PROTOCOL, Constants.RESPONSE_SUCCESS, Config.WEB_ADDRESS)); + }) + .playToClient(ClientboundServerPayload.TYPE, ClientboundServerPayload.STREAM_CODEC, NeoForgeNetwork.NOOP_HANDLER::handle) + .playToServer(ServerboundMapPayload.TYPE, ServerboundMapPayload.STREAM_CODEC, (payload, context) -> { + + }) + .playToClient(ClientboundMapPayload.TYPE, ClientboundMapPayload.STREAM_CODEC, NeoForgeNetwork.NOOP_HANDLER::handle); + } + + @Override + public void unregister() { + // do nothing ig + } + + @Override + protected void sendServerData(T player) { + + } + + @Override + protected void sendMapData(T player, int id) { + + } + + @Override + protected void send(T player, ByteArrayDataOutput out) { + + } + + protected void sendMapData(ServerPlayer player, int id) { + MinecraftServer server = this.mod.getServer(); + if (server == null) { + return; + } + + @SuppressWarnings("DataFlowIssue") + MapItemSavedData map = MapItem.getSavedData(new MapId(id), server.getLevel(Level.OVERWORLD)); + if (map == null) { + PacketDistributor.sendToPlayer(player, new ClientboundMapPayload(Constants.PROTOCOL, Constants.ERROR_NO_SUCH_MAP, id)); + return; + } + + ServerLevel level = this.mod.getServer().getLevel(map.dimension); + if (level == null) { + PacketDistributor.sendToPlayer(player, new ClientboundMapPayload(Constants.PROTOCOL, Constants.ERROR_NO_SUCH_WORLD, id)); + return; + } + + PacketDistributor.sendToPlayer(player, new ClientboundMapPayload( + Constants.PROTOCOL, Constants.RESPONSE_SUCCESS, id, + map.scale, map.centerX, map.centerZ, level.dimension().location().toString().replace(":", "-") + )); + } +} diff --git a/forge/src/main/java/net/pl3x/map/forge/ForgePlayer.java b/neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java similarity index 86% rename from forge/src/main/java/net/pl3x/map/forge/ForgePlayer.java rename to neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java index 72c5991cd..b815c5091 100644 --- a/forge/src/main/java/net/pl3x/map/forge/ForgePlayer.java +++ b/neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java @@ -27,26 +27,36 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.authlib.properties.Property; +import com.mojang.serialization.Codec; import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.UUID; +import java.util.function.Supplier; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.attachment.AttachmentType; import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.markers.Point; import net.pl3x.map.core.player.Player; import net.pl3x.map.core.world.World; -import net.pl3x.map.forge.capability.HiddenCapability; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class ForgePlayer extends Player { - public ForgePlayer(@NotNull ServerPlayer player) { +public class NeoForgePlayer extends Player { + private static final Supplier> HIDDEN = Pl3xMapNeoForge.ATTACHMENT_TYPES.register( + "hidden", + () -> AttachmentType.builder(() -> false) + .serialize(Codec.BOOL) + .copyOnDeath() + .build() + ); + + public NeoForgePlayer(@NotNull ServerPlayer player) { super(player.getScoreboardName(), player); } @@ -70,7 +80,7 @@ public ForgePlayer(@NotNull ServerPlayer player) { public @NotNull World getWorld() { ServerLevel level = (ServerLevel) getPlayer().level(); String name = level.dimension().location().toString(); - return Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new ForgeWorld(level, name)); + return Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new NeoForgeWorld(level, name)); } @Override @@ -102,7 +112,7 @@ public int getArmorPoints() { if (property == null) { return null; } - String json = new String(Base64.getDecoder().decode(property.getValue()), StandardCharsets.UTF_8); + String json = new String(Base64.getDecoder().decode(property.value()), StandardCharsets.UTF_8); JsonElement jsonElement = JsonParser.parseString(json); if (!jsonElement.isJsonObject()) { return null; @@ -142,18 +152,17 @@ public boolean isSpectator() { @Override public boolean isPersistentlyHidden() { - HiddenCapability cap = HiddenCapability.get(getPlayer()).resolve().orElse(null); - return cap != null && cap.isHidden(); + return getPlayer().getData(HIDDEN).booleanValue(); } @Override public void setPersistentlyHidden(boolean hidden) { - HiddenCapability.get(getPlayer()).ifPresent(cap -> cap.setHidden(hidden)); + getPlayer().setData(HIDDEN, hidden); } @Override public @NotNull String toString() { - return "ForgePlayer{" + return "NeoForgePlayer{" + "player=" + getPlayer().getUUID() + "}"; } diff --git a/forge/src/main/java/net/pl3x/map/forge/ForgeWorld.java b/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java similarity index 95% rename from forge/src/main/java/net/pl3x/map/forge/ForgeWorld.java rename to neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java index 8c203b743..a69f2a47f 100644 --- a/forge/src/main/java/net/pl3x/map/forge/ForgeWorld.java +++ b/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java @@ -43,14 +43,14 @@ import net.pl3x.map.core.world.World; import org.jetbrains.annotations.NotNull; -public class ForgeWorld extends World { +public class NeoForgeWorld extends World { private final ServerLevel level; - public ForgeWorld(@NotNull ServerLevel level, @NotNull String name) { + public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { super( name, level.getSeed(), - Point.of(level.getLevelData().getXSpawn(), level.getLevelData().getZSpawn()), + Point.of(level.getLevelData().getSpawnPos().getX(), level.getLevelData().getSpawnPos().getZ()), Type.get(level.dimension().location().toString()), level.getChunkSource().getDataStorage().dataFolder.toPath().getParent().resolve("region") ); @@ -159,7 +159,7 @@ public double getBorderMaxZ() { @Override public @NotNull String toString() { - return "ForgeWorld{" + return "NeoForgeWorld{" + "name=" + getName() + ",seed=" + getSeed() + ",spawn=" + getSpawn() diff --git a/forge/src/main/java/net/pl3x/map/forge/Pl3xMapForge.java b/neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java similarity index 79% rename from forge/src/main/java/net/pl3x/map/forge/Pl3xMapForge.java rename to neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java index 8c4ee0339..46a3ef834 100644 --- a/forge/src/main/java/net/pl3x/map/forge/Pl3xMapForge.java +++ b/neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java @@ -23,16 +23,16 @@ */ package net.pl3x.map.forge; -import cloud.commandframework.forge.CloudForgeEntrypoint; import java.nio.file.Path; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; import net.kyori.adventure.platform.AudienceProvider; -import net.kyori.adventure.platform.forge.ForgeServerAudiences; +import net.kyori.adventure.platform.forge.NeoForgeServerAudiences; import net.minecraft.SharedConstants; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -46,32 +46,36 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.loading.FMLPaths; -import net.minecraftforge.forgespi.language.IModInfo; -import net.minecraftforge.registries.ForgeRegistries; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModList; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.level.LevelEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import net.neoforged.neoforgespi.language.IModInfo; import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.event.server.ServerLoadedEvent; +import net.pl3x.map.core.network.Constants; import net.pl3x.map.core.player.Player; import net.pl3x.map.core.player.PlayerListener; import net.pl3x.map.core.player.PlayerRegistry; import net.pl3x.map.core.world.World; -import net.pl3x.map.forge.capability.HiddenCapability; -import net.pl3x.map.forge.command.ForgeCommandManager; +import net.pl3x.map.forge.command.NeoForgeCommandManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @Mod("pl3xmap") -public class Pl3xMapForge extends Pl3xMap { +public class Pl3xMapNeoForge extends Pl3xMap { + public static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, Constants.MODID); + private final PlayerListener playerListener = new PlayerListener(); @SuppressWarnings("deprecation") @@ -80,38 +84,36 @@ public class Pl3xMapForge extends Pl3xMap { private MinecraftServer server; private IModInfo modInfo; - private ForgeServerAudiences adventure; + private NeoForgeServerAudiences adventure; private int tick; - private final ForgeNetwork network; + private final NeoForgeNetwork network; @SuppressWarnings("InstantiationOfUtilityClass") - public Pl3xMapForge() { + public Pl3xMapNeoForge() { super(false); - new CloudForgeEntrypoint(); - - MinecraftForge.EVENT_BUS.register(this); - MinecraftForge.EVENT_BUS.register(new HiddenCapability()); + NeoForge.EVENT_BUS.register(this); + ATTACHMENT_TYPES.register(NeoForge.EVENT_BUS); try { - new ForgeCommandManager(); + new NeoForgeCommandManager(); } catch (Exception e) { throw new RuntimeException(e); } - this.network = new ForgeNetwork(this); + this.network = new NeoForgeNetwork(this); } @SubscribeEvent - public void onRegisterCapabilities(RegisterCapabilitiesEvent event) { - event.register(HiddenCapability.class); + public void onRegisterPayloadHandlers(@NotNull RegisterPayloadHandlersEvent event) { + this.network.register(); } @SubscribeEvent - public void onServerTick(TickEvent.@NotNull ServerTickEvent event) { - if (event.phase == TickEvent.Phase.END && this.tick++ >= 20) { + public void onServerTick(ServerTickEvent.@NotNull Post event) { + if (this.tick++ >= 20) { this.tick = 0; getScheduler().tick(); } @@ -121,7 +123,7 @@ public void onServerTick(TickEvent.@NotNull ServerTickEvent event) { public void onPlayerLoggedIn(PlayerEvent.@NotNull PlayerLoggedInEvent event) { PlayerRegistry registry = Pl3xMap.api().getPlayerRegistry(); UUID uuid = event.getEntity().getUUID(); - Player forgePlayer = registry.getOrDefault(uuid, () -> new ForgePlayer((ServerPlayer) event.getEntity())); + Player forgePlayer = registry.getOrDefault(uuid, () -> new NeoForgePlayer((ServerPlayer) event.getEntity())); this.playerListener.onJoin(forgePlayer); } @@ -144,7 +146,7 @@ public void onWorldLoad(LevelEvent.Load event) { return; } String name = level.dimension().location().toString(); - Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new ForgeWorld(level, name)); + Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new NeoForgeWorld(level, name)); } @SubscribeEvent @@ -159,7 +161,7 @@ public void onWorldUnload(LevelEvent.Unload event) { @SubscribeEvent public void onServerStarted(@NotNull ServerStartedEvent event) { this.server = event.getServer(); - this.adventure = new ForgeServerAudiences(this.server); + this.adventure = new NeoForgeServerAudiences(this.server); enable(); @@ -186,7 +188,7 @@ public void onServerLoad(ServerStartedEvent event) { @SubscribeEvent public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { if (event.getEntity() instanceof ServerPlayer newPlayer) { - getPlayerRegistry().getOrDefault(newPlayer.getUUID(), () -> new ForgePlayer(newPlayer)).setPlayer(newPlayer); + getPlayerRegistry().getOrDefault(newPlayer.getUUID(), () -> new NeoForgePlayer(newPlayer)).setPlayer(newPlayer); } } @@ -248,7 +250,7 @@ public int getColorForPower(byte power) { @Override public net.pl3x.map.core.world.@Nullable Block getFlower(@NotNull World world, net.pl3x.map.core.world.@NotNull Biome biome, int blockX, int blockY, int blockZ) { // https://github.com/Draradech/FlowerMap (CC0-1.0 license) - Biome nms = world.getLevel().registryAccess().registryOrThrow(Registries.BIOME).get(new ResourceLocation(biome.getKey())); + Biome nms = world.getLevel().registryAccess().registryOrThrow(Registries.BIOME).get(ResourceLocation.parse(biome.getKey())); if (nms == null) { return null; } @@ -259,7 +261,7 @@ public int getColorForPower(byte power) { RandomPatchConfiguration config = (RandomPatchConfiguration) flowers.get(0).config(); SimpleBlockConfiguration flower = (SimpleBlockConfiguration) config.feature().value().feature().value().config(); Block block = flower.toPlace().getState(this.randomSource, new BlockPos(blockX, blockY, blockZ)).getBlock(); - ResourceLocation key = ForgeRegistries.BLOCKS.getKey(block); + ResourceLocation key = BuiltInRegistries.BLOCK.getKey(block); return key == null ? null : getBlockRegistry().get(key.toString()); } @@ -277,7 +279,7 @@ protected void loadBlocks() { protected void loadWorlds() { this.server.getAllLevels().forEach(level -> { String name = level.dimension().location().toString(); - Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new ForgeWorld(level, name)); + Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new NeoForgeWorld(level, name)); }); } @@ -285,13 +287,13 @@ protected void loadWorlds() { protected void loadPlayers() { this.server.getPlayerList().getPlayers().forEach(player -> { UUID uuid = player.getUUID(); - getPlayerRegistry().getOrDefault(uuid, () -> new ForgePlayer(player)); + getPlayerRegistry().getOrDefault(uuid, () -> new NeoForgePlayer(player)); }); } @Override public @NotNull World cloneWorld(@NotNull World world) { - return new ForgeWorld(world.getLevel(), world.getName()); + return new NeoForgeWorld(world.getLevel(), world.getName()); } public @Nullable MinecraftServer getServer() { diff --git a/forge/src/main/java/net/pl3x/map/forge/command/ForgeCommandManager.java b/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java similarity index 65% rename from forge/src/main/java/net/pl3x/map/forge/command/ForgeCommandManager.java rename to neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java index 6b7ea09e6..1d1f3b78a 100644 --- a/forge/src/main/java/net/pl3x/map/forge/command/ForgeCommandManager.java +++ b/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java @@ -23,24 +23,30 @@ */ package net.pl3x.map.forge.command; -import cloud.commandframework.Command; -import cloud.commandframework.execution.CommandExecutionCoordinator; -import cloud.commandframework.forge.ForgeServerCommandManager; import io.leangen.geantyref.TypeToken; import net.minecraft.commands.arguments.DimensionArgument; import net.pl3x.map.core.command.CommandHandler; import net.pl3x.map.core.command.Sender; -import net.pl3x.map.core.command.argument.parser.WorldParser; +import net.pl3x.map.core.command.parser.PlatformParsers; +import net.pl3x.map.core.command.parser.WorldParser; +import org.incendo.cloud.Command; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.brigadier.CloudBrigadierManager; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.neoforge.NeoForgeServerCommandManager; import org.jetbrains.annotations.NotNull; -public class ForgeCommandManager implements CommandHandler { - private final ForgeServerCommandManager<@NotNull Sender> manager; +public class NeoForgeCommandManager implements CommandHandler { + private final NeoForgeServerCommandManager<@NotNull Sender> manager; private final Command.Builder<@NotNull Sender> root; - public ForgeCommandManager() { - this.manager = new ForgeServerCommandManager<>(CommandExecutionCoordinator.simpleCoordinator(), ForgeSender::create, Sender::getSender); + public NeoForgeCommandManager() { + this.manager = new NeoForgeServerCommandManager<>( + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.create(NeoForgeSender::create, Sender::getSender) + ); - var brigadier = getManager().brigadierManager(); + CloudBrigadierManager<@NotNull Sender, ?> brigadier = getManager().brigadierManager(); brigadier.setNativeNumberSuggestions(false); brigadier.registerMapping(new TypeToken>() { }, builder -> builder.toConstant(DimensionArgument.dimension()).cloudSuggestions()); @@ -53,10 +59,15 @@ public ForgeCommandManager() { } @Override - public @NotNull ForgeServerCommandManager<@NotNull Sender> getManager() { + public @NotNull NeoForgeServerCommandManager<@NotNull Sender> getManager() { return this.manager; } + @Override + public @NotNull PlatformParsers getPlatformParsers() { + return new NeoForgeParsers(); + } + @Override public Command.@NotNull Builder<@NotNull Sender> getRoot() { return this.root; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java b/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java new file mode 100644 index 000000000..f4dcbb610 --- /dev/null +++ b/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java @@ -0,0 +1,52 @@ +package net.pl3x.map.forge.command; + +import net.minecraft.world.phys.Vec3; +import net.pl3x.map.core.Pl3xMap; +import net.pl3x.map.core.command.Sender; +import net.pl3x.map.core.command.parser.PlatformParsers; +import net.pl3x.map.core.markers.Point; +import net.pl3x.map.core.player.Player; +import net.pl3x.map.forge.NeoForgePlayer; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.minecraft.modded.data.Coordinates; +import org.incendo.cloud.minecraft.modded.data.SinglePlayerSelector; +import org.incendo.cloud.minecraft.modded.parser.VanillaArgumentParsers; +import org.incendo.cloud.parser.ParserDescriptor; + +public class NeoForgeParsers implements PlatformParsers { + @Override + public ParserDescriptor columnPosParser() { + return VanillaArgumentParsers.columnPosParser(); + } + + @Override + public Point resolvePointFromColumnPos(String name, CommandContext context) { + Coordinates.ColumnCoordinates columnCoordinates = context.getOrDefault(name, null); + if (columnCoordinates == null) { + return Point.ZERO; + } + Vec3 position = columnCoordinates.position(); + return Point.of(position.x, position.z); + } + + @Override + public ParserDescriptor playerSelectorParser() { + return VanillaArgumentParsers.singlePlayerSelectorParser(); + } + + @Override + public Player resolvePlayerFromPlayerSelector(String name, CommandContext context) { + Sender sender = context.sender(); + SinglePlayerSelector playerSelector = context.getOrDefault(name, null); + if (playerSelector == null) { + if (sender instanceof Sender.Player senderPlayer) { + Player player = Pl3xMap.api().getPlayerRegistry().get(senderPlayer.getUUID()); + if (player != null) { + return player; + } + } + return null; + } + return new NeoForgePlayer(playerSelector.single()); + } +} diff --git a/forge/src/main/java/net/pl3x/map/forge/command/ForgeSender.java b/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java similarity index 88% rename from forge/src/main/java/net/pl3x/map/forge/command/ForgeSender.java rename to neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java index c8cbbce1c..7932e5cd6 100644 --- a/forge/src/main/java/net/pl3x/map/forge/command/ForgeSender.java +++ b/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java @@ -26,7 +26,7 @@ import java.util.Objects; import java.util.UUID; import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.platform.forge.ForgeServerAudiences; +import net.kyori.adventure.platform.forge.NeoForgeServerAudiences; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerPlayer; import net.pl3x.map.core.Pl3xMap; @@ -35,15 +35,15 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class ForgeSender extends Sender { +public class NeoForgeSender extends Sender { public static @NotNull Sender create(@NotNull CommandSourceStack stack) { if (stack.source instanceof ServerPlayer) { return new Player(stack); } - return new ForgeSender(stack); + return new NeoForgeSender(stack); } - public ForgeSender(@NotNull CommandSourceStack sender) { + public NeoForgeSender(@NotNull CommandSourceStack sender) { super(sender); } @@ -55,7 +55,7 @@ public ForgeSender(@NotNull CommandSourceStack sender) { @Override public @NotNull Audience audience() { - return ((ForgeServerAudiences) Pl3xMap.api().adventure()).audience(getSender()); + return ((NeoForgeServerAudiences) Pl3xMap.api().adventure()).audience(getSender()); } @Override @@ -69,7 +69,7 @@ public boolean equals(@Nullable Object o) { if (this.getClass() != o.getClass()) { return false; } - ForgeSender other = (ForgeSender) o; + NeoForgeSender other = (NeoForgeSender) o; return getSender().source == other.getSender().source; } @@ -85,7 +85,7 @@ public int hashCode() { + "}"; } - public static class Player extends ForgeSender implements Audience, Sender.Player { + public static class Player extends NeoForgeSender implements Audience, Sender.Player { public Player(@NotNull CommandSourceStack sender) { super(sender); } diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java new file mode 100644 index 000000000..248b07820 --- /dev/null +++ b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java @@ -0,0 +1,62 @@ +package net.pl3x.map.forge.common.network; + +//import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.pl3x.map.core.network.Constants; +//import net.pl3x.map.fabric.client.Pl3xMapFabricClient; +//import net.pl3x.map.fabric.client.duck.MapInstance; + +public record ClientboundMapPayload(int protocol, int response, int mapId, byte scale, int centerX, int centerZ, String worldName) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(ClientboundMapPayload::write, ClientboundMapPayload::new); + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Constants.MODID, "client_map_data")); + + public ClientboundMapPayload(int protocol, int response, int mapId) { + this(protocol, response, mapId, (byte) 0, 0, 0, null); + } + + public ClientboundMapPayload(FriendlyByteBuf friendlyByteBuf) { + this(friendlyByteBuf.readInt(), friendlyByteBuf.readInt(), friendlyByteBuf.readInt(), friendlyByteBuf.readByte(), friendlyByteBuf.readInt(), friendlyByteBuf.readInt(), friendlyByteBuf.readUtf()); + } + + private void write(FriendlyByteBuf friendlyByteBuf) { + friendlyByteBuf.writeInt(protocol); + friendlyByteBuf.writeInt(response); + friendlyByteBuf.writeInt(mapId); + friendlyByteBuf.writeByte(scale); + friendlyByteBuf.writeInt(centerX); + friendlyByteBuf.writeInt(centerZ); + friendlyByteBuf.writeUtf(worldName); + } + + @Override + public Type type() { + return TYPE; + } + +// public static void handle(ClientboundMapPayload payload, ClientPlayNetworking.Context context) { +// Pl3xMapFabricClient instance = Pl3xMapFabricClient.getInstance(); +// if (payload.protocol != Constants.PROTOCOL) { +// instance.setEnabled(false); +// return; +// } +// +// switch (payload.response) { +// case Constants.ERROR_NO_SUCH_MAP, Constants.ERROR_NO_SUCH_WORLD, Constants.ERROR_NOT_VANILLA_MAP -> { +// MapInstance texture = (MapInstance) Minecraft.getInstance().gameRenderer.getMapRenderer().maps.get(payload.mapId); +// if (texture != null) { +// texture.skip(); +// } +// } +// case Constants.RESPONSE_SUCCESS -> { +// MapInstance texture = (MapInstance) Minecraft.getInstance().gameRenderer.getMapRenderer().maps.get(payload.mapId); +// if (texture != null) { +// texture.setData(payload.scale, payload.centerX, payload.centerZ, payload.worldName); +// } +// } +// } +// } +} diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java new file mode 100644 index 000000000..09d052df8 --- /dev/null +++ b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java @@ -0,0 +1,44 @@ +package net.pl3x.map.forge.common.network; + +//import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.pl3x.map.core.network.Constants; +//import net.pl3x.map.fabric.client.Pl3xMapFabricClient; + +public record ClientboundServerPayload(int protocol, int response, String webAddress) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(ClientboundServerPayload::write, ClientboundServerPayload::new); + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Constants.MODID, "client_server_data")); + + public ClientboundServerPayload(int protocol, int response) { + this(protocol, response, null); + } + + public ClientboundServerPayload(FriendlyByteBuf friendlyByteBuf) { + this(friendlyByteBuf.readInt(), friendlyByteBuf.readInt(), friendlyByteBuf.readUtf()); + } + + private void write(FriendlyByteBuf friendlyByteBuf) { + friendlyByteBuf.writeInt(protocol); + friendlyByteBuf.writeInt(response); + friendlyByteBuf.writeUtf(webAddress); + } + + @Override + public Type type() { + return TYPE; + } + +// public static void handle(ClientboundServerPayload payload, ClientPlayNetworking.Context context) { +// Pl3xMapFabricClient instance = Pl3xMapFabricClient.getInstance(); +// if (payload.protocol != Constants.PROTOCOL || payload.response != Constants.RESPONSE_SUCCESS) { +// instance.setEnabled(false); +// return; +// } +// +// instance.getTileManager().initialize(); +// instance.setServerUrl(payload.webAddress); +// } +} diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java new file mode 100644 index 000000000..594c777b8 --- /dev/null +++ b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java @@ -0,0 +1,30 @@ +package net.pl3x.map.forge.common.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.pl3x.map.core.network.Constants; + +public record ServerboundMapPayload(int protocol, int mapId) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(ServerboundMapPayload::write, ServerboundMapPayload::new); + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Constants.MODID, "server_map_data")); + + public ServerboundMapPayload(int mapId) { + this(Constants.PROTOCOL, mapId); + } + + public ServerboundMapPayload(FriendlyByteBuf friendlyByteBuf) { + this(friendlyByteBuf.readInt(), friendlyByteBuf.readInt()); + } + + private void write(FriendlyByteBuf friendlyByteBuf) { + friendlyByteBuf.writeInt(protocol); + friendlyByteBuf.writeInt(mapId); + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java new file mode 100644 index 000000000..11dc558da --- /dev/null +++ b/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java @@ -0,0 +1,25 @@ +package net.pl3x.map.forge.common.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.pl3x.map.core.network.Constants; + +public record ServerboundServerPayload(int protocol) implements CustomPacketPayload { + public static final StreamCodec STREAM_CODEC = CustomPacketPayload.codec(ServerboundServerPayload::write, ServerboundServerPayload::new); + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Constants.MODID, "server_server_data")); + + public ServerboundServerPayload(FriendlyByteBuf friendlyByteBuf) { + this(friendlyByteBuf.readInt()); + } + + private void write(FriendlyByteBuf friendlyByteBuf) { + friendlyByteBuf.writeInt(protocol); + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 000000000..73be38af9 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,3 @@ +public net.minecraft.world.level.biome.Biome$ClimateSettings +#public net.minecraft.world.level.biome.Biome f_47437_ #climateSettings #this throws errors at startup for some reason.. used reflection instead +public net.minecraft.world.level.storage.DimensionDataStorage dataFolder diff --git a/forge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 68% rename from forge/src/main/resources/META-INF/mods.toml rename to neoforge/src/main/resources/META-INF/neoforge.mods.toml index 6659076ff..753391a0d 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,9 +1,10 @@ modLoader = "javafml" -loaderVersion = "${forgeLoaderVersion}" +loaderVersion = "${neoforgeLoaderVersion}" license = "MIT" showAsResourcePack = false properties = {} issueTrackerURL = "${issues}" + [[mods]] modId = "pl3xmap" version = "${version}" @@ -17,15 +18,24 @@ modproperties = {} authors = ${authors} displayURL = "${website}" displayTest = "IGNORE_SERVER_VERSION" + [[dependencies.pl3xmap]] -modId = "forge" -mandatory = true -versionRange = "${forgeLoaderVersion}" +modId = "neoforge" +type = "required" +versionRange = "${neoforgeLoaderVersion}" ordering = "AFTER" side = "SERVER" + [[dependencies.pl3xmap]] modId = "minecraft" -mandatory = true +type = "required" versionRange = "[${minecraftVersion}]" ordering = "AFTER" side = "SERVER" + +[[dependencies.pl3xmap]] +modId = "cloud" +type = "required" +versionRange = "[1.0,)" +ordering = "NONE" +side = "BOTH" diff --git a/forge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta similarity index 100% rename from forge/src/main/resources/pack.mcmeta rename to neoforge/src/main/resources/pack.mcmeta diff --git a/forge/src/main/resources/pl3xmap.png b/neoforge/src/main/resources/pl3xmap.png similarity index 100% rename from forge/src/main/resources/pl3xmap.png rename to neoforge/src/main/resources/pl3xmap.png diff --git a/settings.gradle.kts b/settings.gradle.kts index f08883542..a9418bf8a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,7 @@ pluginManagement { repositories { gradlePluginPortal() maven("https://maven.fabricmc.net/") - //maven("https://maven.minecraftforge.net/") + maven("https://maven.neoforged.net/releases") } } @@ -11,5 +11,5 @@ rootProject.name = "Pl3xMap" include("core") include("bukkit") include("fabric") -//include ("forge") +include ("neoforge") include("webmap") From 780e5db9ab5bbbfff57ce5ffda5d2f7579c07169 Mon Sep 17 00:00:00 2001 From: granny Date: Fri, 23 Aug 2024 02:40:35 -0700 Subject: [PATCH 02/11] forgot to update package --- .../pl3x/map/{forge => neoforge}/NeoForgeNetwork.java | 10 +++++----- .../pl3x/map/{forge => neoforge}/NeoForgePlayer.java | 2 +- .../pl3x/map/{forge => neoforge}/NeoForgeWorld.java | 2 +- .../pl3x/map/{forge => neoforge}/Pl3xMapNeoForge.java | 4 ++-- .../command/NeoForgeCommandManager.java | 2 +- .../{forge => neoforge}/command/NeoForgeParsers.java | 4 ++-- .../{forge => neoforge}/command/NeoForgeSender.java | 2 +- .../common/network/ClientboundMapPayload.java | 3 +-- .../common/network/ClientboundServerPayload.java | 2 +- .../common/network/ServerboundMapPayload.java | 2 +- .../common/network/ServerboundServerPayload.java | 2 +- 11 files changed, 17 insertions(+), 18 deletions(-) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/NeoForgeNetwork.java (93%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/NeoForgePlayer.java (99%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/NeoForgeWorld.java (99%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/Pl3xMapNeoForge.java (99%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/command/NeoForgeCommandManager.java (98%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/command/NeoForgeParsers.java (95%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/command/NeoForgeSender.java (99%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/common/network/ClientboundMapPayload.java (97%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/common/network/ClientboundServerPayload.java (97%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/common/network/ServerboundMapPayload.java (96%) rename neoforge/src/main/java/net/pl3x/map/{forge => neoforge}/common/network/ServerboundServerPayload.java (95%) diff --git a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java similarity index 93% rename from neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java index c275649ee..245f2c82e 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeNetwork.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package net.pl3x.map.forge; +package net.pl3x.map.neoforge; import com.google.common.io.ByteArrayDataOutput; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -38,10 +38,10 @@ import net.pl3x.map.core.configuration.Config; import net.pl3x.map.core.network.Constants; import net.pl3x.map.core.network.Network; -import net.pl3x.map.forge.common.network.ClientboundMapPayload; -import net.pl3x.map.forge.common.network.ClientboundServerPayload; -import net.pl3x.map.forge.common.network.ServerboundMapPayload; -import net.pl3x.map.forge.common.network.ServerboundServerPayload; +import net.pl3x.map.neoforge.common.network.ClientboundMapPayload; +import net.pl3x.map.neoforge.common.network.ClientboundServerPayload; +import net.pl3x.map.neoforge.common.network.ServerboundMapPayload; +import net.pl3x.map.neoforge.common.network.ServerboundServerPayload; public class NeoForgeNetwork extends Network { public static IPayloadHandler NOOP_HANDLER = (payload, context) -> {}; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java similarity index 99% rename from neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java index b815c5091..20873b3f9 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgePlayer.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package net.pl3x.map.forge; +package net.pl3x.map.neoforge; import com.google.gson.JsonElement; import com.google.gson.JsonObject; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java similarity index 99% rename from neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java index a69f2a47f..79c7fd39a 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/NeoForgeWorld.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package net.pl3x.map.forge; +package net.pl3x.map.neoforge; import java.lang.reflect.Field; import java.util.Collection; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java similarity index 99% rename from neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java index 46a3ef834..3ea26762c 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/Pl3xMapNeoForge.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package net.pl3x.map.forge; +package net.pl3x.map.neoforge; import java.nio.file.Path; import java.util.List; @@ -68,7 +68,7 @@ import net.pl3x.map.core.player.PlayerListener; import net.pl3x.map.core.player.PlayerRegistry; import net.pl3x.map.core.world.World; -import net.pl3x.map.forge.command.NeoForgeCommandManager; +import net.pl3x.map.neoforge.command.NeoForgeCommandManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java similarity index 98% rename from neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java index 1d1f3b78a..94d0183e1 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeCommandManager.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package net.pl3x.map.forge.command; +package net.pl3x.map.neoforge.command; import io.leangen.geantyref.TypeToken; import net.minecraft.commands.arguments.DimensionArgument; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java similarity index 95% rename from neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java index f4dcbb610..25a1fc9ca 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeParsers.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java @@ -1,4 +1,4 @@ -package net.pl3x.map.forge.command; +package net.pl3x.map.neoforge.command; import net.minecraft.world.phys.Vec3; import net.pl3x.map.core.Pl3xMap; @@ -6,7 +6,7 @@ import net.pl3x.map.core.command.parser.PlatformParsers; import net.pl3x.map.core.markers.Point; import net.pl3x.map.core.player.Player; -import net.pl3x.map.forge.NeoForgePlayer; +import net.pl3x.map.neoforge.NeoForgePlayer; import org.incendo.cloud.context.CommandContext; import org.incendo.cloud.minecraft.modded.data.Coordinates; import org.incendo.cloud.minecraft.modded.data.SinglePlayerSelector; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java similarity index 99% rename from neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java index 7932e5cd6..e8ec564b3 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/command/NeoForgeSender.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package net.pl3x.map.forge.command; +package net.pl3x.map.neoforge.command; import java.util.Objects; import java.util.UUID; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ClientboundMapPayload.java similarity index 97% rename from neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ClientboundMapPayload.java index 248b07820..b11aeb95b 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundMapPayload.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ClientboundMapPayload.java @@ -1,7 +1,6 @@ -package net.pl3x.map.forge.common.network; +package net.pl3x.map.neoforge.common.network; //import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ClientboundServerPayload.java similarity index 97% rename from neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ClientboundServerPayload.java index 09d052df8..01d22b953 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ClientboundServerPayload.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ClientboundServerPayload.java @@ -1,4 +1,4 @@ -package net.pl3x.map.forge.common.network; +package net.pl3x.map.neoforge.common.network; //import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.network.FriendlyByteBuf; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ServerboundMapPayload.java similarity index 96% rename from neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ServerboundMapPayload.java index 594c777b8..f4b862f93 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundMapPayload.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ServerboundMapPayload.java @@ -1,4 +1,4 @@ -package net.pl3x.map.forge.common.network; +package net.pl3x.map.neoforge.common.network; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; diff --git a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ServerboundServerPayload.java similarity index 95% rename from neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java rename to neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ServerboundServerPayload.java index 11dc558da..9eb05d950 100644 --- a/neoforge/src/main/java/net/pl3x/map/forge/common/network/ServerboundServerPayload.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/common/network/ServerboundServerPayload.java @@ -1,4 +1,4 @@ -package net.pl3x.map.forge.common.network; +package net.pl3x.map.neoforge.common.network; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; From 7aebb006a92a2057cf28ea27228a156c90fc43e4 Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 22 Sep 2024 19:52:25 -0700 Subject: [PATCH 03/11] i need to learn how to use gradle properly someday --- gradle/libs.versions.toml | 2 +- neoforge/build.gradle.kts | 41 ++++++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8408d5acc..6deebfc57 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ fabricLoom="1.7-SNAPSHOT" neoforge="21.1.23" neoGradle="7.0.145" -neoforgeLoader="[20.5,)" +neoforgeLoader="[4,)" minotaur="2.+" # https://github.com/modrinth/minotaur paperweight="1.7.2" # https://github.com/PaperMC/Paperweight diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 2f8d60b0b..f2e248b49 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,12 +1,15 @@ +import net.neoforged.gradle.common.tasks.JarJar + plugins { alias(libs.plugins.neoforged.userdev) - alias(libs.plugins.shadow) } val buildNum = System.getenv("NEXT_BUILD_NUMBER") ?: "SNAPSHOT" project.version = "${libs.versions.minecraft.get()}-$buildNum" project.group = "net.pl3x.map.neoforge" +val shade: Configuration by configurations.creating + base { archivesName = "${rootProject.name}-${project.name}" } @@ -37,6 +40,7 @@ repositories { dependencies { implementation(libs.neoforge.loader) implementation(project(path = ":core", configuration = "shadow")) + shade(project(path = ":core", configuration = "shadow")) implementation("net.kyori:adventure-text-serializer-gson:4.17.0") implementation(libs.cloudNeoforge) @@ -52,30 +56,31 @@ minecraft { } tasks { - assemble { - dependsOn(shadowJar) - } - - // needed for below jank - compileJava { - dependsOn(":core:jar") - } + val jarJarTask = named("jarJar") { + archiveClassifier = "" - shadowJar { - mergeServiceFiles() + val fileTreeProvider = shade.elements.map { zipTree(it.single()) } + from(fileTreeProvider) - dependencies { - include(project(":core")) + // this is jank but it works + doFirst { + manifest { + from(fileTreeProvider.get().matching { include("META-INF/MANIFEST.MF") }.files) + } } + } - // this is janky, but it works - manifest { - from(project(":core").tasks.named("shadowJar").get().manifest) - } + jar { + archiveClassifier = "original" + } + + // needed for above jank + compileJava { + dependsOn(":core:jar") } build { - dependsOn(jarJar) + dependsOn(jarJarTask) } sourceSets { From 97a8fe14dcd4f37ec9fbb501981b27d0b0fc83aa Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 29 Sep 2024 02:41:28 -0700 Subject: [PATCH 04/11] use new adventure neoforge impl --- gradle/libs.versions.toml | 2 + neoforge/build.gradle.kts | 3 + .../forge/NeoForgeServerAudiences.java | 121 ------------------ .../pl3x/map/neoforge/Pl3xMapNeoForge.java | 6 +- .../map/neoforge/command/NeoForgeSender.java | 4 +- 5 files changed, 10 insertions(+), 126 deletions(-) delete mode 100644 neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6deebfc57..2e666ebb8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,6 +19,7 @@ shadowJar="8.3.0" # https://github.com/GradleUp/shadow adventure="4.18.0-SNAPSHOT" adventureBukkit="4.3.5-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform adventureFabric="5.14.2-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform-fabric +adventureModded="6.0.0" # https://github.com/KyoriPowered/adventure-platform-fabric cloud="2.0.0-rc.2" # https://github.com/incendo/cloud cloud-minecraft="2.0.0-beta.9" # https://github.com/Incendo/cloud-minecraft @@ -77,6 +78,7 @@ adventureTextSerializerPlain = { group = "net.kyori", name = "adventure-text-ser adventurePlatformFacet = { group = "net.kyori", name = "adventure-platform-facet", version.ref = "adventureBukkit" } adventurePlatformBukkit = { group = "net.kyori", name = "adventure-platform-bukkit", version.ref = "adventureBukkit" } adventurePlatformFabric = { group = "net.kyori", name = "adventure-platform-fabric", version.ref = "adventureFabric" } +adventurePlatformNeoforge = { group = "net.kyori", name = "adventure-platform-neoforge", version.ref = "adventureModded" } caffeine = { group = "com.github.ben-manes.caffeine", name = "caffeine", version.ref = "caffeine" } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index f2e248b49..e31708ae4 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -43,6 +43,9 @@ dependencies { shade(project(path = ":core", configuration = "shadow")) implementation("net.kyori:adventure-text-serializer-gson:4.17.0") + implementation(libs.adventurePlatformNeoforge) + jarJar(libs.adventurePlatformNeoforge) + implementation(libs.cloudNeoforge) jarJar(libs.cloudNeoforge) } diff --git a/neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java b/neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java deleted file mode 100644 index a855b3ec9..000000000 --- a/neoforge/src/main/java/net/kyori/adventure/platform/forge/NeoForgeServerAudiences.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-2023 William Blake Galbreath - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package net.kyori.adventure.platform.forge; - -import com.google.gson.JsonElement; -import java.util.Objects; -import java.util.UUID; -import java.util.stream.Collectors; -import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.audience.MessageType; -import net.kyori.adventure.identity.Identity; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.platform.AudienceProvider; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.flattener.ComponentFlattener; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.minecraft.commands.CommandSource; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import org.apache.commons.lang3.NotImplementedException; -import org.jetbrains.annotations.NotNull; - -public class NeoForgeServerAudiences implements AudienceProvider { - private final MinecraftServer server; - - public NeoForgeServerAudiences(@NotNull MinecraftServer server) { - this.server = server; - } - - private net.minecraft.network.chat.@NotNull Component toNative(@NotNull Component component) { - JsonElement tree = GsonComponentSerializer.gson().serializeToTree(component); - return Objects.requireNonNull(net.minecraft.network.chat.Component.Serializer.fromJson(tree, server.registryAccess())); - } - - public @NotNull Audience audience(@NotNull CommandSource source) { - if (source instanceof MinecraftServer) { - return audience(this.server.createCommandSourceStack()); - } else if (source instanceof ServerPlayer player) { - return audience(player.createCommandSourceStack()); - } else { - return Audience.empty(); - } - } - - public @NotNull Audience audience(@NotNull CommandSourceStack stack) { - return new Audience() { - @Override - @SuppressWarnings({"UnstableApiUsage", "deprecation"}) - public void sendMessage(@NotNull Identity identity, @NotNull Component text, @NotNull MessageType type) { - stack.sendSystemMessage(toNative(text)); - } - }; - } - - @Override - public @NotNull Audience all() { - return Audience.audience(console(), players()); - } - - @Override - public @NotNull Audience console() { - return audience(this.server); - } - - @Override - public @NotNull Audience players() { - return Audience.audience(this.server.getPlayerList().getPlayers().stream().map(this::audience).collect(Collectors.toList())); - } - - @Override - public @NotNull Audience player(@NotNull UUID uuid) { - ServerPlayer player = this.server.getPlayerList().getPlayer(uuid); - return player != null ? audience(player) : Audience.empty(); - } - - @Override - public @NotNull Audience permission(@NotNull String permission) { - return Audience.empty(); - } - - @Override - public @NotNull Audience world(@NotNull Key world) { - return Audience.empty(); - } - - @Override - public @NotNull Audience server(@NotNull String serverName) { - return Audience.empty(); - } - - @Override - public @NotNull ComponentFlattener flattener() { - throw new NotImplementedException(); - } - - @Override - public void close() { - } -} diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java index 3ea26762c..8a339db8b 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java @@ -29,7 +29,7 @@ import java.util.Map; import java.util.UUID; import net.kyori.adventure.platform.AudienceProvider; -import net.kyori.adventure.platform.forge.NeoForgeServerAudiences; +import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences; import net.minecraft.SharedConstants; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; @@ -84,7 +84,7 @@ public class Pl3xMapNeoForge extends Pl3xMap { private MinecraftServer server; private IModInfo modInfo; - private NeoForgeServerAudiences adventure; + private MinecraftServerAudiences adventure; private int tick; @@ -161,7 +161,7 @@ public void onWorldUnload(LevelEvent.Unload event) { @SubscribeEvent public void onServerStarted(@NotNull ServerStartedEvent event) { this.server = event.getServer(); - this.adventure = new NeoForgeServerAudiences(this.server); + this.adventure = MinecraftServerAudiences.of(this.server); enable(); diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java index e8ec564b3..70f316f7c 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java @@ -26,7 +26,7 @@ import java.util.Objects; import java.util.UUID; import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.platform.forge.NeoForgeServerAudiences; +import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences; import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerPlayer; import net.pl3x.map.core.Pl3xMap; @@ -55,7 +55,7 @@ public NeoForgeSender(@NotNull CommandSourceStack sender) { @Override public @NotNull Audience audience() { - return ((NeoForgeServerAudiences) Pl3xMap.api().adventure()).audience(getSender()); + return ((MinecraftServerAudiences) Pl3xMap.api().adventure()).audience(getSender()); } @Override From 9818f5531fb7f9d758d3a784f53231f203ade13e Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 29 Sep 2024 03:15:03 -0700 Subject: [PATCH 05/11] register events on the correct event bus --- .../java/net/pl3x/map/neoforge/NeoForgeNetwork.java | 8 ++++++++ .../java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java | 12 +++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java index 245f2c82e..0ff974537 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java @@ -32,7 +32,9 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.saveddata.maps.MapId; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.network.handling.IPayloadHandler; import net.neoforged.neoforge.network.registration.PayloadRegistrar; import net.pl3x.map.core.configuration.Config; @@ -42,6 +44,7 @@ import net.pl3x.map.neoforge.common.network.ClientboundServerPayload; import net.pl3x.map.neoforge.common.network.ServerboundMapPayload; import net.pl3x.map.neoforge.common.network.ServerboundServerPayload; +import org.jetbrains.annotations.NotNull; public class NeoForgeNetwork extends Network { public static IPayloadHandler NOOP_HANDLER = (payload, context) -> {}; @@ -52,6 +55,11 @@ public NeoForgeNetwork(Pl3xMapNeoForge mod) { this.mod = mod; } + @SubscribeEvent + public void onRegisterPayloadHandlers(@NotNull RegisterPayloadHandlersEvent event) { + this.register(); + } + @Override public void register() { new PayloadRegistrar(Constants.MODID) diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java index 8a339db8b..d113c9093 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java @@ -46,8 +46,10 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; +import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModList; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.loading.FMLPaths; import net.neoforged.neoforge.attachment.AttachmentType; @@ -91,11 +93,11 @@ public class Pl3xMapNeoForge extends Pl3xMap { private final NeoForgeNetwork network; @SuppressWarnings("InstantiationOfUtilityClass") - public Pl3xMapNeoForge() { + public Pl3xMapNeoForge(IEventBus eventBus) { super(false); NeoForge.EVENT_BUS.register(this); - ATTACHMENT_TYPES.register(NeoForge.EVENT_BUS); + ATTACHMENT_TYPES.register(eventBus); try { new NeoForgeCommandManager(); @@ -104,11 +106,7 @@ public Pl3xMapNeoForge() { } this.network = new NeoForgeNetwork(this); - } - - @SubscribeEvent - public void onRegisterPayloadHandlers(@NotNull RegisterPayloadHandlersEvent event) { - this.network.register(); + eventBus.register(this.network); } @SubscribeEvent From 6afc7484b54b27c70ae00d4caee823eb4bee73dc Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 29 Sep 2024 05:03:20 -0700 Subject: [PATCH 06/11] experiment with loading dependencies through spigot library system --- bukkit/build.gradle.kts | 25 +++++++++++++++++++++---- bukkit/src/main/resources/plugin.yml | 11 +++++++++++ core/build.gradle.kts | 15 +++++---------- gradle/libs.versions.toml | 15 ++++++++------- neoforge/build.gradle.kts | 11 +++++++++-- 5 files changed, 54 insertions(+), 23 deletions(-) diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 33b94b992..657cc486b 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -32,10 +32,16 @@ repositories { dependencies { implementation(project(":core", configuration = "shadow")) - implementation(libs.cloudBrigadier) - implementation(libs.cloudPaper) +// implementation(libs.cloudCore) +// implementation(libs.cloudProcessorsConfirmation) +// implementation(libs.cloudMinecraftExtras) +// +// implementation(libs.bundles.adventure) - implementation(libs.adventurePlatformBukkit) + compileOnly(libs.cloudBrigadier) + compileOnly(libs.cloudPaper) + + compileOnly(libs.adventurePlatformBukkit) paperweight.paperDevBundle(libs.versions.bukkit) } @@ -53,6 +59,12 @@ tasks { shadowJar { mergeServiceFiles() +// arrayOf( +// "org.incendo", +// "io.leangen.geantyref", +// "net.kyori", +// ).forEach { it -> relocate(it, "libs.$it") } + // this is janky, but it works manifest { from(project(":core").tasks.named("shadowJar").get().manifest) @@ -70,7 +82,12 @@ tasks { "version" to project.version, "authors" to project.properties["authors"], "description" to project.properties["description"], - "website" to project.properties["website"] + "website" to project.properties["website"], + "cloud" to libs.versions.cloud.asProvider().get(), + "cloudProcessors" to libs.versions.cloud.processors.get(), + "cloudMinecraft" to libs.versions.cloud.minecraft.asProvider().get(), + "adventure" to libs.versions.adventure.get(), + "adventureBukkit" to libs.versions.adventureBukkit.get() )) filesMatching("plugin.yml") { diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 462332b7e..64d6c2904 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -8,6 +8,17 @@ description: "${description}" website: "${website}" folia-supported: true +libraries: + - org.incendo:cloud-core:${cloud} + - org.incendo:cloud-processors-confirmation:${cloudProcessors} + - org.incendo:cloud-minecraft-extras:${cloudMinecraft} + - org.incendo:cloud-brigadier:${cloudMinecraft} + - org.incendo:cloud-paper:${cloudMinecraft} + - net.kyori:adventure-api:${adventure} + - net.kyori:adventure-text-minimessage:${adventure} + - net.kyori:adventure-text-serializer-plain:${adventure} + - net.kyori:adventure-platform-bukkit:${adventureBukkit} + permissions: pl3xmap.command.map: description: Gives access to the base command diff --git a/core/build.gradle.kts b/core/build.gradle.kts index a5362f122..9f6e3ce37 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -43,14 +43,12 @@ dependencies { implementation(libs.undertow) - implementation(libs.cloudCore) - implementation(libs.cloudProcessorsConfirmation) - implementation(libs.cloudMinecraftExtras) { - exclude("net.kyori", "*") - } + compileOnly(libs.cloudCore) + compileOnly(libs.cloudProcessorsConfirmation) + compileOnly(libs.cloudMinecraftExtras) - implementation(libs.bundles.adventure) - implementation(libs.adventurePlatformFacet) + compileOnly(libs.bundles.adventure) + compileOnly(libs.adventurePlatformFacet) implementation(libs.caffeine) implementation(libs.querzNbt) @@ -75,14 +73,11 @@ tasks { ) arrayOf( - //"org.incendo", // do not relocate "com.github.benmanes.caffeine.cache", "com.github.Carleslc.Simple-YAML", "com.google.errorprone.annotations", "com.luciad", - //"io.leangen.geantyref", // do not relocate! "io.undertow", - //"net.kyori", // do not relocate! "net.querz", "net.jpountz", "org.checkerframework", diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2e666ebb8..f6f82923a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,15 +16,15 @@ paperweight="1.7.2" # https://github.com/PaperMC/Paperweight indra-git="3.1.3" # https://github.com/KyoriPowered/indra shadowJar="8.3.0" # https://github.com/GradleUp/shadow -adventure="4.18.0-SNAPSHOT" -adventureBukkit="4.3.5-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform -adventureFabric="5.14.2-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform-fabric +adventure="4.17.0" +adventureBukkit="4.3.4" # https://github.com/KyoriPowered/adventure-platform +adventureFabric="5.14.1" # https://github.com/KyoriPowered/adventure-platform-fabric adventureModded="6.0.0" # https://github.com/KyoriPowered/adventure-platform-fabric -cloud="2.0.0-rc.2" # https://github.com/incendo/cloud -cloud-minecraft="2.0.0-beta.9" # https://github.com/Incendo/cloud-minecraft -cloud-minecraft-modded="2.0.0-beta.7" # https://github.com/Incendo/cloud-minecraft-modded -cloud-processors="1.0.0-beta.3" # https://github.com/Incendo/cloud-processors +cloud="2.0.0" # https://github.com/incendo/cloud +cloud-minecraft="2.0.0-beta.10" # https://github.com/Incendo/cloud-minecraft +cloud-minecraft-modded="2.0.0-beta.9" # https://github.com/Incendo/cloud-minecraft-modded +cloud-processors="1.0.0-rc.1" # https://github.com/Incendo/cloud-processors caffeine="3.1.8" # https://github.com/ben-manes/caffeine gson="2.10.1" # https://github.com/google/gson @@ -70,6 +70,7 @@ cloudMinecraftExtras = { group = "org.incendo", name = "cloud-minecraft-extras", cloudFabric = { group = "org.incendo", name = "cloud-fabric", version.ref = "cloud-minecraft-modded" } cloudNeoforge = { group = "org.incendo", name = "cloud-neoforge", version.ref = "cloud-minecraft-modded" } cloudProcessorsConfirmation = { group = "org.incendo", name = "cloud-processors-confirmation", version.ref = "cloud-processors" } +cloudProcessorsCommon = { group = "org.incendo", name = "cloud-processors-common", version.ref = "cloud-processors" } adventureApi = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" } adventureTextMinimessage = { group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure" } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index e31708ae4..d4a95c047 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -9,6 +9,10 @@ project.version = "${libs.versions.minecraft.get()}-$buildNum" project.group = "net.pl3x.map.neoforge" val shade: Configuration by configurations.creating +configurations.implementation { + extendsFrom(shade) +} + base { archivesName = "${rootProject.name}-${project.name}" @@ -39,9 +43,12 @@ repositories { dependencies { implementation(libs.neoforge.loader) - implementation(project(path = ":core", configuration = "shadow")) shade(project(path = ":core", configuration = "shadow")) - implementation("net.kyori:adventure-text-serializer-gson:4.17.0") + + jarJar(libs.cloudProcessorsConfirmation) + jarJar(libs.cloudProcessorsCommon) + jarJar(libs.cloudBrigadier) + jarJar(libs.cloudMinecraftExtras) implementation(libs.adventurePlatformNeoforge) jarJar(libs.adventurePlatformNeoforge) From 581116daef34ba88b27b2538216ab6f7e35a9c33 Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 6 Oct 2024 20:20:58 -0700 Subject: [PATCH 07/11] mark payloads as optional --- .../src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java index 0ff974537..f3b7364da 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeNetwork.java @@ -62,7 +62,7 @@ public void onRegisterPayloadHandlers(@NotNull RegisterPayloadHandlersEvent even @Override public void register() { - new PayloadRegistrar(Constants.MODID) + new PayloadRegistrar(Constants.MODID).optional() .playToServer(ServerboundServerPayload.TYPE, ServerboundServerPayload.STREAM_CODEC, (payload, context) -> { if (!(context.player() instanceof ServerPlayer serverPlayer)) { return; // not a server player From 1d700bb15100417da08a5552f86dd2d3bbc4f23b Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 6 Oct 2024 20:25:08 -0700 Subject: [PATCH 08/11] register attachment type in the main class --- .../java/net/pl3x/map/neoforge/NeoForgePlayer.java | 12 ++---------- .../java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java index 20873b3f9..db2c31704 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java @@ -48,14 +48,6 @@ import org.jetbrains.annotations.Nullable; public class NeoForgePlayer extends Player { - private static final Supplier> HIDDEN = Pl3xMapNeoForge.ATTACHMENT_TYPES.register( - "hidden", - () -> AttachmentType.builder(() -> false) - .serialize(Codec.BOOL) - .copyOnDeath() - .build() - ); - public NeoForgePlayer(@NotNull ServerPlayer player) { super(player.getScoreboardName(), player); } @@ -152,12 +144,12 @@ public boolean isSpectator() { @Override public boolean isPersistentlyHidden() { - return getPlayer().getData(HIDDEN).booleanValue(); + return getPlayer().getData(Pl3xMapNeoForge.HIDDEN).booleanValue(); } @Override public void setPersistentlyHidden(boolean hidden) { - getPlayer().setData(HIDDEN, hidden); + getPlayer().setData(Pl3xMapNeoForge.HIDDEN, hidden); } @Override diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java index d113c9093..2df475b88 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java @@ -23,11 +23,13 @@ */ package net.pl3x.map.neoforge; +import com.mojang.serialization.Codec; import java.nio.file.Path; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; +import java.util.function.Supplier; import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences; import net.minecraft.SharedConstants; @@ -76,7 +78,15 @@ @Mod("pl3xmap") public class Pl3xMapNeoForge extends Pl3xMap { - public static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, Constants.MODID); + private static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, Constants.MODID); + + public static final Supplier> HIDDEN = Pl3xMapNeoForge.ATTACHMENT_TYPES.register( + "hidden", + () -> AttachmentType.builder(() -> false) + .serialize(Codec.BOOL) + .copyOnDeath() + .build() + ); private final PlayerListener playerListener = new PlayerListener(); From 4f328031aa3f53b345a747a0be2827c9c35a7a4b Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 6 Oct 2024 20:26:00 -0700 Subject: [PATCH 09/11] stay consistent across impls --- .../map/fabric/server/Pl3xMapFabricServer.java | 2 +- .../java/net/pl3x/map/neoforge/NeoForgeWorld.java | 12 +++++++++++- .../net/pl3x/map/neoforge/Pl3xMapNeoForge.java | 15 ++++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java b/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java index 32511ef94..22ec8d8d3 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java @@ -231,7 +231,7 @@ protected void loadBlocks() { Set, Block>> entries = this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet(); for (Map.Entry, Block> entry : entries) { if (getBlockRegistry().size() > BlockRegistry.MAX_INDEX) { - Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBlockRegistry().size(), entries.size() - getBlockRegistry().size())); + Logger.debug(String.format("Cannot register any more blocks. Registered: %d Unregistered: %d", getBlockRegistry().size(), entries.size() - getBlockRegistry().size())); break; } diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java index 79c7fd39a..e0e0ade83 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -36,8 +37,10 @@ import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.configuration.ColorsConfig; import net.pl3x.map.core.event.world.WorldLoadedEvent; +import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.markers.Point; import net.pl3x.map.core.player.Player; +import net.pl3x.map.core.registry.BiomeRegistry; import net.pl3x.map.core.util.Colors; import net.pl3x.map.core.util.Mathf; import net.pl3x.map.core.world.World; @@ -62,6 +65,7 @@ public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { init(); + // TODO: try using ATs to make the field public // we have to do all this because forge throws an error if we use ATs to make the field public :/ Field climateSettings = null; try { @@ -72,7 +76,13 @@ public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { } // register biomes - for (Map.Entry, Biome> entry : level.registryAccess().registryOrThrow(Registries.BIOME).entrySet()) { + Set, Biome>> entries = level.registryAccess().registryOrThrow(Registries.BIOME).entrySet(); + for (Map.Entry, Biome> entry : entries) { + if (getBiomeRegistry().size() > BiomeRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBiomeRegistry().size(), entries.size() - getBiomeRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); Biome biome = entry.getValue(); float temperature = Mathf.clamp(0.0F, 1.0F, biome.getBaseTemperature()); diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java index 2df475b88..b9af1530f 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.function.Supplier; import net.kyori.adventure.platform.AudienceProvider; @@ -51,7 +52,6 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModList; -import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.loading.FMLPaths; import net.neoforged.neoforge.attachment.AttachmentType; @@ -61,16 +61,17 @@ import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.neoforge.event.server.ServerStoppingEvent; import net.neoforged.neoforge.event.tick.ServerTickEvent; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforgespi.language.IModInfo; import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.event.server.ServerLoadedEvent; +import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.network.Constants; import net.pl3x.map.core.player.Player; import net.pl3x.map.core.player.PlayerListener; import net.pl3x.map.core.player.PlayerRegistry; +import net.pl3x.map.core.registry.BlockRegistry; import net.pl3x.map.core.world.World; import net.pl3x.map.neoforge.command.NeoForgeCommandManager; import org.jetbrains.annotations.NotNull; @@ -172,8 +173,6 @@ public void onServerStarted(@NotNull ServerStartedEvent event) { this.adventure = MinecraftServerAudiences.of(this.server); enable(); - - this.network.register(); } @SubscribeEvent @@ -275,7 +274,13 @@ public int getColorForPower(byte power) { @Override protected void loadBlocks() { - for (Map.Entry, Block> entry : this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet()) { + Set, Block>> entries = this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet(); + for (Map.Entry, Block> entry : entries) { + if (getBlockRegistry().size() > BlockRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more blocks. Registered: %d Unregistered: %d", getBlockRegistry().size(), entries.size() - getBlockRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); int color = entry.getValue().defaultMapColor().col; getBlockRegistry().register(id, color); From 8712916ee48cfd661aae0e45a215b7a82c4149f0 Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 6 Oct 2024 20:39:51 -0700 Subject: [PATCH 10/11] make world key consistent between webmap and server code --- .../map/core/renderer/task/UpdateSettingsData.java | 5 +++-- webmap/src/layergroup/MarkerLayer.ts | 2 +- webmap/src/settings/WorldSettings.ts | 8 +++++++- webmap/src/tilelayer/ReversedZoomTileLayer.ts | 2 +- webmap/src/world/World.ts | 12 ++++++++---- webmap/src/world/WorldManager.ts | 1 - 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/net/pl3x/map/core/renderer/task/UpdateSettingsData.java b/core/src/main/java/net/pl3x/map/core/renderer/task/UpdateSettingsData.java index 7e3e247ac..d216a6b89 100644 --- a/core/src/main/java/net/pl3x/map/core/renderer/task/UpdateSettingsData.java +++ b/core/src/main/java/net/pl3x/map/core/renderer/task/UpdateSettingsData.java @@ -118,7 +118,7 @@ public void run() { ui.put("attribution", config.UI_ATTRIBUTION); Map settings = new LinkedHashMap<>(); - settings.put("name", world.getName().replace(":", "-")); + settings.put("name", world.getName()); settings.put("tileUpdateInterval", 10); settings.put("spawn", spawn); settings.put("center", center); @@ -134,7 +134,8 @@ public void run() { }); Map worldsList = new LinkedHashMap<>(); - worldsList.put("name", world.getName().replace(":", "-")); + worldsList.put("name", world.getName()); + worldsList.put("directoryName", world.getName().replace(":", "-")); worldsList.put("displayName", config.DISPLAY_NAME .replace("", world.getName())); worldsList.put("type", world.getType().toString()); diff --git a/webmap/src/layergroup/MarkerLayer.ts b/webmap/src/layergroup/MarkerLayer.ts index f5f82cc0c..8daa16fdb 100644 --- a/webmap/src/layergroup/MarkerLayer.ts +++ b/webmap/src/layergroup/MarkerLayer.ts @@ -135,7 +135,7 @@ export class MarkerLayer extends L.LayerGroup { } } - getJSON(`tiles/${world.name}/markers/${this._key}.json`) + getJSON(`tiles/${world.directoryName}/markers/${this._key}.json`) .then((json): void => this.updateMarkers(json, world)); } diff --git a/webmap/src/settings/WorldSettings.ts b/webmap/src/settings/WorldSettings.ts index a4f413737..ffcf3d2db 100644 --- a/webmap/src/settings/WorldSettings.ts +++ b/webmap/src/settings/WorldSettings.ts @@ -6,6 +6,7 @@ import {Renderer} from "../world/World"; export class WorldSettings { private readonly _name: string; private readonly _displayName: string; + private readonly _directoryName: string; private readonly _type: string; private readonly _order: number; private readonly _renderers: Renderer[]; @@ -16,8 +17,9 @@ export class WorldSettings { private _zoom: Zoom = new Zoom(0, 3, 2); private _ui: UI = new UI() - constructor(name: string, displayName: string, type: string, order: number, renderers: Renderer[]) { + constructor(name: string, directoryName: string, displayName: string, type: string, order: number, renderers: Renderer[]) { this._name = name; + this._directoryName = directoryName; this._displayName = displayName; this._type = type; this._order = order; @@ -28,6 +30,10 @@ export class WorldSettings { return this._name; } + get directoryName(): string { + return this._directoryName; + } + get displayName(): string { return this._displayName; } diff --git a/webmap/src/tilelayer/ReversedZoomTileLayer.ts b/webmap/src/tilelayer/ReversedZoomTileLayer.ts index ece4b92b3..353ab6c18 100644 --- a/webmap/src/tilelayer/ReversedZoomTileLayer.ts +++ b/webmap/src/tilelayer/ReversedZoomTileLayer.ts @@ -9,7 +9,7 @@ export class ReversedZoomTileLayer extends L.TileLayer { private readonly _renderer: Label; constructor(pl3xmap: Pl3xMap, world: World, renderer: Renderer) { - super(`tiles/${world.name}/{z}/${renderer.label}/{x}_{y}.${pl3xmap.settings?.format}`, { + super(`tiles/${world.directoryName}/{z}/${renderer.label}/{x}_{y}.${pl3xmap.settings?.format}`, { // tile sizes match regions sizes (512 blocks x 512 blocks) tileSize: 512, // dont wrap tiles at edges diff --git a/webmap/src/world/World.ts b/webmap/src/world/World.ts index 1a19dd3d3..1d427224f 100644 --- a/webmap/src/world/World.ts +++ b/webmap/src/world/World.ts @@ -60,7 +60,7 @@ export class World { return Promise.resolve(this); } - getJSON(`tiles/${this.name}/biomes.gz`).then((json): void => { + getJSON(`tiles/${this.directoryName}/biomes.gz`).then((json): void => { Object.entries(json).forEach((data: [string, unknown]): void => { let name: string = data[1]; name = getLangName("biome", name); @@ -70,7 +70,7 @@ export class World { //TODO: Handle errors return new Promise((resolve): void => { - getJSON(`tiles/${this.name}/settings.json`) + getJSON(`tiles/${this.directoryName}/settings.json`) .then((settings: WorldSettings): void => { this._loaded = true; @@ -106,7 +106,7 @@ export class World { public loadMarkers(): void { this.initSSE(); - getJSON(`tiles/${this.name}/markers.json`) + getJSON(`tiles/${this.directoryName}/markers.json`) .then((json): void => { (json as MarkerLayer[]).forEach((layer: MarkerLayer): void => { const markerLayer: MarkerLayer = new MarkerLayer(layer.key, layer.label, layer.updateInterval, layer.showControls, layer.defaultHidden, layer.priority, layer.zIndex, layer.pane, layer.css); @@ -120,7 +120,7 @@ export class World { if (!this.settings.ui.blockinfo) { return; } - getBytes(`tiles/${this.name}/${zoom}/blockinfo/${x}_${z}.pl3xmap.gz`) + getBytes(`tiles/${this.directoryName}/${zoom}/blockinfo/${x}_${z}.pl3xmap.gz`) .then((buffer?: ArrayBuffer): void => { this.setBlockInfo(zoom, x, z, buffer); }); @@ -195,6 +195,10 @@ export class World { return this.settings.name; } + get directoryName(): string { + return this.settings.directoryName; + } + get displayName(): string { return this.settings.displayName; } diff --git a/webmap/src/world/WorldManager.ts b/webmap/src/world/WorldManager.ts index 3cad9a98e..1aead8f49 100644 --- a/webmap/src/world/WorldManager.ts +++ b/webmap/src/world/WorldManager.ts @@ -49,7 +49,6 @@ export class WorldManager { } public getWorld(world: string): World | undefined { - world = world.replace(/:/g, "-"); return this._worlds.get(world); } From 3b3e43333115f68dfaf13c8f504bd71323a88797 Mon Sep 17 00:00:00 2001 From: granny Date: Mon, 21 Jul 2025 14:45:19 -0700 Subject: [PATCH 11/11] update codebase --- .gitignore | 1 + .../pl3x/map/fabric/server/FabricWorld.java | 5 ++ .../server/command/FabricCommandManager.java | 1 - gradle/libs.versions.toml | 10 ++-- .../net/pl3x/map/neoforge/NeoForgePlayer.java | 19 +++--- .../net/pl3x/map/neoforge/NeoForgeWorld.java | 60 +++++++++---------- .../pl3x/map/neoforge/Pl3xMapNeoForge.java | 59 +++++++++--------- .../command/NeoForgeCommandManager.java | 17 +++--- .../map/neoforge/command/NeoForgeParsers.java | 5 +- .../map/neoforge/command/NeoForgeSender.java | 25 ++++---- settings.gradle.kts | 2 +- 11 files changed, 102 insertions(+), 102 deletions(-) diff --git a/.gitignore b/.gitignore index f132908ee..b6582131f 100644 --- a/.gitignore +++ b/.gitignore @@ -117,6 +117,7 @@ buildNumber.properties # Common working directory run/ +runs/ bin build .gradle diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java index 58b0b0010..53c97b4fa 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricWorld.java @@ -70,6 +70,11 @@ public FabricWorld(ServerLevel level, String name) { // register biomes Set, Biome>> entries = level.registryAccess().lookupOrThrow(Registries.BIOME).entrySet(); for (Map.Entry, Biome> entry : entries) { + if (getBiomeRegistry().size() > BiomeRegistry.MAX_INDEX) { + Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBiomeRegistry().size(), entries.size() - getBiomeRegistry().size())); + break; + } + String id = entry.getKey().location().toString(); Biome biome = entry.getValue(); float temperature = Mathf.clamp(0.0F, 1.0F, biome.getBaseTemperature()); diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/command/FabricCommandManager.java b/fabric/src/main/java/net/pl3x/map/fabric/server/command/FabricCommandManager.java index 5f1bc59a7..0c6446acd 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/command/FabricCommandManager.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/command/FabricCommandManager.java @@ -23,7 +23,6 @@ */ package net.pl3x.map.fabric.server.command; -import com.mojang.brigadier.arguments.StringArgumentType; import io.leangen.geantyref.TypeToken; import net.minecraft.commands.arguments.DimensionArgument; import net.pl3x.map.core.command.CommandHandler; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e1581f78..73dd98a02 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,8 +7,8 @@ fabricApi="0.129.0+1.21.8" fabricLoader="0.16.14" fabricLoom="1.11-SNAPSHOT" -neoforge="21.1.23" -neoGradle="7.0.145" +neoforge="21.8.2-beta" +neoGradle="7.0.190" neoforgeLoader="[4,)" minotaur="2.+" # https://github.com/modrinth/minotaur @@ -19,8 +19,7 @@ shadowJar="8.3.5" # https://github.com/GradleUp/shadow adventure="4.24.0-SNAPSHOT" # https://github.com/KyoriPowered/adventure adventureBukkit="4.4.1-granny-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform -adventureFabric="6.5.0-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform-fabric -adventureModded="6.0.0" # https://github.com/KyoriPowered/adventure-platform-fabric +adventureModded="6.5.0-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform-mod cloud="2.0.0" # https://github.com/incendo/cloud cloud-minecraft="2.0.0-beta.11" # https://github.com/Incendo/cloud-minecraft @@ -80,10 +79,9 @@ adventureTextSerializerPlain = { group = "net.kyori", name = "adventure-text-ser adventurePlatformFacet = { group = "net.kyori", name = "adventure-platform-facet", version.ref = "adventureBukkit" } adventurePlatformBukkit = { group = "net.kyori", name = "adventure-platform-bukkit", version.ref = "adventureBukkit" } -adventurePlatformFabric = { group = "net.kyori", name = "adventure-platform-fabric", version.ref = "adventureFabric" } +adventurePlatformFabric = { group = "net.kyori", name = "adventure-platform-fabric", version.ref = "adventureModded" } adventurePlatformNeoforge = { group = "net.kyori", name = "adventure-platform-neoforge", version.ref = "adventureModded" } - caffeine = { group = "com.github.ben-manes.caffeine", name = "caffeine", version.ref = "caffeine" } querzNbt = { group = "com.github.Querz", name = "NBT", version.ref = "querzNbt" } lz4Java = { group = "org.lz4", name = "lz4-java", version.ref = "lz4Java" } diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java index db2c31704..5a9c016aa 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgePlayer.java @@ -44,39 +44,40 @@ import net.pl3x.map.core.markers.Point; import net.pl3x.map.core.player.Player; import net.pl3x.map.core.world.World; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class NeoForgePlayer extends Player { - public NeoForgePlayer(@NotNull ServerPlayer player) { + public NeoForgePlayer(ServerPlayer player) { super(player.getScoreboardName(), player); } @Override @SuppressWarnings("unchecked") - public @NotNull ServerPlayer getPlayer() { + public ServerPlayer getPlayer() { return super.getPlayer(); } @Override - public @NotNull String getName() { + public String getName() { return getPlayer().getScoreboardName(); } @Override - public @NotNull UUID getUUID() { + public UUID getUUID() { return getPlayer().getUUID(); } @Override - public @NotNull World getWorld() { + public World getWorld() { ServerLevel level = (ServerLevel) getPlayer().level(); String name = level.dimension().location().toString(); return Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new NeoForgeWorld(level, name)); } @Override - public @NotNull Point getPosition() { + public Point getPosition() { Vec3 loc = getPlayer().position(); return Point.of(loc.x(), loc.z()); } @@ -153,7 +154,7 @@ public void setPersistentlyHidden(boolean hidden) { } @Override - public @NotNull String toString() { + public String toString() { return "NeoForgePlayer{" + "player=" + getPlayer().getUUID() + "}"; diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java index e0e0ade83..6e5b6ad72 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/NeoForgeWorld.java @@ -23,8 +23,8 @@ */ package net.pl3x.map.neoforge; -import java.lang.reflect.Field; import java.util.Collection; +import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -32,6 +32,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeManager; import net.pl3x.map.core.Pl3xMap; @@ -44,18 +45,19 @@ import net.pl3x.map.core.util.Colors; import net.pl3x.map.core.util.Mathf; import net.pl3x.map.core.world.World; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class NeoForgeWorld extends World { private final ServerLevel level; - public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { + public NeoForgeWorld(ServerLevel level, String name) { super( name, level.getSeed(), Point.of(level.getLevelData().getSpawnPos().getX(), level.getLevelData().getSpawnPos().getZ()), Type.get(level.dimension().location().toString()), - level.getChunkSource().getDataStorage().dataFolder.toPath().getParent().resolve("region") + level.getChunkSource().getDataStorage().dataFolder.getParent().resolve("region") ); this.level = level; @@ -65,18 +67,8 @@ public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { init(); - // TODO: try using ATs to make the field public - // we have to do all this because forge throws an error if we use ATs to make the field public :/ - Field climateSettings = null; - try { - //noinspection JavaReflectionMemberAccess - climateSettings = Biome.class.getDeclaredField("f_47437_"); // climateSettings - climateSettings.setAccessible(true); - } catch (Throwable ignore) { - } - // register biomes - Set, Biome>> entries = level.registryAccess().registryOrThrow(Registries.BIOME).entrySet(); + Set, Biome>> entries = level.registryAccess().lookupOrThrow(Registries.BIOME).entrySet(); for (Map.Entry, Biome> entry : entries) { if (getBiomeRegistry().size() > BiomeRegistry.MAX_INDEX) { Logger.debug(String.format("Cannot register any more biomes. Registered: %d Unregistered: %d", getBiomeRegistry().size(), entries.size() - getBiomeRegistry().size())); @@ -86,16 +78,11 @@ public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { String id = entry.getKey().location().toString(); Biome biome = entry.getValue(); float temperature = Mathf.clamp(0.0F, 1.0F, biome.getBaseTemperature()); - float humidity = 0.5F; - if (climateSettings != null) { - try { - humidity = Mathf.clamp(0.0F, 1.0F, ((Biome.ClimateSettings) climateSettings.get(biome)).downfall()); - } catch (Throwable ignore) { - } - } + float humidity = Mathf.clamp(0.0F, 1.0F, biome.getModifiedClimateSettings().downfall()); getBiomeRegistry().register( id, ColorsConfig.BIOME_COLORS.getOrDefault(id, 0), + ColorsConfig.BIOME_DRY_FOLIAGE.getOrDefault(id, biome.getSpecialEffects().getDryFoliageColorOverride().orElse(Colors.getDefaultDryFoliageColor(temperature, humidity))), ColorsConfig.BIOME_FOLIAGE.getOrDefault(id, biome.getSpecialEffects().getFoliageColorOverride().orElse(Colors.getDefaultFoliageColor(temperature, humidity))), ColorsConfig.BIOME_GRASS.getOrDefault(id, biome.getSpecialEffects().getGrassColorOverride().orElse(Colors.getDefaultGrassColor(temperature, humidity))), ColorsConfig.BIOME_WATER.getOrDefault(id, biome.getSpecialEffects().getWaterColor()), @@ -110,8 +97,8 @@ public NeoForgeWorld(@NotNull ServerLevel level, @NotNull String name) { @Override @SuppressWarnings({"unchecked"}) - public @NotNull T getLevel() { - return (@NotNull T) this.level; + public T getLevel() { + return (T) this.level; } @Override @@ -126,12 +113,17 @@ public boolean hasCeiling() { @Override public int getMinBuildHeight() { - return this.level.getMinBuildHeight(); + return this.level.getMinY(); } @Override public int getMaxBuildHeight() { - return this.level.getMaxBuildHeight(); + return this.level.getMaxY() + 1; + } + + @Override + public int getDimensionHeight() { + return this.level.dimensionType().height(); } @Override @@ -160,15 +152,19 @@ public double getBorderMaxZ() { } @Override - public @NotNull Collection<@NotNull Player> getPlayers() { - return this.getLevel().players().stream() - .map(player -> Pl3xMap.api().getPlayerRegistry().get(player.getUUID())) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); + public Collection getPlayers() { + Set players = new HashSet<>(); + for (ServerPlayer serverPlayer : this.getLevel().players()) { + Player player = Pl3xMap.api().getPlayerRegistry().get(serverPlayer.getUUID()); + if (player != null) { + players.add(player); + } + } + return players; } @Override - public @NotNull String toString() { + public String toString() { return "NeoForgeWorld{" + "name=" + getName() + ",seed=" + getSeed() diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java index b9af1530f..29a20a442 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/Pl3xMapNeoForge.java @@ -74,17 +74,18 @@ import net.pl3x.map.core.registry.BlockRegistry; import net.pl3x.map.core.world.World; import net.pl3x.map.neoforge.command.NeoForgeCommandManager; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; @Mod("pl3xmap") +@NullMarked public class Pl3xMapNeoForge extends Pl3xMap { private static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, Constants.MODID); public static final Supplier> HIDDEN = Pl3xMapNeoForge.ATTACHMENT_TYPES.register( "hidden", () -> AttachmentType.builder(() -> false) - .serialize(Codec.BOOL) + .serialize(Codec.BOOL.fieldOf("hidden")) .copyOnDeath() .build() ); @@ -121,26 +122,21 @@ public Pl3xMapNeoForge(IEventBus eventBus) { } @SubscribeEvent - public void onServerTick(ServerTickEvent.@NotNull Post event) { - if (this.tick++ >= 20) { - this.tick = 0; - getScheduler().tick(); - } + public void onServerTick(ServerTickEvent.Post event) { + getScheduler().tick(); } @SubscribeEvent - public void onPlayerLoggedIn(PlayerEvent.@NotNull PlayerLoggedInEvent event) { - PlayerRegistry registry = Pl3xMap.api().getPlayerRegistry(); - UUID uuid = event.getEntity().getUUID(); - Player forgePlayer = registry.getOrDefault(uuid, () -> new NeoForgePlayer((ServerPlayer) event.getEntity())); + public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + ServerPlayer serverPlayer = (ServerPlayer) event.getEntity(); + Player forgePlayer = getPlayerRegistry().getOrDefault(serverPlayer.getUUID(), () -> new NeoForgePlayer(serverPlayer)); this.playerListener.onJoin(forgePlayer); } @SubscribeEvent - public void onPlayerLoggedOut(PlayerEvent.@NotNull PlayerLoggedOutEvent event) { - PlayerRegistry registry = Pl3xMap.api().getPlayerRegistry(); - UUID uuid = event.getEntity().getUUID(); - Player forgePlayer = registry.unregister(uuid); + public void onPlayerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) { + ServerPlayer serverPlayer = (ServerPlayer) event.getEntity(); + Player forgePlayer = getPlayerRegistry().unregister(serverPlayer.getUUID()); if (forgePlayer != null) { this.playerListener.onQuit(forgePlayer); } @@ -168,7 +164,7 @@ public void onWorldUnload(LevelEvent.Unload event) { } @SubscribeEvent - public void onServerStarted(@NotNull ServerStartedEvent event) { + public void onServerStarted(ServerStartedEvent event) { this.server = event.getServer(); this.adventure = MinecraftServerAudiences.of(this.server); @@ -176,7 +172,7 @@ public void onServerStarted(@NotNull ServerStartedEvent event) { } @SubscribeEvent - public void onServerStopping(@NotNull ServerStoppingEvent event) { + public void onServerStopping(ServerStoppingEvent event) { this.network.unregister(); disable(); @@ -199,7 +195,7 @@ public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { } } - public @NotNull IModInfo getModInfo() { + public IModInfo getModInfo() { if (this.modInfo == null) { this.modInfo = ModList.get().getModContainerById("pl3xmap").orElseThrow().getModInfo(); } @@ -207,12 +203,12 @@ public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { } @Override - public @NotNull String getPlatform() { + public String getPlatform() { return this.server.getServerModName().toLowerCase(Locale.ROOT); } @Override - public @NotNull String getVersion() { + public String getVersion() { return getModInfo().getVersion().toString(); } @@ -228,11 +224,11 @@ public boolean getOnlineMode() { @Override public String getServerVersion() { - return SharedConstants.getCurrentVersion().getName(); + return SharedConstants.getCurrentVersion().name(); } @Override - public @NotNull AudienceProvider adventure() { + public AudienceProvider adventure() { if (this.adventure == null) { throw new IllegalStateException("Tried to access Adventure without a running server!"); } @@ -240,12 +236,12 @@ public String getServerVersion() { } @Override - public @NotNull Path getMainDir() { + public Path getMainDir() { return FMLPaths.GAMEDIR.get().resolve("config").resolve("pl3xmap"); } @Override - public @NotNull Path getJarPath() { + public Path getJarPath() { return getModInfo().getOwningFile().getFile().getFilePath(); } @@ -255,9 +251,9 @@ public int getColorForPower(byte power) { } @Override - public net.pl3x.map.core.world.@Nullable Block getFlower(@NotNull World world, net.pl3x.map.core.world.@NotNull Biome biome, int blockX, int blockY, int blockZ) { + public net.pl3x.map.core.world.@Nullable Block getFlower(World world, net.pl3x.map.core.world.Biome biome, int blockX, int blockY, int blockZ) { // https://github.com/Draradech/FlowerMap (CC0-1.0 license) - Biome nms = world.getLevel().registryAccess().registryOrThrow(Registries.BIOME).get(ResourceLocation.parse(biome.getKey())); + Biome nms = world.getLevel().registryAccess().lookupOrThrow(Registries.BIOME).getValue(ResourceLocation.parse(biome.getKey())); if (nms == null) { return null; } @@ -265,16 +261,15 @@ public int getColorForPower(byte power) { if (flowers.isEmpty()) { return null; } - RandomPatchConfiguration config = (RandomPatchConfiguration) flowers.get(0).config(); + RandomPatchConfiguration config = (RandomPatchConfiguration) flowers.getFirst().config(); SimpleBlockConfiguration flower = (SimpleBlockConfiguration) config.feature().value().feature().value().config(); Block block = flower.toPlace().getState(this.randomSource, new BlockPos(blockX, blockY, blockZ)).getBlock(); - ResourceLocation key = BuiltInRegistries.BLOCK.getKey(block); - return key == null ? null : getBlockRegistry().get(key.toString()); + return getBlockRegistry().get(BuiltInRegistries.BLOCK.getKey(block).toString()); } @Override protected void loadBlocks() { - Set, Block>> entries = this.server.registryAccess().registryOrThrow(Registries.BLOCK).entrySet(); + Set, Block>> entries = this.server.registryAccess().lookupOrThrow(Registries.BLOCK).entrySet(); for (Map.Entry, Block> entry : entries) { if (getBlockRegistry().size() > BlockRegistry.MAX_INDEX) { Logger.debug(String.format("Cannot register any more blocks. Registered: %d Unregistered: %d", getBlockRegistry().size(), entries.size() - getBlockRegistry().size())); @@ -305,7 +300,7 @@ protected void loadPlayers() { } @Override - public @NotNull World cloneWorld(@NotNull World world) { + public World cloneWorld(World world) { return new NeoForgeWorld(world.getLevel(), world.getName()); } diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java index 94d0183e1..4cf7fca3f 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeCommandManager.java @@ -34,11 +34,12 @@ import org.incendo.cloud.brigadier.CloudBrigadierManager; import org.incendo.cloud.execution.ExecutionCoordinator; import org.incendo.cloud.neoforge.NeoForgeServerCommandManager; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked; +@NullMarked public class NeoForgeCommandManager implements CommandHandler { - private final NeoForgeServerCommandManager<@NotNull Sender> manager; - private final Command.Builder<@NotNull Sender> root; + private final NeoForgeServerCommandManager manager; + private final Command.Builder root; public NeoForgeCommandManager() { this.manager = new NeoForgeServerCommandManager<>( @@ -46,10 +47,10 @@ public NeoForgeCommandManager() { SenderMapper.create(NeoForgeSender::create, Sender::getSender) ); - CloudBrigadierManager<@NotNull Sender, ?> brigadier = getManager().brigadierManager(); + CloudBrigadierManager brigadier = getManager().brigadierManager(); brigadier.setNativeNumberSuggestions(false); brigadier.registerMapping(new TypeToken>() { - }, builder -> builder.toConstant(DimensionArgument.dimension()).cloudSuggestions()); + }, builder -> builder.cloudSuggestions().toConstant(DimensionArgument.dimension())); setupExceptionHandlers(); @@ -59,17 +60,17 @@ public NeoForgeCommandManager() { } @Override - public @NotNull NeoForgeServerCommandManager<@NotNull Sender> getManager() { + public NeoForgeServerCommandManager getManager() { return this.manager; } @Override - public @NotNull PlatformParsers getPlatformParsers() { + public PlatformParsers getPlatformParsers() { return new NeoForgeParsers(); } @Override - public Command.@NotNull Builder<@NotNull Sender> getRoot() { + public Command.Builder getRoot() { return this.root; } } diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java index 25a1fc9ca..0331e739c 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeParsers.java @@ -12,7 +12,10 @@ import org.incendo.cloud.minecraft.modded.data.SinglePlayerSelector; import org.incendo.cloud.minecraft.modded.parser.VanillaArgumentParsers; import org.incendo.cloud.parser.ParserDescriptor; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class NeoForgeParsers implements PlatformParsers { @Override public ParserDescriptor columnPosParser() { @@ -35,7 +38,7 @@ public Point resolvePointFromColumnPos(String name, CommandContext conte } @Override - public Player resolvePlayerFromPlayerSelector(String name, CommandContext context) { + public @Nullable Player resolvePlayerFromPlayerSelector(String name, CommandContext context) { Sender sender = context.sender(); SinglePlayerSelector playerSelector = context.getOrDefault(name, null); if (playerSelector == null) { diff --git a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java index 70f316f7c..8cb2fda6c 100644 --- a/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java +++ b/neoforge/src/main/java/net/pl3x/map/neoforge/command/NeoForgeSender.java @@ -32,29 +32,30 @@ import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.command.Sender; import net.pl3x.map.core.world.World; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class NeoForgeSender extends Sender { - public static @NotNull Sender create(@NotNull CommandSourceStack stack) { + public static Sender create(CommandSourceStack stack) { if (stack.source instanceof ServerPlayer) { return new Player(stack); } return new NeoForgeSender(stack); } - public NeoForgeSender(@NotNull CommandSourceStack sender) { + public NeoForgeSender(CommandSourceStack sender) { super(sender); } @Override @SuppressWarnings("unchecked") - public @NotNull CommandSourceStack getSender() { + public CommandSourceStack getSender() { return super.getSender(); } @Override - public @NotNull Audience audience() { + public Audience audience() { return ((MinecraftServerAudiences) Pl3xMap.api().adventure()).audience(getSender()); } @@ -79,29 +80,29 @@ public int hashCode() { } @Override - public @NotNull String toString() { + public String toString() { return "ForgeSender{" + "sender=" + getSender().getTextName() + "}"; } public static class Player extends NeoForgeSender implements Audience, Sender.Player { - public Player(@NotNull CommandSourceStack sender) { + public Player(CommandSourceStack sender) { super(sender); } @Override - public @NotNull ServerPlayer getPlayer() { + public ServerPlayer getPlayer() { return (ServerPlayer) getSender().source; } @Override - public @NotNull Audience audience() { + public Audience audience() { return Pl3xMap.api().adventure().player(getPlayer().getUUID()); } @Override - public @NotNull UUID getUUID() { + public UUID getUUID() { return getPlayer().getUUID(); } @@ -111,7 +112,7 @@ public Player(@NotNull CommandSourceStack sender) { } @Override - public @NotNull String toString() { + public String toString() { return "ForgeSender$Player{" + "player=" + getPlayer().getUUID() + "}"; diff --git a/settings.gradle.kts b/settings.gradle.kts index a9418bf8a..64976632c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,5 +11,5 @@ rootProject.name = "Pl3xMap" include("core") include("bukkit") include("fabric") -include ("neoforge") +include("neoforge") include("webmap")