- Баллы
- 11
- Имя в Minecraft
- LALKATOP
У меня есть плагин, который при входе игрока запускает runTaskTimer(...), мне нужно сделать, чтобы при выходе игрока, он останавливался именно для этого игрока, как это сделать и можно ли вообще?
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Эх... Я не шарю как работает forEach, по этому вреатле выйдет это. Можно ли сделать так?Как то так.
Код: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); } }); } }
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Эх... Я не шарю как работает 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 минуты времени?)Так такое будет работать?
не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написалВзял да проверил. Или тебе лучше потратить 10 минут на ожидание ответа на форуме, нежели забилдить проект и проверить, потратив 2 минуты времени?)
Во-первых, используй вариант alexandrage через forEach.не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написал
Но там же не то, что мне нужно!Во-первых, используй вариант alexandrage через forEach.
Во-вторых, просто используй свой метод внутри. Все просто
не работает... Блин я незнаю как это сделать, то, что написал alexandrage вообще не подходит, мне нужно чтобы оно при выходе игрока останавливало таск. Пожалуйста помоги, что нужно написать или что изменить в том, что я написал
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. В зависимости от того что ты хочешь.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()); }); } }
(это я с другого аккаунта) Я несовсем понимаю как оно работает. Как мне сделать чтобы таск для определенного игрока остановился при его выходе? Мне нужно использовать remove?Или юзаешь второй варик от alexandrage. В зависимости от того что ты хочешь.
Просто запускать ранебл и останавливать для каждого игрока - код от меня (взятый из первого предложения alexandrage) выше.
Капец ти *глупенький*.(это я с другого аккаунта) Я несовсем понимаю как оно работает. Как мне сделать чтобы таск для определенного игрока остановился при его выходе? Мне нужно использовать remove?
int id = Bukkit.getScheduler().schedule(Sync/Async)RepeatingTask(plugin,expression,delay,period)
Я уже делал так! Помещал в мапу, но не работало!Капец ти *глупенький*.
Потом это в мапу закидываешь и пользуешься!Код: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());
}
Просто task не останавливался, а продолжал работать и начислять деньги игроку. В консоли ничего не писалоВ каком месте оно не работало? Скинь весь код!
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); } }
Что пишет что не пишет?Я написал это, но теперь вообще даже деньги не начисляются