Incendo / cloud-minecraft

Integrations between Minecraft and Cloud Command Framework
https://cloud.incendo.org/minecraft/
MIT License
25 stars 8 forks source link

Command execution fails when commands with same path but different arguments are registered #90

Closed Artuto closed 1 month ago

Artuto commented 1 month ago

I have two command methods:

    @Command("mb off")
    @Permission("mb.command.off")
    public void turnOffSelf(Player player)
    {
        // Do stuff
    }

    @Command("mb off <player>")
    @Permission("mb.command.off.other")
    public void turnOffOther(CommandSourceStack source, @Argument Player player,
                            @Flag(value = "silent", aliases = "s") boolean silent)
    {
        // Do other stuff
    }

But when executing /mb off without arguments it should execute the first command, but instead it throws an exception:

[16:56:57 ERROR]: [ModernBoard] Exception executing command handler
java.lang.IllegalArgumentException: Could not create value for parameter 'player' of type 'org.bukkit.entity.Player' in method 'MethodHandle(Player)void'
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.annotations.method.AnnotatedMethodHandler.createParameterValues(AnnotatedMethodHandler.java:212) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.annotations.method.AnnotatedMethodHandler.createParameterValues(AnnotatedMethodHandler.java:170) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.annotations.method.AnnotatedMethodHandler.createParameterValues(AnnotatedMethodHandler.java:156) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.annotations.MethodCommandExecutionHandler.executeFuture(MethodCommandExecutionHandler.java:89) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.execution.ExecutionCoordinatorImpl.lambda$coordinateExecution$4(ExecutionCoordinatorImpl.java:121) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?]
        at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.execution.ExecutionCoordinatorImpl$NonSchedulingExecutor.execute(ExecutionCoordinatorImpl.java:53) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1184) ~[?:?]
        at java.base/java.util.concurrent.CompletableFuture.thenComposeAsync(CompletableFuture.java:2352) ~[?:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.execution.ExecutionCoordinatorImpl.coordinateExecution(ExecutionCoordinatorImpl.java:104) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.StandardCommandExecutor.executeCommand(StandardCommandExecutor.java:91) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.StandardCommandExecutor.executeCommand(StandardCommandExecutor.java:65) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at ModernBoard-1.0-SNAPSHOT.jar/net.craftium.modernboard.libs.cloud.brigadier.CloudBrigadierCommand.run(CloudBrigadierCommand.java:94) ~[ModernBoard-1.0-SNAPSHOT.jar:?]
        at com.mojang.brigadier.context.ContextChain.runExecutable(ContextChain.java:73) ~[brigadier-1.2.9.jar:?]
        at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:31) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:19) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.execution.UnboundEntryAction.lambda$bind$0(UnboundEntryAction.java:8) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.execution.CommandQueueEntry.execute(CommandQueueEntry.java:5) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.execution.ExecutionContext.runCommandQueue(ExecutionContext.java:103) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.Commands.executeCommandInContext(Commands.java:443) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.Commands.performCommand(Commands.java:350) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.Commands.performCommand(Commands.java:337) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.commands.Commands.performCommand(Commands.java:332) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.performUnsignedChatCommand(ServerGamePacketListenerImpl.java:2148) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$11(ServerGamePacketListenerImpl.java:2122) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.TickTask.run(TickTask.java:18) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:151) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1536) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:201) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:125) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1513) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1506) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.util.thread.BlockableEventLoop.runAllTasks(BlockableEventLoop.java:114) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1628) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1303) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[prismarine-1.21.jar:1.21-7-b67a5a4]
        at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]

Executing the command with a player name as argument works as expected.

Library versions:

jpenilla commented 1 month ago

Player does not extend or implement CommandSourceStack. Your first method has no sender parameter and an extraneous player parameter that does not correspond to a command argument.

Artuto commented 1 month ago

So how does one limit a command to players now?

jpenilla commented 1 month ago

You can create a small wrapper around CommandSourceStack (ie interface PlayerStack extends EntityStack extends GenericStack) and choose which one to create based on the source in your sender mapper.