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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Niker, 18 июл 2019.

  1. Автор темы
    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);

    }
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Жесть какая-то.
    Лучше напиши код с комментариями, так будет проще понять.
    Единственное, что я могу сказать однозначно - в качестве ключа в мапе стоит использовать не ник игрока, а сам объект игрока.
    А вместо потока со sleep используй баккитовский шедулер.
    остальное не понял.
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Как все сложно то. Вот что значит, школу прогуливать. Храни системное время и проводи с ним расчеты. Это все без шедулера делается.
     
  4. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Не годится. Игрок перезайдёт - объект уже невалидный. Тогда уж UUID игрока.
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Зависит от equals класса юзера. Там поиск не только через ==.
     
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
        @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;
        }
     
  7. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Код:
    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;
        }
    }
    
     
    Последнее редактирование: 18 июл 2019
  8. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Плохой пример вот так писать HashMap<Player, HashMap<String, Long>> cooldowns;
    Нужно так Map<Player, Map<String, Long>> cooldowns;
    Если нужно будет сменить тип мапы, а приложение большое, это займет больше времени.
     
  9. HoShiMin

    HoShiMin Старожил Пользователь

    Баллы:
    173
    Да, поправил
     

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