Uploaded image for project: 'Minecraft: Java Edition'
  1. Minecraft: Java Edition
  2. MC-278771

Incorrect command context used when providing suggestions for redirected commands

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • None
    • 1.21.4
    • None
    • Confirmed
    • Commands
    • Normal
    • Platform

      How to reproduce:

      • Type the following command in chat without executing it
      /execute as @s run advancement grant @s only minecraft:adventure/adventuring_time 
      • Press space to be prompted with suggestions for the specific advancement criterion to grant
      • Observe there are no suggestions provided and there is an error in the log
      [Server thread/ERROR] (Minecraft) Failed to handle packet net.minecraft.network.protocol.game.ServerboundCommandSuggestionPacket@5e761b9f, suppressing error java.lang.IllegalArgumentException: No such argument 'advancement' exists on this command    at com.mojang.brigadier.context.CommandContext.getArgument(CommandContext.java:102)    at net.minecraft.commands.arguments.ResourceKeyArgument.getRegistryKey(ResourceKeyArgument.java:60)    at net.minecraft.commands.arguments.ResourceKeyArgument.getAdvancement(ResourceKeyArgument.java:94)    at net.minecraft.server.commands.AdvancementCommands.method_12991(AdvancementCommands.java:52)    at com.mojang.brigadier.tree.ArgumentCommandNode.listSuggestions(ArgumentCommandNode.java:71)     at com.mojang.brigadier.CommandDispatcher.getCompletionSuggestions(CommandDispatcher.java:541)     at com.mojang.brigadier.CommandDispatcher.getCompletionSuggestions(CommandDispatcher.java:523)     at net.minecraft.server.network.ServerGamePacketListenerImpl.handleCustomCommandSuggestions(ServerGamePacketListenerImpl.java:568)    at net.minecraft.network.protocol.game.ServerboundCommandSuggestionPacket.handle(ServerboundCommandSuggestionPacket.java:37)    at net.minecraft.network.protocol.game.ServerboundCommandSuggestionPacket.handle(ServerboundCommandSuggestionPacket.java:9)    at net.minecraft.network.protocol.PacketUtils.method_11072(PacketUtils.java:27)    at net.minecraft.server.TickTask.run(TickTask.java:18)    at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:164)    at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:23)    at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:889)    at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:180)    at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:138)    at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:871)    at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:865)    at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:147)    at net.minecraft.server.MinecraftServer.managedBlock(MinecraftServer.java:829)    at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:836)    at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:719)    at net.minecraft.server.MinecraftServer.method_29739(MinecraftServer.java:292)    at java.base/java.lang.Thread.run(Thread.java:1583)  

      This also affects the attribute command:

      /execute as @s run attribute @s minecraft:armor modifier remove  

      Code Analysis:

      For the advancement criterion in net.minecraft.server.commands.AdvancementCommands:

      Commands.argument("criterion", StringArgumentType.greedyString())   
          .suggests((context, builder) -> SharedSuggestionProvider.suggest(
              ResourceKeyArgument.getAdvancement(context, "advancement").value().criteria().keySet(), builder
          )) 

      The suggestion provider tries to get the "advancement" argument from the context, however when CommandDispatcher.getCompletionSuggestions is called it passes the CommandContext built from ParseResults.getContext which doesn't take into account the proper context chain depending on which node is providing suggestions but instead provides the root /execute command CommandContext.

      A suggested solution would be to have CommandContextBuilder.findSuggestionContext also return the relevant context builder for the suggestion as it already searches through all of it's children to find the correct CommandNode. Then you could simply use this CommandContextBuilder to construct the correct context for the suggestions.

      See relevant pull request: https://github.com/Mojang/brigadier/pull/156

            Unassigned Unassigned
            senseiwells Sensei
            Votes:
            2 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              CHK: