PlayerAFKEvent

Discussion in 'Resources' started by p000ison, Jul 18, 2012.

Thread Status:
Not open for further replies.
  1. Offline

    p000ison

    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;
        }
    }
    
     
Thread Status:
Not open for further replies.

Share This Page