Планирование задачи для каждого игрока не очень хорошая идея, также почему вы используете асинхронную задачу? Они особенно дороги в настройке и могут привести к непреднамеренному поведению, если вы не знаете, что делаете. Всегда старайтесь использовать задачу синхронизации, если это возможно.
Для наименьшей задержки я использую один планировщик, называемый глобальным планировщиком.
Слушайте PlayerJoinEvent , нам нужно знать каждого игрока и когда он присоединился. Я использую hashmap для хранения UUID игрока, а также long, представляющий дату их присоединения.
private HashMap<UUID, Long> map = new HashMap<UUID, Long>();
@EventHandler
public void onJoin(PlayerJoinEvent event) {
map.put(event.getPlayer().getUniqueID(), Calendar.getInstance().getTime().getTime());
}
Вместо этого вы можете сохранить имя игрока или даже объект игрока, но UUID являются наиболее надежными, поскольку они последовательны.
Теперь нам нужно проверить, является ли hashmap пустым или нет, это можно сделать сразу после установки значений для карты:
- если карта не пуста и глобальный планировщик не запущен, запустите
это.
- если карта пуста и планировщик работает, остановите ее.
Это позволяет запускать его только при необходимости, уменьшая задержку.
В планировщике мы хотим перебрать всех игроков на карте и сравнить их дату присоединения с текущей датой, если прошло более 15 минут, сделать что-то и установить дату присоединения игрока в качестве текущей даты.
Этот планировщик желательно запускать как можно реже, но для достижения наиболее точных результатов стремитесь к секунде (20 тиков)