public abstract class BaseCommands implements CommandExecutor { @Getter private final CommandInfo commandInfo; public BaseCommands() { commandInfo = getClass().getDeclaredAnnotation(CommandInfo.class); Objects.requireNonNull(commandInfo, "Commands must have CommandInfo annotations"); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if(!getCommandInfo().permission().isEmpty()) { if(!sender.hasPermission(commandInfo.permission())) { sender.sendMessage(ChatColor.RED + "You don't have the permission to execute this command."); return true; } } if(commandInfo.playerCanDoIt()) { if(sender instanceof Player) { Player player = (Player) sender; execute(player, args); return true; } } if(commandInfo.consoleCanDoIt()) { if(!(sender instanceof Player)) { execute(sender, args); return true; } } return true; } public void execute(Player player, String[] args) {} public void execute(CommandSender sender, String[] args) {} }