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

non-static method getPlayer() cannot be referenced from a static context

Тема в разделе "Разработка плагинов для новичков", создана пользователем MOR_IV, 26 май 2014.

  1. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Ошибка non-static method getPlayer() cannot be referenced from a static context
    кусок кода:
    Код:
    @Override
        public boolean onCommand(CommandSender sender, Command command,
              String label, String[] args) {
                        Player player = PlayerEvent.getPlayer(); // Тут ошибка
                        player.saveData(); // Надо вызвать
           
            if(args.length==0){
                       
                      HomesManager.sendHome(sender, "home");
            }else{
                HomesManager.sendHome(sender, args[0]);
            }
            return true;
        }

    По русски - мне перед выполнением класса с командой надо вызвать эвент getPlayer().saveData();
    Уже второй день ломаю голову. Нифига не могу понять.
     
  2. Хостинг MineCraft
    <
  3. kirill2011s

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

    Баллы:
    103
    Вы знаете чем отличается статический метод от не статического?

    Вы не можете брать игрока из класса PlayerEvent пока не инициализируете его. Это и называется не статический метод, то есть метод, который можно вызвать у класса, только после его иницмализации. Учи мат часть.[DOUBLEPOST=1401069560,1401069358][/DOUBLEPOST]На самом деле, то, что вы написали вообще бред какой-то. Почитайте какую-нибудь книжку по Java и вот это: http://wiki.bukkit.org/Plugin_Tutorial/ru
     
    Лайка нравится это.
  4. Konstantin773

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

    Баллы:
    153
    Skype:
    Konstantin77313
    Имя в Minecraft:
    K773
    Код:
    @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
             if(sender instanceof Player){
                 Player player = (Player) sender;
                 player.saveData();
                 if(args.length==0){
                   HomesManager.sendHome(sender, "home");
                 }else{
                    HomesManager.sendHome(sender, args[0]);
                 }
              }
            return true;
        }
    
     
    Лайка и MOR_IV нравится это.
  5. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    сделал так:

    Код:
    package com.minecraftdimensions.bungeesuitehomes.commands;
    
    import com.minecraftdimensions.bungeesuitehomes.managers.HomesManager;
    import static org.bukkit.Bukkit.getPlayer;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    
    
    public class HomeCommand implements CommandExecutor {
    
    @Override
    public boolean onCommand(CommandSender sender, Command command,
        String label, String[] args) {
      if(args.length==0){
                        Player p = getPlayer(sender.getName());
                        p.saveData();
                        HomesManager.sendHome(sender, "home");
      }
      else{
                        Player p = getPlayer(sender.getName());
                        p.saveData();
     
                        HomesManager.sendHome(sender, args[0]);
      }
      return true;
    }
    
    }
    Но все равно спасибо.
     
    Лайка нравится это.
  6. dark32

    dark32 А где твой ТЗ? Пользователь

    Баллы:
    123
    Имя в Minecraft:
    dark32
    Код:
    Player p = getPlayer(sender.getName());
    Это что за безобразие?
    Тебе же дали рабочий правильный код
    Код:
    if(sender instanceof Player){
                Player player = (Player) sender;
    А если сендер у тебя будет консолью или игрок с именем CONSOLE?
    И зачем два раза определять одну переменную Player p в ветвление? определи её в начале метода, если она определяема (если сендер - игрок) и работай с ней во всём ветвление.

    Ох.. смотрите как делали другие, не плодите велосипеды, а то кто ещё их всерьёз примет.
     
    ql_Nik_lp, MOR_IV и serega6531 нравится это.
  7. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Понял, спасибо. Переделаю =)[DOUBLEPOST=1401093149,1401092249][/DOUBLEPOST]Переделал так:
    Код:
    package com.minecraftdimensions.bungeesuitehomes.commands;
    
    import com.minecraftdimensions.bungeesuitehomes.managers.HomesManager;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    
    
    public class HomeCommand implements CommandExecutor {
    
    @Override
    public boolean onCommand(CommandSender sender, Command command,
        String label, String[] args) {
          if(sender instanceof Player){
                Player player = (Player) sender;
                player.saveData();
          if(args.length==0){
                        HomesManager.sendHome(sender, "home");
          }else{
                        HomesManager.sendHome(sender, args[0]);
          }
        return true;
        }else{
          sender.sendMessage("Запрещено использовать из консоли!");
          return true;
          }
    }
    }


    Профит!
     
  8. kris13

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

    Баллы:
    78
    1. Если вы в любом случае возвращаете true, зачем вы засунули return в if?
    2. Вы инициализируете переменную player и используете ее только 1 раз, зачем?
     
    Лайка2 и Лайка нравится это.
  9. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    с return я сам уже разобрался, вынес его в скобки public boolean.
    С переменной мне самому не понятно, мой вопрос был связан с non-static method, теперь все работает.
    Цель этого вызвать эвент сохранения персонажа при выполнении команды. Команда выполняет перемещение персонажа с сервера, на сервер через BungeeCord, сохраняет перса, а на другом сервере, его уже грузит ядро сервера. Мне это и нужно было.
     
    ПриветОтЛайки и Лайка2 нравится это.
  10. kris13

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

    Баллы:
    78
    Я вот о чем, ваш код:
    Код:
    Player player = (Player) sender;
    player.saveData();
    и все далее player не используется. Тогда почему бы не написать
    ((Player) sender).saveData();
    Кроме того, что это короче в коде, вы еще не создаете дополнительную локальную переменную =)
     
  11. Автор темы
    MOR_IV

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

    Баллы:
    88
    Имя в Minecraft:
    MOR_IV
    Хорошая идея кстати. Просто я в java не очень, все логически делаю, если не срабатывает, то методом тыка =)
    Спасибо.
     
    ПриветОтЛайки, Лайка2 и mahimamax нравится это.

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