Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите CommandSender & Player

Тема в разделе "Разработка плагинов для новичков", создана пользователем Geroll, 25 ноя 2012.

  1. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    А ведь всего-то пару исправлений...

    Код:
    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;
      }
    
     
    fromgate нравится это.
  2. Хостинг MineCraft
    <
  3. Автор темы
    Geroll

    Geroll Старожил Пользователь

    Баллы:
    123
    Спасибо , я уже во всем разобрался =)
     
  4. akke

    akke Старожил Пользователь

    Баллы:
    103
    Если команду набрать из консоли - вывалится exception. Круто, ага.
     
  5. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Ммм, а может быть нужно было сказать, что нужна работоспособность и из консоли?

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

    Код:
    if(sender instanceof Console) {
    //тут выполняем действие, если пишем команду из консоли
    }
     
  6. akke

    akke Старожил Пользователь

    Баллы:
    103
    Эта работоспособность необходима всегда. Хотя да, если тебе эти ошибки не важны - можешь даже не вникать.

    Ой, instanceof... У меня для тебя плохие новости - http://habrahabr.ru/post/132241/
     
  7. BrilZliaN

    BrilZliaN Активный участник Пользователь

    Баллы:
    88
    Skype:
    brillianikz
    Имя в Minecraft:
    BrilZliaN
    Тогда что же использовать?
    Это?
    Код:
    Player player;
    try {
        player = (Player) sender;
    } catch (Exception exc) {}
    if (player == null) {
        //your code here
    } 
    (Тред не читал)
     
  8. akke

    akke Старожил Пользователь

    Баллы:
    103
    Код:
    if (cmdsender.getName().equals("CONSOLE")) {
    /* это консоль */
    } else {
    /* это игрок */
    }
    Может и не идеально, выслушаю как можно ещё лучше.
     
    slavik123123123 нравится это.
  9. 1lyaSweeper

    1lyaSweeper Старожил Пользователь

    Баллы:
    173
    Skype:
    Iswperr
    Имя в Minecraft:
    1lyaSweeper
    норм, збс
     
    DavidShabaev и amar2k нравится это.
  10. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Начнем с того, что у кого ты просишь выдать тебе exp? У консоли?

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

    Я тут набросал
    Код:
        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:
     
  11. 1lyaSweeper

    1lyaSweeper Старожил Пользователь

    Баллы:
    173
    Skype:
    Iswperr
    Имя в Minecraft:
    1lyaSweeper
    Напиши, и сорцы дай :DD
     
    ПриветОтМиднайта и amar2k нравится это.
  12. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Ок.
     
  13. akke

    akke Старожил Пользователь

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

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

    А если кодеру нравится писать с такими ошибками, то пусть пишет.
     
    I-Am-Black-Overlord нравится это.
  14. DPOH-VAR

    DPOH-VAR Старожил Пользователь

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

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

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Написал, и все отладил.
    Не знаю, кому такой плагин может понадобится?О_о Но, пусть будет.

    Исходный код: тык
    Скачать: тык
     
  16. smilesdc

    smilesdc Няша Модератор

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

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

    akke Старожил Пользователь

    Баллы:
    103
    Я лишь указываю на ошибки и недоработки, откуда тут взяться не лучшим качествам?
     
  18. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Я понимаю, спасибо за это, но можно указывать на них в более "мягкой" форме.
     

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