Cache Bukkit Command when wrapping CommandNodes #11789
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Reopens #11385.
Resolves #11378 by "restoring" the Spigot behavior where VanillaCommandNodes are only created once. Before this commit,
BukkitBrigForwardingMap
would create a newVanillaCommandWrapper
each time aCommandNode
was requested via the BukkitCommandMap
. This meant that calls toCommand#setPermission
would not persist between retrievals from the map.This allows command frameworks that insert
CommandNode
s directly into the Brigadier dispatcher to change the permission String of theVanillaCommandNode
s created for their commands, rather than it always being the default"minecraft.commands.<name>"
.As discussed on the original PR, it's probably a good idea to eventually migrate the behavior of
Bukkit#dispatchCommand
to use Brigadier directly rather than working via the BukkitCommandMap
, which causes issues like this. Now that the hardfork is real, Paper may eventually fully removeCommandMap
in favor of direct Brigadier API, which would make fixingCommandMap
behavior like this PR does irrelevant. However, I feel like while Paper is still using theCommandMap
fixes like this are still valuable.If we'd rather fix #11378 by changing the implementation of
Bukkit#dispatchCommand
to use Brigadier directly, feel free to close this PR. Although, while not a requirement of the Map interface, it is also neat whenmap.get(a) == map.get(a)
for alla
, which isn't necessarily true for theBukkitBrigForwardingMap
before this PR.