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

Помогите Как правильно вешать на игрока эффекты sheduler'ом

RoyalCraft

Активный участник
Пользователь
Баллы
68
Имя в Minecraft
Stressless
В процессе ковыряния и изучения поставил себе такую задачу:
По достижению определенного условия на игрока в бесконечном цикле вешаются различные негативные эффекты. Достигая второго, определенного условия, игрок выходит с этого цикла и на него прекращается накладывание эффектов.

Задался вопросом, как привязывать sheduler'ы к определенным игрокам с возможностью дальнейшего их отключения да и в целом, как это лучше сделать (может не sheduler нужен). Сейчас использую конструкцию вида

Код:
// .. тут где то массив с эффектами

private static HashMap<UUID, Integer> mapping = new HashMap<UUID, Integer>();


public void start(Player player) {

   BukkitTask task =  new BukkitRunnable() {
        @Override
        public void run() {
            // get random effect
            int idx = new Random().nextInt(effects.length);
            PotionEffectType type = effects[idx];


            // get players effects
            if (!player.hasPotionEffect(type)) {
                player.addPotionEffect(new PotionEffect(type, 360, 10));
            }
        }

    }.runTaskTimer(MyPlugin.getInstance(), 0, 260);
   mapping.put(player.getUniqueId(),task.getTaskId());
}

public void stop(Player player) {
   MyPlugin.getInstance().getServer().getScheduler().cancelTask(mapping.get(player.getUniqueId()));
}

В целом нормальный ли это подход ? Потому что мне кажется, что это бред
 
А не лучше ли будет один единый шедуллер на всех нужных игроков?
 
А можно пример, пожалуйста ? И как в дальнейшем у определенных игроков его отключать ?
Делать шулдер на каждого игрока отдельно - полнейший бред в лишний раз нагружающий сервер.
Создай свой класс по типу myPlayer, туда пхаешь игрока и прописываешь все нужные доп. значения, прописываешь нужные методы(получение игрока, получение/изменение времени эффекта и т.п.)потом создаёшь массив с этим классом, делаешь один шулдер и в нём итерируешь всех игроков из списка и делаешь всё, что требуется
 
Последнее редактирование:
А можно пример, пожалуйста ? И как в дальнейшем у определенных игроков его отключать ?
Пример класса игрока:
Код:
import org.bukkit.entity.Player;

public class MyPlayer {
    Player player;
    int EffectTime = 0;
    MyPlayer(Player player){
        this.player = player;
    }
    public Player getPlayer() {
        return player;
    }
    public int getEffectTime() {
        return EffectTime;
    }
    public void setEffectTime(int effectTime) {
        EffectTime = effectTime;
    }
}
Если есть желание, то можно даже наследовать оригинальный класс игрока
Пример класса-обработчика:
Код:
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.util.ArrayList;

public class PluginManager {
    BukkitTask Sheduler;
    ArrayList<MyPlayer> players= new ArrayList<>();
    JavaPlugin plugin;
    PluginManager(JavaPlugin plugin){
        this.plugin = plugin;
        for (Player player : Bukkit.getOnlinePlayers()){
            players.add(new MyPlayer(player));
        }
      
        Sheduler = Bukkit.getScheduler().runTaskLater(plugin, () -> {
            for (MyPlayer player : players){
                //
                // Ваш код
                //
            }
            // 1 - секунда; 20L - статичная единица, для перевода тики в секунды(В моём понимании, а так сам ХЗ)
        }, 1 * 20L);
    }
}
 

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

Назад
Верх