Войти или зарегистрироваться

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

  • Автор темы Автор темы 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();
Уже второй день ломаю голову. Нифига не могу понять.
 
Вы знаете чем отличается статический метод от не статического?

Вы не можете брать игрока из класса PlayerEvent пока не инициализируете его. Это и называется не статический метод, то есть метод, который можно вызвать у класса, только после его иницмализации. Учи мат часть.
На самом деле, то, что вы написали вообще бред какой-то. Почитайте какую-нибудь книжку по Java и вот это: http://wiki.bukkit.org/Plugin_Tutorial/ru
 
Код:
@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;
    }
 
сделал так:

Код:
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;
}

}

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

Ох.. смотрите как делали другие, не плодите велосипеды, а то кто ещё их всерьёз примет.
 
Понял, спасибо. Переделаю =)
Переделал так:
Код:
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;
      }
}
}



Профит!
 
1. Если вы в любом случае возвращаете true, зачем вы засунули return в if?
2. Вы инициализируете переменную player и используете ее только 1 раз, зачем?
 
с return я сам уже разобрался, вынес его в скобки public boolean.
С переменной мне самому не понятно, мой вопрос был связан с non-static method, теперь все работает.
Цель этого вызвать эвент сохранения персонажа при выполнении команды. Команда выполняет перемещение персонажа с сервера, на сервер через BungeeCord, сохраняет перса, а на другом сервере, его уже грузит ядро сервера. Мне это и нужно было.
 
Я вот о чем, ваш код:
Код:
Player player = (Player) sender;
player.saveData();
и все далее player не используется. Тогда почему бы не написать
((Player) sender).saveData();
Кроме того, что это короче в коде, вы еще не создаете дополнительную локальную переменную =)
 
Назад
Верх