Вопрос Как создать повторяющийся поток который можно отменить?

Destroy

Разработчик
Пользователь
Сообщения
777
Решения
30
Веб-сайт
destroydevs.ru
Пробовал так:
Java:
    private static BukkitRunnable runnable;

    public static void startInfection(Player player, Survival main) {
        if(EntityDamageListener.infected.containsKey(player.getUniqueId())) {
            int amount = EntityDamageListener.infected.get(player.getUniqueId());
            if(amount < 2) {
                return;
            }
            runnable = new BukkitRunnable() {
                @Override
                public void run() {
                    if(amount >= 6) {
                        player.addPotionEffect(PotionEffectType.WITHER.createEffect(60, 9));
                        player.addPotionEffect(PotionEffectType.CONFUSION.createEffect(60, 1));
                        player.addPotionEffect(PotionEffectType.BLINDNESS.createEffect(60, 1));
                        player.addPotionEffect(PotionEffectType.HUNGER.createEffect(60, 10));
                    } else if(amount == 5) {
                        player.addPotionEffect(PotionEffectType.WITHER.createEffect(60, 2));
                    }else if (amount >= 3) {
                        player.addPotionEffect(PotionEffectType.WITHER.createEffect(60, 0));
                    } else {
                        player.removePotionEffect(PotionEffectType.WITHER);
                        runnable.cancel();
                    }
                }
            };
            runnable.runTaskTimer(main, 0, 20);
        }
    }

Пробовал ещё 2 способа.
Через Bukkit.getScheduler() - НЕЛЬЗЯ ОТМЕНИТЬ.
Timer timer = new Timer(); - НЕЛЬЗЯ ВЫДАВАТЬ ЭФФЕКТЫ В АСИНК ПОТОКЕ
 
Решение
M
создай лучше глобальный scheduler который всегда активен и пробегай по мапе infected с теми же условиями. вместо put 0 используй remove. у тебя шедулеры дублируются. с мобильника написать не могу
поменяй на this.cancel и убери вообще эту переменную
Вам необходимо зарегистрироваться для просмотра изображений-вложений


И сработал весь код. Полностью, даже if и else не помогают.
Вам необходимо зарегистрироваться для просмотра изображений-вложений


Вам необходимо зарегистрироваться для просмотра изображений-вложений


Java:
    public static void startInfection(Player player, Survival main) {
        if(EntityDamageListener.infected.containsKey(player.getUniqueId())) {
            int amount = EntityDamageListener.infected.get(player.getUniqueId());
            if(amount < 2) {
                return;
            }
            new BukkitRunnable() {
                @Override
                public void run() {
                    if(amount >= 6) {
                        player.addPotionEffect(PotionEffectType.WITHER.createEffect(60, 9));
                        player.addPotionEffect(PotionEffectType.CONFUSION.createEffect(60, 1));
                        player.addPotionEffect(PotionEffectType.BLINDNESS.createEffect(60, 1));
                        player.addPotionEffect(PotionEffectType.HUNGER.createEffect(60, 10));
                    } else if(amount == 5) {
                        player.addPotionEffect(PotionEffectType.WITHER.createEffect(60, 2));
                        player.sendActionBar(ChatUtils.color("&cВы сильно заражены! Срочно примите анти-дот!"));
                    }else if (amount >= 3) {
                        player.addPotionEffect(PotionEffectType.WITHER.createEffect(60, 0));
                        player.sendActionBar(ChatUtils.color("&cВы заражены! Примите анти-дот!"));
                    } else {
                        player.removePotionEffect(PotionEffectType.WITHER);
                        this.cancel();
                    }
                }
            }.runTaskTimer(main, 0, 20);
        }
    }
Объединено

Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
покажи где ты amount изменяешь и где этот метод вызываешь
Удаление:
Java:
    @EventHandler
    public void antiDot(PlayerItemConsumeEvent e) {
        Player player = e.getPlayer();
        if( e.getItem().getType() != Material.HONEY_BOTTLE) {
            return;
        }
        double d = Math.random()*100;
        if(e.getItem().getItemMeta().getDisplayName().equals(ChatUtils.color("&eАнти-дот"))) {
            if(!EntityDamageListener.infected.containsKey(player.getUniqueId())) {
                if(d<20) {
                    ChatUtils.sendMsg(player, "&cВы отравились анти-дотом!");
                    player.addPotionEffect(PotionEffectType.POISON.createEffect(200, 1));
                    player.addPotionEffect(PotionEffectType.HUNGER.createEffect(200, 5));
                }
                return;
            }
            if(EntityDamageListener.infected.get(player.getUniqueId()) < 1) {
                if(d<20) {
                    ChatUtils.sendMsg(player, "&cВы отравились анти-дотом!");
                    player.addPotionEffect(PotionEffectType.POISON.createEffect(200, 1));
                    player.addPotionEffect(PotionEffectType.HUNGER.createEffect(200, 5));
                }
                return;
            }
            EntityDamageListener.infected.put(player.getUniqueId(), 0);
            ChatUtils.sendMsg(player, "&aВы были исцелены.");
        }
    }

Изменение и вызов
Java:
    @EventHandler
    public void onDamage(EntityDamageByEntityEvent e){
        if(!(e.getDamager() instanceof Zombie)) {
            return;
        }
        if(!(e.getEntity() instanceof Player)) {
            return;
        }
        Zombie zombie = (Zombie) e.getDamager();
        Player player = (Player) e.getEntity();
        if(!EntityUtils.zombies.containsKey(zombie.getUniqueId())) {
            return;
        }
        if(EntityUtils.zombies.get(zombie.getUniqueId()).equals("Infected")) {
            if(!infected.containsKey(player.getUniqueId())) {
                infected.put(player.getUniqueId(), 1);
            }
            int amount = infected.get(player.getUniqueId());
            if(amount > 5) {
                return;
            }
            infected.put(player.getUniqueId(), amount + 1);
            ChatUtils.sendMsg(player, "&cВаше заражение достигло "+amount+" уровня.");
            Game.startInfection(player, main);
        }
        if(EntityUtils.zombies.get(zombie.getUniqueId()).equals("InfectedPower")) {
            if(!infected.containsKey(player.getUniqueId())) {
                infected.put(player.getUniqueId(), 2);
            }
            int amount = infected.get(player.getUniqueId());
            if(amount > 6) {
                return;
            }
            infected.put(player.getUniqueId(), amount + 2);
            ChatUtils.sendMsg(player, "&cВаше заражение достигло "+amount+" уровня.");
            Game.startInfection(player, main);
        }
    }

Java:
    Survival main;
    public EntityDamageListener(Survival main) {
        Bukkit.getPluginManager().registerEvents(this, main);
        this.main = main;
    }

Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
создай лучше глобальный scheduler который всегда активен и пробегай по мапе infected с теми же условиями. вместо put 0 используй remove. у тебя шедулеры дублируются. с мобильника написать не могу
 
создай лучше глобальный scheduler который всегда активен и пробегай по мапе infected с теми же условиями.
offtop чё по нагрузке?

Объединено

Я же правильно понял?
Сделать вот так:
Вам необходимо зарегистрироваться для просмотра изображений-вложений

А потом:
Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Последнее редактирование:
Назад
Сверху Снизу