Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите CommandSender & Player

А ведь всего-то пару исправлений...

Java:
public static final Logger logg = Logger.getLogger("Debug");
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      Player p = (Player)sender;
      if(command.getName().equalsIgnoreCase("lvl"))
        {
        logg.info("Debug true");
        p.sendMessage( "Ваш уровень:" + ChatColor.RED + p.getExhaustion());
        }
      return true;
  }
 
А ведь всего-то пару исправлений...

Java:
public static final Logger logg = Logger.getLogger("Debug");
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      Player p = (Player)sender;
      if(command.getName().equalsIgnoreCase("lvl"))
        {
        logg.info("Debug true");
        p.sendMessage( "Ваш уровень:" + ChatColor.RED + p.getExhaustion());
        }
      return true;
  }
Спасибо , я уже во всем разобрался =)
 
Если команду набрать из консоли - вывалится exception. Круто, ага.
Ммм, а может быть нужно было сказать, что нужна работоспособность и из консоли?

Есть такие прекрасные строчки:

Код:
if(sender instanceof Console) {
//тут выполняем действие, если пишем команду из консоли
}
 
Эта работоспособность необходима всегда. Хотя да, если тебе эти ошибки не важны - можешь даже не вникать.

Ой, instanceof... У меня для тебя плохие новости - http://habrahabr.ru/post/132241/
Тогда что же использовать?
Это?
Java:
Player player;
try {
    player = (Player) sender;
} catch (Exception exc) {}
if (player == null) {
    //your code here
}
(Тред не читал)
 
Эта работоспособность необходима всегда. Хотя да, если тебе эти ошибки не важны - можешь даже не вникать.

Ой, instanceof... У меня для тебя плохие новости - http://habrahabr.ru/post/132241/
Начнем с того, что у кого ты просишь выдать тебе exp? У консоли?

Раз уж хочешь работоспособность и из косноли, то нужно сделать, чтобы команда работала и для остальных людей.

Я тут набросал
Java:
    if(command.getName().equalsIgnoreCase("exp"))
        {   
                if(!p.hasPermission("exp.getexp"))
                {
                    p.sendMessage("You dont has permission!");
                    return true;
                }
                if(args.length == 0){
                    p.sendMessage("You exp: " + p.getExp());
                }
                else if(args.length == 1)
                {
                    if(!p.hasPermission("exp.getotherexp"))
                    {
                        p.sendMessage("You dont has parmission!");
                        return true;
                    }
                    if(!Bukkit.getOfflinePlayer(args[0]).isOnline())
                    {
                        p.sendMessage(args[0] +" not online!");
                    }
                    Player pl = Bukkit.getPlayer(args[0]);
                    p.sendMessage(args[0] + "'s exp: " + pl.getExp());
                    return true;
                }
        }
Можно добавить еще пару условий, если sender консоль, тогда выводить "Используйте /exp <player>".
И т.д.
Если нужно, могу написать полноценный плагин для этого дела... D:
 
Начнем с того, что у кого ты просишь выдать тебе exp? У консоли?

Раз уж хочешь работоспособность и из косноли, то нужно сделать, чтобы команда работала и для остальных людей.

Я тут набросал
Java:
    if(command.getName().equalsIgnoreCase("exp"))
        { 
                if(!p.hasPermission("exp.getexp"))
                {
                    p.sendMessage("You dont has permission!");
                    return true;
                }
                if(args.length == 0){
                    p.sendMessage("You exp: " + p.getExp());
                }
                else if(args.length == 1)
                {
                    if(!p.hasPermission("exp.getotherexp"))
                    {
                        p.sendMessage("You dont has parmission!");
                        return true;
                    }
                    if(!Bukkit.getOfflinePlayer(args[0]).isOnline())
                    {
                        p.sendMessage(args[0] +" not online!");
                    }
                    Player pl = Bukkit.getPlayer(args[0]);
                    p.sendMessage(args[0] + "'s exp: " + pl.getExp());
                    return true;
                }
        }
Можно добавить еще пару условий, если sender консоль, тогда выводить "Используйте /exp <player>".
И т.д.
Если нужно, могу написать полноценный плагин для этого дела... D:
Напиши, и сорцы дай :DD
 
Я тут набросал

>>Bukkit.getOfflinePlayer(args[0]).isOnline()
args[0] может быть не задан или указывать на несуществующего игрока, getOfflinePlayer() вернет null, команда выплюнет NPE в консоли... Ты профессионал, да.

В моем понимании даже такие мелкие (да и вообще любые исключительные) вещи нужно предусматривать. Плагин (комманда, листенер, етц) не должен выплевывать ошибку при любом наборе входных данных.

А если кодеру нравится писать с такими ошибками, то пусть пишет.
 
Как вам такой способ?
Создаем абстрактный класс обработчика команд.
Java:
public abstract class MyExecutor implements CommandExecutor {
 
    @Override public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) {
        try{
            Queue<String> words = new LinkedList<String>(Arrays.asList(args));
            command(sender,words);
        } catch (Throwable t){
            sender.sendMessage("Ошибка: "+t.getMessage());
        }
        return true;
    }
 
    abstract public void command(CommandSender sender,Queue<String> words) throws Throwable;
}

А теперь свой обработчик, таким образом:
Java:
public class CommandMyPlugin extends MyExecutor {
 
    @Override public void command(CommandSender sender,Queue<String> words) throws Throwable{
        // обрабатываем команду.
        // String cmd = words.poll(); - взять следующее слово из списка входящих параметров
        // можно и throw new Exception("ошибка, что-то случилось");
    }
}
Можно не заботиться об возникающих исключениях - игрок увидит сообщение об ошибке, консоль не засорится. И к тому же можно из входящего потока слов команд брать и обрабатывать по одному.

Еще добавлю:
абстрактное наследование прекрасно работает на обработчиках команд. Но его нельзя использовать для обработки событий (класс Listener)
 
Написал, и все отладил.
Не знаю, кому такой плагин может понадобится?О_о Но, пусть будет.

Исходный код: тык
Скачать: тык
 
args[0] может быть не задан или указывать на несуществующего игрока, getOfflinePlayer() вернет null, команда выплюнет NPE в консоли... Ты профессионал, да.

В моем понимании даже такие мелкие (да и вообще любые исключительные) вещи нужно предусматривать. Плагин (комманда, листенер, етц) не должен выплевывать ошибку при любом наборе входных данных.

А если кодеру нравится писать с такими ошибками, то пусть пишет.
Я не говорю, что я профессионал, и ничего оно не выкинет.
Я как бы предусматриваю условие, что если player == null, то написать об этом же нужно? Или как? и возвратить true, чтобы не было твоего NPE.

Раз уж ты такой умный, мог бы написать, а не выпендриваться, и критиковать чужой код.
Показываешь себя, не в лучшем качестве.
 
Раз уж ты такой умный, мог бы написать, а не выпендриваться, и критиковать чужой код.
Показываешь себя, не в лучшем качестве.
кудах тах тах
Я лишь указываю на ошибки и недоработки, откуда тут взяться не лучшим качествам?
 

Поделиться этой страницей

Назад
Верх