Помогите Сделать игрока афк, если он стоит более X сек.

Статус
Закрыто для дальнейших ответов.

NukerFall

Активный участник
Пользователь
Баллы
76
Здравствуйте, формучане. Очень нужна помощь с моей задумкой. Во многих плагинах каким-то образом уже реализовано то, что после некоторого времени игрок помечается как афк. Вопрос, каким образом идёт проверка времени после последнего движения? Есть что-то такое...
Класс... {
-------------------
@EventHandler
public void onMove(PlayerMoveEvent e) {
Player p = e.getPlayer();
Location loc = e.getTo();
Bukkit.getScheduler().runTaskLater(main, new BukkitRunnable() {
@Override
public void run() {
//Если лока игрока сейчас равна прошлой, то {
main.setAfk(p, true);
}
}
}, 20L * main.getConfig().getInt("time-afk"))
}
}
 
Насколько я знаю, то там, если не отправляются пакеты о движении игрока какое-то время, то он записывается в афк
 
Насколько я знаю, то там, если не отправляются пакеты о движении игрока какое-то время, то он записывается в афк
Мне бы пример в коде... У меня есть размышления, но никак не пойму, как же мне это реализовать...
 
PHP:
private Map<UUID,Integer> afkPlayers;

public ConstructorFunction() {
    afkPlayers = new HashMap<UUID,Integer>();

    new BukkitRunnable() {
      
        @Override
        public void run() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                int current = afkPlayers.get(player.getUniqueId());
                if (current == null) {
                    current = 0;
                }
                current++;
                afkPlayers.remove(player.getUniqueId());
                afkPlayers.put(player.getUniqueId(), current);
            }
        }
    }.runTaskTimer(PluginInstance, 20);
}

@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onMove(PlayerMoveEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onInteract(PlayerInteractEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

public boolean isPlayerAfkLongerThan(Player player, int seconds) {
    return (afkPlayers.get(player.getUniqueId()) >= seconds);
}
 
PHP:
private Map<UUID,Integer> afkPlayers;

public ConstructorFunction() {
    afkPlayers = new HashMap<UUID,Integer>();

    new BukkitRunnable() {
     
        @Override
        public void run() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                int current = afkPlayers.get(player.getUniqueId());
                if (current == null) {
                    current = 0;
                }
                current++;
                afkPlayers.remove(player.getUniqueId());
                afkPlayers.put(player.getUniqueId(), current);
            }
        }
    }.runTaskTimer(PluginInstance, 20);
}

@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onMove(PlayerMoveEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onInteract(PlayerInteractEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

public boolean isPlayerAfkLongerThan(Player player, int seconds) {
    return (afkPlayers.get(player.getUniqueId()) >= seconds);
}
Большое спасибо, сейчас попробую.
 
PHP:
private Map<UUID,Integer> afkPlayers;

public ConstructorFunction() {
    afkPlayers = new HashMap<UUID,Integer>();

    new BukkitRunnable() {
    
        @Override
        public void run() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                int current = afkPlayers.get(player.getUniqueId());
                if (current == null) {
                    current = 0;
                }
                current++;
                afkPlayers.remove(player.getUniqueId());
                afkPlayers.put(player.getUniqueId(), current);
            }
        }
    }.runTaskTimer(PluginInstance, 20);
}

@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onMove(PlayerMoveEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onInteract(PlayerInteractEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

public boolean isPlayerAfkLongerThan(Player player, int seconds) {
    return (afkPlayers.get(player.getUniqueId()) >= seconds);
}
Когда нужно вызывать эту функцию? Сразу в onEnable()?
 
Насколько я знаю, то там, если не отправляются пакеты о движении игрока какое-то время, то он записывается в афк
Эти пакеты отправляются независимо от того - двигается игрок или нет.
Выше накидали варианты решения этой задачи
 
PHP:
private Map<UUID,Integer> afkPlayers;

public ConstructorFunction() {
    afkPlayers = new HashMap<UUID,Integer>();

    new BukkitRunnable() {
     
        @Override
        public void run() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                int current = afkPlayers.get(player.getUniqueId());
                if (current == null) {
                    current = 0;
                }
                current++;
                afkPlayers.remove(player.getUniqueId());
                afkPlayers.put(player.getUniqueId(), current);
            }
        }
    }.runTaskTimer(PluginInstance, 20);
}

@EventHandler
public void onChat(AsyncPlayerChatEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onMove(PlayerMoveEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onInteract(PlayerInteractEvent e) {
    afkPlayers.remove(e.getPlayer().getUniqueId());
}

public boolean isPlayerAfkLongerThan(Player player, int seconds) {
    return (afkPlayers.get(player.getUniqueId()) >= seconds);
}
Всегда было интересно, зачем вы онлайн-игроков храните по UUID. Расскажешь?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх