Players cannot run Entity executors
willkroboth opened this issue · comments
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):
9.0.0 (focus line 95):
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
.
I'd say the 8.8.0 behaviour is correct. What we could've done for 9.0.0 is to take the inheritance into account for the wrapper classes but I'd say waiting for your command build rewrite is fine.