package net.mc_pandacraft.java.plugin.pandacraftutils.afk; import net.mc_pandacraft.java.plugin.pandacraftutils.ConfigManager; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerEggThrowEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.event.player.PlayerToggleSprintEvent; import org.bukkit.scheduler.BukkitRunnable; public class CommandAfk extends BukkitRunnable implements CommandExecutor, Listener { private PandacraftUtils plugin; private AfkPlayer[] players; private int timeoutAutoAfkMessage = ConfigManager.getInstance().AFK_timeoutAutoAfkMessage; private int timeoutAutoAfkKick = ConfigManager.getInstance().AFK_timeoutAutoAfkKick; public CommandAfk(PandacraftUtils pl) { plugin = pl; players = new AfkPlayer[plugin.getServer().getMaxPlayers()]; // analyse des joueurs déjà en ligne (/reload) for (Player p : plugin.getServer().getOnlinePlayers()) addPlayer(p); plugin.getCommand("afk").setExecutor(this); plugin.getServer().getScheduler().runTaskTimer(plugin, this, 5*20L, 20L); plugin.getServer().getPluginManager().registerEvents(this, plugin); } // ---------------------------------------- // ------------ Commande /AFK ------------- // ---------------------------------------- @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { boolean execute_self = false; boolean execute_other = false; Player other_player = null; if(sender instanceof Player) { if (args.length > 0) { if (((Player)sender).hasPermission("pandacraft.afk.other")) { if (plugin.getServer().getPlayer(args[0]) != null) { other_player = plugin.getServer().getPlayer(args[0]); execute_other = true; } else sender.sendMessage("§cLe joueur n'existe pas."); } else { sender.sendMessage("§cVous n'avez pas la permission d'effectuer cette action sur un autre joueur."); } } else execute_self = true; } else { if (args.length > 0) { if (plugin.getServer().getPlayer(args[0]) != null) { other_player = plugin.getServer().getPlayer(args[0]); execute_other = true; } else sender.sendMessage("§cLe joueur n'existe pas."); } else sender.sendMessage("§cVeuillez indiquer un joueur."); } if (execute_self) { Player p = (Player)sender; AfkPlayer ap = getAfkPlayer(p); if (ap == null) plugin.getLogger().severe("Cant find AfkPlayer with name "+p.getName()+" when performing command /afk"); else ap.performAfkCommand(); return true; } else if (execute_other && other_player != null) { AfkPlayer ap = getAfkPlayer(other_player); if (ap == null) plugin.getLogger().severe("Cant find AfkPlayer with name "+other_player.getName()+" when performing command /afk "); ap.adminToggleAfk(); return true; } return false; } // ---------------------------------------- // ----------- Analyse Auto-AFK ----------- // ---------------------------------------- @Override public void run() { // methode ex�cut� toute les secondes for (AfkPlayer ap : players) { // parcours de tout les joueurs if (ap == null) continue; if (ap.getPlayer().hasPermission("pandacraft.afk.exempt.autoafk")) continue; // les joueurs exemptés de l'auto-afk sont ignorés Player p = ap.getPlayer(); double timeElapsed = ap.getDurationSinceLastAction(); if (!ap.isAfk() && timeElapsed > timeoutAutoAfkMessage) ap.setAfk(true); // on indique le changement d'état AFK de la personne else if (ap.isAfk() && timeElapsed > timeoutAutoAfkKick && !p.hasPermission("pandacraft.afk.exempt.kick")) p.kickPlayer("Vous avez été inactif pendant plus de "+Math.floor(timeoutAutoAfkKick/60)+" minutes"); // on kick le joueur restant trop longtemps, si il n'est pas exempt� du kick } } // ---------------------------------------- // -------------- Ev�nements -------------- // ---------------------------------------- @EventHandler public void onPlayerJoin (PlayerJoinEvent event) { addPlayer(event.getPlayer()); } @EventHandler public void onPlayerQuit (PlayerQuitEvent event) { removePlayer(event.getPlayer()); } @EventHandler public void onPlayerMove (PlayerMoveEvent event) { Location from = event.getFrom(); Location to = event.getTo(); if ( (from.getPitch() == to.getPitch() && from.getYaw() == to.getYaw()) || (from.getX() == to.getX() && from.getY() == to.getY() && from.getZ() == to.getZ())) return; getAfkPlayer(event.getPlayer()).isDoingAction(); } @EventHandler public void onPlayerCommandPreprocess (PlayerCommandPreprocessEvent event) { if (event.getPlayer().hasPermission("pandacraft.afk.exempt.commandcheck")) return; String[] split = event.getMessage().split(" "); if (split.length > 0 && ( split[0].equalsIgnoreCase("/afk") || split[0].equalsIgnoreCase("/away") || split[0].equalsIgnoreCase("/mail") || split[0].equalsIgnoreCase("/email") || split[0].equalsIgnoreCase("/m") || split[0].equalsIgnoreCase("/msg") || split[0].equalsIgnoreCase("/t") || split[0].equalsIgnoreCase("/tell") || split[0].equalsIgnoreCase("/w") || split[0].equalsIgnoreCase("/whisper") || split[0].equalsIgnoreCase("/r") || split[0].equalsIgnoreCase("/reply") ) ) return; getAfkPlayer(event.getPlayer()).isDoingAction(); } @EventHandler public void onPlayerInteract (PlayerInteractEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerInteractEntity (PlayerInteractEntityEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerTeleport (PlayerTeleportEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerToggleSprint (PlayerToggleSprintEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerToggleFlight (PlayerToggleFlightEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerToggleSneak (PlayerToggleSneakEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onAsyncPlayerChat (AsyncPlayerChatEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerDropItem (PlayerDropItemEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } @EventHandler public void onPlayerEggThrow (PlayerEggThrowEvent event) { try { getAfkPlayer(event.getPlayer()).isDoingAction(); } catch (NullPointerException e) { } } // ----------------------------------------- // ---------- Gestion des donn�es ---------- // ----------------------------------------- public AfkPlayer getAfkPlayer(Player p) { for (AfkPlayer ap : players) { if (ap == null) continue; if (ap.getPlayer() == p) return ap; } return null; } private void addPlayer(Player p) { int i=0; while (players[i] != null && i