-
-
Notifications
You must be signed in to change notification settings - Fork 75
Description
CommandAPI version
9.4.2
Minecraft version
1.19.4
Are you shading the CommandAPI?
Yes
What I did
I registered the following command with CommandAPI 9.4.2 and 8.8.0 (whose latest supported version is 1.19.4):
new CommandAPICommand("test")
.executesEntity((entity, args) -> {
Bukkit.getServer().broadcastMessage(entity + " ran the command");
})
.register();What actually happened
When using 9.4.2 (plugin jar: 9.4.2.zip), running /test as a player will result in the message This command has no implementations for craftplayer:
What should have happened
When using 8.8.0 (plugin jar: 8.8.0.zip), running /test as a player runs the code defined in executesEntity:
Server logs and CommandAPI config
No response
Other
I believe this change was introduced in 9.0.0 due to #378. That changed this code in CommandAPIExecutor like so:
8.8.0 (focus line 104):
https://github.com/JorelAli/CommandAPI/blob/aff3dc62f045fa0377bff311fab2271f066d5fee/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIExecutor.java#L98-L120
9.0.0 (focus line 95):
https://github.com/JorelAli/CommandAPI/blob/d3f17da0f67ed0de99f7e79f3e85a1e2ce220632/commandapi-core/src/main/java/dev/jorel/commandapi/CommandAPIExecutor.java#L89-L111
The relevant change here is sender instanceof Entity && matches(executors, ExecutorType.ENTITY) to info.senderWrapper() instanceof AbstractEntity && matches(executors, ExecutorType.ENTITY). In 8.8.0, a Player is an instance of Entity, while in 9.0.0, an AbstractPlayer is not an instance of AbstractEntity. Hence, the player is allowed to use the executesEntity executor in 8.8.0, but not 9.0.0 or later.
I noticed this 'issue' when I refactored the executor system in commit 62d5ea5 on the dev/command-build-rewrite branch. I unknowingly reintroduced the logic from 8.8.0 where the executor is selected using the platform-specific senders.
dev/command-build-rewrite (focus line 32)
Hence, if you execute the same test command using this branch (plugin jar: command-build-rewrite.zip), you get the 8.8.0 behavior where the code in executesEntity is run.
I think the 8.8.0 behavior is correct. It is still possible to run different code if the sender is a player using executesPlayer.
new CommandAPICommand("test")
.executesPlayer((player, args) -> {
// Run if player
})
.executesEntity((entity, args) -> {
// Otherwise, run if entity
})
.register();If the 8.8.0 behavior is correct, then this issue is already fixed on dev/command-build-rewrite, so I think we can just wait for that to be merged. If the 9.4.2 behavior is correct, then I'll make sure to take that into account on dev/command-build-rewrite.

