Proxied commandsenders
The CommandAPI has extra support for vanilla Minecraft's /execute
command, by allowing the CommandSender to be an instance of the ProxiedCommandSender
class. This allows the CommandSender to contain two extra pieces of information: The "proxied sender" and the original sender.
Example - Running a command as a chicken
Say we have a command which kills the sender of a command. This is easily implemented as follows:
new CommandAPICommand("killme")
.executesPlayer((player, args) -> {
player.setHealth(0);
})
.register();
CommandAPICommand("killme")
.executesPlayer(PlayerCommandExecutor { player, _ ->
player.setHealth(0.0)
})
.register()
But what if the sender of the command is not a player? By using Minecraft's /execute
command, we could execute the command as any arbitrary entity, as shown with the command below:
/execute as @e[type=chicken] run killme
To handle this case, we can use the .executesProxy()
method to ensure that the command sender is a ProxiedCommandSender
. Then, we can kill the callee
(the entity which is being 'forced' to run the command /killme)
new CommandAPICommand("killme")
.executesPlayer((player, args) -> {
player.setHealth(0);
})
.executesProxy((proxy, args) -> {
// Check if the callee (target) is an Entity and kill it
if (proxy.getCallee() instanceof LivingEntity target) {
target.setHealth(0);
}
})
.register();
CommandAPICommand("killme")
.executesPlayer(PlayerCommandExecutor { player, _ ->
player.setHealth(0.0)
})
.executesProxy(ProxyCommandExecutor { proxy, _ ->
// Check if the callee (target) is an Entity and kill it
if (proxy.callee is LivingEntity) {
(proxy.callee as LivingEntity).setHealth(0.0)
}
})
.register()
This allows the command above to run successfully, killing all chickens it can find.