1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как остановить определенный Task в BukkitScheduler?

Тема в разделе "Разработка плагинов для новичков", создана пользователем LalkaLalka, 24 июл 2019.

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

    LalkaLalka Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    LALKATOP
    Эх... Я не шарю как работает forEach, по этому вреатле выйдет это. Можно ли сделать так?

    Код:
    private HashMap<Player,Integer> i;
        
        public void onQuit(PlayerQuitEvent e) {
            int taskid = i.get(e.getPlayer());
            i.remove(e.getPlayer());
            Bukkit.getScheduler().cancelTask(taskid);
        }
    
        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            confAdd(p);
            giveIncome(p);
        }
        
        private void giveIncome(Player p) {
            String pname = p.getName();
            int ticks = plugin.getConfig().getInt("income");
            
            BukkitTask task = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {
                
                @Override
                    public void run() {
                    
                    double inc = getIncome(pname);
                    
                    if(p.isOnline()) {
                        Commands.giveMoney(pname, inc);
                    } else return;
                }
            },ticks ,ticks);
            
            i = new HashMap<Player,Integer>();
            i.put(p, task.getTaskId());
        }
     
  2. Lemar98

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

    Баллы:
    76
    - glaza
     
  3. Автор темы
    LalkaLalka

    LalkaLalka Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    LALKATOP
    Так такое будет работать?
     
  4. Lemar98

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

    Баллы:
    76
    Взял да проверил. Или тебе лучше потратить 10 минут на ожидание ответа на форуме, нежели забилдить проект и проверить, потратив 2 минуты времени?)
     
  5. Автор темы
    LalkaLalka

    LalkaLalka Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    LALKATOP
    не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написал
     
  6. Lemar98

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

    Баллы:
    76
    Во-первых, используй вариант alexandrage через forEach.
    Во-вторых, просто используй свой метод внутри. Все просто
     
  7. Автор темы
    LalkaLalka

    LalkaLalka Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    LALKATOP
    Но там же не то, что мне нужно!
     
  8. Lemar98

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

    Баллы:
    76
    PHP:
    public class PlayerTask extends BukkitRunnable {
        private 
    Set<Playerset = new HashSet<Player>();
        public 
    PlayerTask(Plugin pluginint period) {
            
    this.runTaskTimer(pluginperiodperiod);
        }
        public 
    boolean add(Player player) {
            return 
    this.set.add(player);
        }
        public 
    boolean remove(Player player) {
            return 
    this.set.remove(player);
        }
        @
    Override
        
    public void run() {
            
    this.set.forEach(player -> {
                
    Commands.giveMoney(player.getName(), getIncam(player.getName());
            });
        }
    }
     
  9. Lemar98

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

    Баллы:
    76
    То, что тебе нужно...
     
  10. Lemar98

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

    Баллы:
    76
    Или юзаешь второй варик от alexandrage. В зависимости от того что ты хочешь.
    Просто запускать ранебл и останавливать для каждого игрока - код от меня (взятый из первого предложения alexandrage) выше.
     
  11. Detfor

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

    Баллы:
    61
    Имя в Minecraft:
    Detfor
    (это я с другого аккаунта) Я несовсем понимаю как оно работает. Как мне сделать чтобы таск для определенного игрока остановился при его выходе? Мне нужно использовать remove?
     
  12. Energy warrior

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

    Баллы:
    76
    Капец ти *глупенький*.
    Код:
    int id = Bukkit.getScheduler().schedule(Sync/Async)RepeatingTask(plugin,expression,delay,period)
    Потом это в мапу закидываешь и пользуешься!
    Или создаёшь один ранебл, создаёшь сет,лист,мапу чё хош. Закидываешь туда ники игроков. Ловишь ивенты захода и выхода. Если зашёл добавляешь если вышел удаляешь.
    Добавлять:
    List: add(value)
    Set: add(value)
    Map: put(key,value)
    Удалять:
    List: remove(value)
    Set: remove(value)
    Map: remove(key)
    В ранебле проверяешь если игрок содержится в в коллекции то делаешь то то и то то.
     
  13. Detfor

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

    Баллы:
    61
    Имя в Minecraft:
    Detfor
    Я уже делал так! Помещал в мапу, но не работало!

    вот:
    Код:
    private HashMap<Player,Integer> i;
        
        public void onQuit(PlayerQuitEvent e) {
            int taskid = i.get(e.getPlayer());
            i.remove(e.getPlayer());
            Bukkit.getScheduler().cancelTask(taskid);
        }
    
        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            confAdd(p);
            giveIncome(p);
        }
        
        private void giveIncome(Player p) {
            String pname = p.getName();
            int ticks = plugin.getConfig().getInt("income");
            
            BukkitTask task = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {
                
                @Override
                    public void run() {
                    
                    double inc = getIncome(pname);
                    
                    if(p.isOnline()) {
                        Commands.giveMoney(pname, inc);
                    } else return;
                }
            },ticks ,ticks);
            
            i = new HashMap<Player,Integer>();
            i.put(p, task.getTaskId());
        }
     
  14. Energy warrior

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

    Баллы:
    76
    В каком месте оно не работало? Скинь весь код!
     
  15. Detfor

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

    Баллы:
    61
    Имя в Minecraft:
    Detfor
    Просто task не останавливался, а продолжал работать и начислять деньги игроку. В консоли ничего не писало
     
  16. Energy warrior

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

    Баллы:
    76
    Код:
    import java.util.HashSet;
    import java.util.Set;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main extends JavaPlugin implements Listener
    {
        private static Main ins;
        private final Set<Player> players = new HashSet<>();
       
        public static Main getIns() {
            return ins;
        }
       
        @Override
        public void onEnable() {
            ins = this;
            getServer().getPluginManager().registerEvents(this, this);
            Bukkit.getScheduler().runTaskTimer(this, ()->{
                players.forEach(player->{
                    //TODO
                });
            }, 1, 1);
        }
       
        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            Player player = e.getPlayer();
            players.add(player);
        }
       
        @EventHandler
        public void onQuit(PlayerQuitEvent e) {
            Player player = e.getPlayer();
            players.remove(player);
        }
    }
    
    Вот держи! Мой чудо говнокод!
     
  17. Detfor

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

    Баллы:
    61
    Имя в Minecraft:
    Detfor
    Вот весь код:
    Код:
    package vegobusiness.main;
    
    import java.util.HashMap;
    
    import org.bukkit.Bukkit;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.scheduler.BukkitTask;
    
    public class Income implements Listener {
        
        private static Business plugin;
        public Income(Business plugin) {
            Income.plugin = plugin;
        }
        
        private HashMap<Player,Integer> i = new HashMap<Player,Integer>();
        
        public void onQuit(PlayerQuitEvent e) {
            int taskid = i.get(e.getPlayer());
            i.remove(e.getPlayer());
            Bukkit.getScheduler().cancelTask(taskid);
        }
    
        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            confAdd(p);
            giveIncome(p);
        }
        
        private void giveIncome(Player p) {
            String pname = p.getName();
            int ticks = plugin.getConfig().getInt("income");
            
            BukkitTask task = Bukkit.getScheduler().runTaskTimer(plugin, new Runnable() {
                
                @Override
                    public void run() {
                    
                    double inc = getIncome(pname);
                    
                    if(p.isOnline()) {
                        Commands.giveMoney(pname, inc);
                    } else return;
                }
            },ticks ,ticks);
            
            i.put(p, task.getTaskId());
        }
        
        
        private void confAdd(Player p) {
            FileConfiguration cfg = plugin.getConfig();
            
            String pname = p.getName();
            if(!cfg.contains("players." + pname)) {
                cfg.set("players." + pname + ".bus1", 1);
            }
        }
        
        public static double getIncome(String name) {
            double inc = 0;
            
            int enAmount = getEnableBusAmount();
            
            for(int x = 1; x != enAmount; x++) {
                int busLvl = plugin.getConfig().getInt("players." + name + ".bus"+x);
                double busInc = plugin.getConfig().getDouble("incomes.bus"+x + "."+busLvl);
                
                inc += busInc;
            }
            return inc;
            
        }
        
        public static int getEnableBusAmount() {
            int enAmount = 0;
            
            for(int x = 1; x < 100; x++) {
                String busName = plugin.getConfig().getString("bus-names.bus" + x);
                if(busName == null) break;
                enAmount++;
            }
            return enAmount;
        }
    }
     
  18. Energy warrior

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

    Баллы:
    76
    У тебя тачка после этого взорвётся!
     
  19. Detfor

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

    Баллы:
    61
    Имя в Minecraft:
    Detfor
    Я написал это, но теперь вообще даже деньги не начисляются
     
  20. Energy warrior

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

    Баллы:
    76
    Что пишет что не пишет?
     

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