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

Помогите Ошибка в BukkitRunnable

Статус
Закрыто для дальнейших ответов.

MrSharky

Участник
Пользователь
Баллы
33
Объясните, почему вылетает ошибка:
Код:
    public void startRegeneration(Player p){
        final Player pl = p;
        BukkitRunnable runnable = new BukkitRunnable(){
            @Override
            public void run(){
                while(pl.isOnline()){
                    @SuppressWarnings("deprecation")
                    Score score = pl.getScoreboard().getObjective("Stats").getScore(Bukkit.getOfflinePlayer("Mana:"));
                    int mana = score.getScore();
                    int maxMana = EnableClass.config.getInt(pl.getName() + "_MAX_MANA");
                    if(mana < maxMana){
                        mana += EnableClass.config.getInt(pl.getName() + "_MANA_REGEN");
                        score.setScore(mana);
                    }
                }
                cancel();
            }
        };
        runnable.runTaskTimer(plugin, 1L, 20L);
    }
Ошибка указывает только на одну строчку а именно:
Код:
        runnable.runTaskTimer(plugin, 1L, 20L);
 
Эмм, зачем вы делаете cancel в конце выполнения, если запустили таймер? Кидайте ошибку.
 
Объясните, почему вылетает ошибка:
Код:
    public void startRegeneration(Player p){
        final Player pl = p;
        BukkitRunnable runnable = new BukkitRunnable(){
            @Override
            public void run(){
                while(pl.isOnline()){
                    @SuppressWarnings("deprecation")
                    Score score = pl.getScoreboard().getObjective("Stats").getScore(Bukkit.getOfflinePlayer("Mana:"));
                    int mana = score.getScore();
                    int maxMana = EnableClass.config.getInt(pl.getName() + "_MAX_MANA");
                    if(mana < maxMana){
                        mana += EnableClass.config.getInt(pl.getName() + "_MANA_REGEN");
                        score.setScore(mana);
                    }
                }
                cancel();
            }
        };
        runnable.runTaskTimer(plugin, 1L, 20L);
    }
Ошибка указывает только на одну строчку а именно:
Код:
        runnable.runTaskTimer(plugin, 1L, 20L);
Нельзя завершать таск внутри его самого.
 
Зачем мне кусок стактрейса, на котором не видно ошибку?
 
Тогда вот:
 

Вложения:

  • Screenshot_2.png
    Screenshot_2.png
    Размер файла
    43,6 КБ
    Просмотров
    23
Тогда не ясно как получить Plugin. Я доставал его через главный класс командой getPlugin().
Точнее Bukkit.getPluginManager().getPlugin("название"), просто getPlugin() требует аргумент получить который я тоже не знаю как.
 
Последнее редактирование:
Указатель на твой плагин в теле главного класса плагина — это this.
 
Ну, например — не используй статик.
Предположим, у тебя другой класс такой:
Java:
public class OtherClass
{
   private final JavaPlugin plugin;
   public OtherClass(JavaPlugin plugin)
   {
      this.plugin = plugin;
   }
   ...
   // Где-то тут ты задаёшь свой Runnable
}
В теле главного класса:
Java:
   private final OtherClass other = new OtherClass(this);
   ...
      other.doThatShitWithYourRunnable();
 
Как то о конструкторе, я и забыл... Спасибо, пойду пробывать.

Java:
   private final OtherClass other = new OtherClass(this);
      other.doThatShitWithYourRunnable();
Хорошее название метода:D
 
Я обычно для этой цели использую Singlet-on
Выглядит это так: (Это меин класс плагина)
JavaScript:
    private static Plugin plugin;
    @Override
    public void onLoad() {
        plugin = this;
    }

    public static Plugin getInstance() {
        return plugin;
    }
В последствии откуда угодно можно получить плагин посредством Main.getInstance() и не извращаться с созданием лишних объектов для послед. передачи и / или еще хуже разными getPlugin("MyPlug");
 
Не люблю синглтоны, хотя иногда без них никуда. В Bukkit API они не очень, как мне кажется, соответствуют модели загрузки плагинов — один и тот же плагин может быть загружен несколько раз (в т.ч. разных версий) и может возникнуть неопределённое поведение в недовыгруженном участке.
 
Не люблю синглтоны
Зря-зря-зря-зря-зря..
В Bukkit API они не очень, как мне кажется, соответствуют модели загрузки плагинов
Тут соглашусь, правильным синглтоном это не назовешь, но это работает и работает отлично.
один и тот же плагин может быть загружен несколько раз
Не правда. Только если специально пошаманить.
А так plugin.yml не даст (Одинаковое имя)
(в т.ч. разных версий)
Какие извращения о.о
может возникнуть неопределённое поведение в недовыгруженном участке.
Поле - private
При особых боязнях в onDisable можно запихнуть plugin = null;
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх