Кулдаун у предметов

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
1.12.2
Как можно сделать кулдаун после использования предмета, например накладывается эффект на игрока при каком то условии, и он не может повторить наложение сек 10

От модератора: Готовый вариант написан здесь *тык*.
 
Последнее редактирование модератором:

BuseSo

Разработчик
Создать HashMap<UUID, Integer> и таймер. При использовании предмета засовывать игрока в эту мапу и в таймере, используя forEach (т.е. for(UUID uuid : мапа.keySet()) {тыры пыры} ), делать отсчёт. И при повторном использовании проверять, находится ли он в этой мапе или нет. Если да, то отменять действие, если нет, то выполнять код, который должен идти.
 

q20w26a

Разработчик
У меня в плагине была задержка для команд, могу кусок показать, но там на тасках все
 

Baroness's Dev

Разработчик
Код:
        //задаешь переменную
        final int cooldown;
        //если кулдауна нет
        if (cooldown != 1) {
            //code
            //исполнить и поставить кулдаун
            cooldown = 1;
            new BukkitRunnable() {

                @Override
                public void run() {
                    cooldown = 0;
                }
            }.runTaskLater(this,600*20);
            //снять кулдаун через 600 секунд
        }
Я бы так сделал
 

Baroness's Dev

Разработчик
моей IDE не нравится такой подходит, вот код, на который не ругается

Java:
        final int[] cooldown = new int[0];
        if (cooldown[0] != 1) {
            //code
            cooldown[0] = 1;
            new BukkitRunnable() {

                @Override
                public void run() {
                    cooldown[0] = 0;
                }
            }.runTaskLater(this,600*20);
        } else {
            player.sendMessage("У тебя кулдаун.");
        }
Авто объединение сообщений:

BuseSo, переменная не на игрока, а на сервер работает? Ой, точно...
Авто объединение сообщений:

Тогда хэшмапом, по другому никак
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
посмотрел разные варианты, не понял как обьединить это в одно, пожалуйста, напиши кусок кода, дальше я сам попробую@BuseSo,
 

BuseSo

Разработчик
Java:
public class CustomTimer extends BukkitRunnable {
    @Override
    public void run() {
        for(UUID uuid : класс.map.keySet()) {
            int time = класс.map.get(uuid);
            
            if(time == 0) {
                класс.map.remove(uuid);
            } else {
                класс.map.put(uuid, time-1);
            }
        }
    }
}
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
BuseSo, не одно, так другое (и как использовать UUID)
Java:
public class Handler implements Listener{
    public static Object map;
    @EventHandler
    public void use(PlayerInteractEvent e) {
        Player p = e.getPlayer();
        if(e.getAction() == Action.RIGHT_CLICK_AIR) {
            if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA +"Muramasa")) {     
                p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,3 ,40));
                p.playSound(p.getLocation(), Sound.ENTITY_FIREWORK_LAUNCH, 10, 3);
            }
        }
    }
}



----------------------

import java.util.UUID;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class Timer extends BukkitRunnable {

    @Override
    public void run() {
        for(UUID uuid : ((Player) Handler.map).keySet()) { //The method keySet() is undefined for the type Player
            int time = ((Player) Handler.map).get(uuid); //The method get(UUID) is undefined for the type Player
            if(time == 0) {
                ((Player) Handler.map).remove();
            } else {
                ((Player) Handler.map).put(uuid, time-5);//The method get(UUID) is undefined for the type Player
            }
        }
    }
}
 
Последнее редактирование:

BuseSo

Разработчик
Спокойствие и терпение

Вот таким должен быть твой класс слушателя:
Java:
public class Handler implements Listener{
    public static HashMap<UUID, Integer> map = new HashMap<>();
    @EventHandler
    public void use(PlayerInteractEvent e) {
        Player p = e.getPlayer();
        if(e.getAction() == Action.RIGHT_CLICK_AIR) {
            if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA +"Muramasa")) {     
                p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,3 ,40));
                p.playSound(p.getLocation(), Sound.ENTITY_FIREWORK_LAUNCH, 10, 3);
                map.put(p.getUniqueId(), число в секундах для задержки);
            }
        }
    }
}
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
BuseSo, уже не удобно спрашивать, но если таймер идет после действия, то как я могу отменить его(как мне сделать ссылку на время?
 
Последнее редактирование модератором:

Baroness's Dev

Разработчик
у тебя же не выставлен сам кулдаун, только переменная в хэшмапе. Сделай BukkitRunnable с runTaskLater
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
а он разве тогда не будет откладывать клики??

---------
а это же вроде кулдаун?
 
Последнее редактирование модератором:

BuseSo

Разработчик
а это же вроде кулдаун?
Да, это он.

как я могу отменить его(как мне сделать ссылку на время?
Java:
if(map.containsKey(p.getUniqueId())) {
    //Код, если содержится в хеше
    int cd = map.get(p.getUniqueId());
    p.sendMessage("Вы не можете делать это ещё "+cd+" сек!");
}
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
BuseSo, я попробовал в разные части кода подставить, но в итоге он у меня в любом случае присылает сообщение и код продолжает дальше идти своим чередом
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
BuseSo, нет, я прост понять не могу, где само условие, что то вроде time>5
 

BuseSo

Разработчик
scrimers, оно не нужно. Если игрок есть в хеше, то это уже значит, что у игрока задержка стоит.
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
BuseSo, он будет из кеша удалять, после истечения времени?? + какой именно код мне вписать, точнее как сделать ссылку на время
 

Комнаты в чате

Верх Низ