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

LalkaLalka

Новичок
Пользователь
Баллы
11
Имя в Minecraft
LALKATOP
У меня есть плагин, который при входе игрока запускает runTaskTimer(...), мне нужно сделать, чтобы при выходе игрока, он останавливался именно для этого игрока, как это сделать и можно ли вообще?
 
Как то так.
Код:
public class PlayerTask extends BukkitRunnable {

    private Map<Player, Integer> map = new HashMap<Player, Integer>();
    private int coinPeriod;
    private Plugin plugin;

    public PlayerTask(Plugin plugin, int period) {
        this.plugin = plugin;
        this.coinPeriod = this.plugin.getConfig().getInt("income");
        this.runTaskTimer(this.plugin, 1, 1);
    }

    public void add(Player player) {
        this.map.put(player, 0);
    }

    public void remove(Player player) {
        this.map.remove(player);
    }

    @Override
    public void run() {
        this.map.forEach((player, period) -> {
            if(period<this.coinPeriod) {
                this.map.put(player, period++);
            } else {
                this.map.put(player, 0);
                //TODO Commands.giveMoney(player.getName(), inc);
            }
        });
    }
}
Эх... Я не шарю как работает 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());
    }
 
Эх... Я не шарю как работает 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());
    }
- glaza
 
Так такое будет работать?
Взял да проверил. Или тебе лучше потратить 10 минут на ожидание ответа на форуме, нежели забилдить проект и проверить, потратив 2 минуты времени?)
 
Взял да проверил. Или тебе лучше потратить 10 минут на ожидание ответа на форуме, нежели забилдить проект и проверить, потратив 2 минуты времени?)
не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написал
 
не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написал
Во-первых, используй вариант alexandrage через forEach.
Во-вторых, просто используй свой метод внутри. Все просто
 
не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написал
PHP:
public class PlayerTask extends BukkitRunnable {
    private Set<Player> set = new HashSet<Player>();
    public PlayerTask(Plugin plugin, int period) {
        this.runTaskTimer(plugin, period, period);
    }
    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());
        });
    }
}
 
PHP:
public class PlayerTask extends BukkitRunnable {
    private Set<Player> set = new HashSet<Player>();
    public PlayerTask(Plugin plugin, int period) {
        this.runTaskTimer(plugin, period, period);
    }
    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());
        });
    }
}
Или юзаешь второй варик от alexandrage. В зависимости от того что ты хочешь.
Просто запускать ранебл и останавливать для каждого игрока - код от меня (взятый из первого предложения alexandrage) выше.
 
Или юзаешь второй варик от alexandrage. В зависимости от того что ты хочешь.
Просто запускать ранебл и останавливать для каждого игрока - код от меня (взятый из первого предложения alexandrage) выше.
(это я с другого аккаунта) Я несовсем понимаю как оно работает. Как мне сделать чтобы таск для определенного игрока остановился при его выходе? Мне нужно использовать remove?
 
(это я с другого аккаунта) Я несовсем понимаю как оно работает. Как мне сделать чтобы таск для определенного игрока остановился при его выходе? Мне нужно использовать remove?
Капец ти *глупенький*.
Код:
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)
В ранебле проверяешь если игрок содержится в в коллекции то делаешь то то и то то.
 
Капец ти *глупенький*.
Код:
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)
В ранебле проверяешь если игрок содержится в в коллекции то делаешь то то и то то.
Я уже делал так! Помещал в мапу, но не работало!

вот:
Код:
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());
    }
 
Код:
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);
    }
}
Вот держи! Мой чудо говнокод!
 
В каком месте оно не работало? Скинь весь код!
Вот весь код:
Код:
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;
    }
}
 
Вот весь код:
Код:
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;
    }
}
У тебя тачка после этого взорвётся!
 
Код:
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);
    }
}
Вот держи! Мой чудо говнокод!
Я написал это, но теперь вообще даже деньги не начисляются
 
Назад
Верх