heyho Community, from a request of a friend I made an AFKEvent. Basically I tried to make it as lightweight as possible. So here it is. Todo: - Call leave event when the player chats AFKManager: Code: /* * Copyright (C) 2012 p000ison * * This work is licensed under the Creative Commons * Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of * this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send * a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, * California, 94105, USA. * */ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.Plugin; /** * * @author Max */ public class AFKManager implements Listener { private Plugin plugin; private Map<String, LastLocation> locations = new HashMap<String, LastLocation>(); private long afkTime; /** * AFKManager * * @param plugin * @param afkTime */ public AFKManager(Plugin plugin, long afkTime) { this.plugin = plugin; this.afkTime = afkTime; Server server = plugin.getServer(); server.getScheduler().scheduleSyncRepeatingTask(plugin, new CheckLocationThread(), 0L, 40L); server.getPluginManager().registerEvents(this, plugin); } /** * AFK check-thread * */ private class CheckLocationThread implements Runnable { @Override public void run() { for (Player player : plugin.getServer().getOnlinePlayers()) { Location location = player.getLocation(); String name = player.getName(); LastLocation loc = new LastLocation(location, System.currentTimeMillis()); setLastLocation(player, loc); if (!getLastLocaiton(name).isAlreadyCalled() && isAFK(player)) { plugin.getServer().getPluginManager().callEvent(new AFKEvent(player)); setAlreadyCalled(name); } } } } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerQuit(PlayerQuitEvent event) { locations.remove(event.getPlayer().getName()); } public void setAlreadyCalled(String player) { locations.get(player).setAlreadyCalled(true); } /** * Internally used * */ private class LastLocation { private Location location; private long date; private boolean alreadyCalled = false; public LastLocation(Location location, long date) { this.location = location; this.date = date; } public void setDate(long date) { this.date = date; } public void setLocation(Location location) { this.location = location; } public void setAlreadyCalled(boolean alreadyCalled) { this.alreadyCalled = alreadyCalled; } public boolean isAlreadyCalled() { return alreadyCalled; } public Location getLocation() { return location; } public long getDate() { return date; } } /** * Internally used * */ private void setLastLocation(Player player, LastLocation loc) { String name = player.getName(); if (!locations.containsKey(name)) { locations.put(name, loc); } else { LastLocation lloc = locations.get(name); Location rloc = loc.getLocation(); if (!rloc.equals(lloc.getLocation())) { lloc.setDate(loc.getDate()); lloc.setLocation(loc.getLocation()); if (lloc.isAlreadyCalled()) { plugin.getServer().getPluginManager().callEvent(new AFKLeaveEvent(player)); } lloc.setAlreadyCalled(false); } } } /** * Internally used * */ private LastLocation getLastLocaiton(String player) { return locations.get(player); } /** * Checks if a player is afk -> default afk time * * @param player * @return */ public boolean isAFK(Player player) { return isAFK(player, afkTime); } /** * Checks if a player is afk * * @param player * @param time * @return */ public boolean isAFK(Player player, long time) { Location locAtm = player.getLocation(); LastLocation lastLocaion = getLastLocaiton(player.getName()); if (lastLocaion == null) { return false; } if (locAtm.equals(lastLocaion.getLocation())) { if (lastLocaion.getDate() < System.currentTimeMillis() - time) { return true; } } return false; } } AFKEvent: Code: /* * Copyright (C) 2012 p000ison * * This work is licensed under the Creative Commons * Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of * this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send * a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, * California, 94105, USA. * */ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; /** * * @author Max */ public class AFKEvent extends PlayerEvent { private static final HandlerList handlers = new HandlerList(); public AFKEvent(Player who) { super(who); } @Override public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } } AFKLeaveEvent: Code: /* * Copyright (C) 2012 p000ison * * This work is licensed under the Creative Commons * Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of * this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send * a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, * California, 94105, USA. * */ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; /** * * @author Max */ public class AFKLeaveEvent extends PlayerEvent { private static final HandlerList handlers = new HandlerList(); public AFKLeaveEvent(Player who) { super(who); } @Override public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } }