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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем RoyalCraft, 23 фев 2024.

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

    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()));
    }
    В целом нормальный ли это подход ? Потому что мне кажется, что это бред
     
  2. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    А не лучше ли будет один единый шедуллер на всех нужных игроков?
     
  3. Автор темы
    RoyalCraft

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

    Баллы:
    68
    Имя в Minecraft:
    Stressless
    А можно пример, пожалуйста ? И как в дальнейшем у определенных игроков его отключать ?
     
  4. Fizer228

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

    Баллы:
    66
    Делать шулдер на каждого игрока отдельно - полнейший бред в лишний раз нагружающий сервер.
    Создай свой класс по типу myPlayer, туда пхаешь игрока и прописываешь все нужные доп. значения, прописываешь нужные методы(получение игрока, получение/изменение времени эффекта и т.п.)потом создаёшь массив с этим классом, делаешь один шулдер и в нём итерируешь всех игроков из списка и делаешь всё, что требуется
     
    Последнее редактирование: 23 фев 2024
  5. Fizer228

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

    Баллы:
    66
    Пример класса игрока:
    Код:
    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);
        }
    }
     

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