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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    MrSharky

    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);
     
  2. Хостинг MineCraft
    <
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Эмм, зачем вы делаете cancel в конце выполнения, если запустили таймер? Кидайте ошибку.
     
  4. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Нельзя завершать таск внутри его самого.
     
  5. Автор темы
    MrSharky

    MrSharky Участник Пользователь

    Баллы:
    33
    [DOUBLEPOST=1418755831,1418755713][/DOUBLEPOST]И убрав cancel выдает тоже самое
     

    Вложения:

  6. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Зачем мне кусок стактрейса, на котором не видно ошибку?
     
  7. Автор темы
    MrSharky

    MrSharky Участник Пользователь

    Баллы:
    33
    Тогда вот:
     

    Вложения:

  8. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Ну вот вам и ответ. Plugin cannot be null.
     
  9. Автор темы
    MrSharky

    MrSharky Участник Пользователь

    Баллы:
    33
    Тогда не ясно как получить Plugin. Я доставал его через главный класс командой getPlugin().
    Точнее Bukkit.getPluginManager().getPlugin("название"), просто getPlugin() требует аргумент получить который я тоже не знаю как.
     
    Последнее редактирование: 17 дек 2014
  10. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Можно, но не так)
     
  11. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Указатель на твой плагин в теле главного класса плагина — это this.
     
  12. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    И как же? Через id?
     
  13. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Наверное
     
  14. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Зачем его получать, вы чо =\ this
     
  15. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Мы про завершение таска
     
  16. Автор темы
    MrSharky

    MrSharky Участник Пользователь

    Баллы:
    33
    мой Runnable в другом классе, а через static нельзя с this. Создать объект главного класса тож нельзя - выдает ошибку.
     
  17. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну, например — не используй статик.
    Предположим, у тебя другой класс такой:
    Код:
    public class OtherClass
    {
       private final JavaPlugin plugin;
       public OtherClass(JavaPlugin plugin)
       {
          this.plugin = plugin;
       }
       ...
       // Где-то тут ты задаёшь свой Runnable
    }
    В теле главного класса:
    Код:
       private final OtherClass other = new OtherClass(this);
       ...
          other.doThatShitWithYourRunnable();
    
     
  18. Автор темы
    MrSharky

    MrSharky Участник Пользователь

    Баллы:
    33
    Как то о конструкторе, я и забыл... Спасибо, пойду пробывать.

    Код:
       private final OtherClass other = new OtherClass(this);
          other.doThatShitWithYourRunnable();
    
    Хорошее название метода:D
     
  19. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Я обычно для этой цели использую Singlet-on
    Выглядит это так: (Это меин класс плагина)
    Код:
        private static Plugin plugin;
        @Override
        public void onLoad() {
            plugin = this;
        }
    
        public static Plugin getInstance() {
            return plugin;
        }
    В последствии откуда угодно можно получить плагин посредством Main.getInstance() и не извращаться с созданием лишних объектов для послед. передачи и / или еще хуже разными getPlugin("MyPlug");
     
  20. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Не люблю синглтоны, хотя иногда без них никуда. В Bukkit API они не очень, как мне кажется, соответствуют модели загрузки плагинов — один и тот же плагин может быть загружен несколько раз (в т.ч. разных версий) и может возникнуть неопределённое поведение в недовыгруженном участке.
     
  21. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Зря-зря-зря-зря-зря..
    Тут соглашусь, правильным синглтоном это не назовешь, но это работает и работает отлично.
    Не правда. Только если специально пошаманить.
    А так plugin.yml не даст (Одинаковое имя)
    Какие извращения о.о
    Поле - private
    При особых боязнях в onDisable можно запихнуть plugin = null;
     
Статус темы:
Закрыта.

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