Помогите Лимит на команды

  • Автор темы Автор темы Niker
  • Дата начала Дата начала

Niker

Новичок
Пользователь
Баллы
6
Хотелось бы узнать будет ли эффективна такая релизация:{

И так после ввода команд через евент PlayerCommandPreprocessEvent
Мы получаем игрока, После этого получаем команду, Для хранения будем юзать hashmap.
Вкачестве ключа у нас будет, Ник игрока<String>
К нику справа добавляем команду.
Как только игрок ввеет туже команду. Мы получим ник и команду, Также склейм И проверим если test.containsKey(nick); вернет true , То получаем обьект который будет по факту переменой int;
И выводим что то в духе Вы должный подождать 5s, Для конвентарции int to string буду юзать Integer, Перед тем как выполнить её снова.
Теперь про шедулер.
Буду юзать стандартный java. В onEnable Поднимаем поток, В нем цикл while, И после этого он через цикл for будет получать каждое значение из hashmap, И добавлять в промежуточную переменую i, И убавлять её на 1,И предворительно проверять, Если оно будет на 0, То оно просто стопанет цикл for и удалит из hashmap значение. Для пауз в while, Будет Thread.Sleep(1000);

}
 
Жесть какая-то.
Лучше напиши код с комментариями, так будет проще понять.
Единственное, что я могу сказать однозначно - в качестве ключа в мапе стоит использовать не ник игрока, а сам объект игрока.
А вместо потока со sleep используй баккитовский шедулер.
остальное не понял.
 
Как все сложно то. Вот что значит, школу прогуливать. Храни системное время и проводи с ним расчеты. Это все без шедулера делается.
 
Код:
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof OfflinePlayer)) {
            return false;
        }
        OfflinePlayer other = (OfflinePlayer) obj;
        if ((this.getUniqueId() == null) || (other.getUniqueId() == null)) {
            return false;
        }

        boolean uuidEquals = this.getUniqueId().equals(other.getUniqueId());
        boolean idEquals = true;

        if (other instanceof CraftPlayer) {
            idEquals = this.getEntityId() == ((CraftPlayer) other).getEntityId();
        }

        return uuidEquals && idEquals;
    }
 
Код:
class Cooldowns {
    private Map<Player, Map<String, Long>> cooldowns;

    Cooldowns() {
        cooldowns = new HashMap<>();
    }

    void addCooldown(Player player, String command, long delay) {
        command = command.toLowerCase();
        if (cooldowns.contains(player)) {
            cooldowns.get(player).put(command, System.currentTimeMillis() + delay);
        } else {
            Map<String, Long> map = new HashMap<>();
            map.put(command, delay);
            cooldowns.put(player, map);
        }
    }

    boolean isInCooldown(Player player, String command) {
        Map<String, Long> commands = cooldowns.getOrDefault(player, null);
        if (commands == null) return false;

        command = command.toLowerCase();
        if (!commands.contains(command)) return false;

        long timeout = commands.get(command);
        return System.currentTimeMillis() < timeout;
    }
}
 
Последнее редактирование:
Плохой пример вот так писать HashMap<Player, HashMap<String, Long>> cooldowns;
Нужно так Map<Player, Map<String, Long>> cooldowns;
Если нужно будет сменить тип мапы, а приложение большое, это займет больше времени.
 
Плохой пример вот так писать HashMap<Player, HashMap<String, Long>> cooldowns;
Нужно так Map<Player, Map<String, Long>> cooldowns;
Если нужно будет сменить тип мапы, а приложение большое, это займет больше времени.
Да, поправил
 
Назад
Верх