diff options
author | David Panić <david@panic.tk> | 2018-12-15 23:11:50 +0100 |
---|---|---|
committer | David Panić <david@panic.tk> | 2018-12-15 23:11:50 +0100 |
commit | 6a6a6f55073fb96d91c211afb511005b55d292db (patch) | |
tree | b526db04128283286f1e58be3e2695795cc8f9a0 | |
parent | 8bcb01366090236478f04c69c98c1b8f365919ac (diff) |
Fixed AFK module.
-rw-r--r-- | src/main/java/com/redstoner/modules/afk/AFK.cmd | 8 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/afk/AFK.java | 144 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/afk/AFKListener.java | 64 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/afk/AFKUtil.java | 30 |
4 files changed, 122 insertions, 124 deletions
diff --git a/src/main/java/com/redstoner/modules/afk/AFK.cmd b/src/main/java/com/redstoner/modules/afk/AFK.cmd index 6bd8b7f..6353e33 100644 --- a/src/main/java/com/redstoner/modules/afk/AFK.cmd +++ b/src/main/java/com/redstoner/modules/afk/AFK.cmd @@ -2,15 +2,19 @@ command afk { alias eafk; alias away; alias eaway; + perm utils.afk; + [empty] { run afk; } + [optional:-s] { - run afks -s; + run afksilent -s; } + [optional:-s] [string:reason...] { - run afk2 -s reason; + run afkreason -s reason; } } diff --git a/src/main/java/com/redstoner/modules/afk/AFK.java b/src/main/java/com/redstoner/modules/afk/AFK.java index 23b36ef..eacbc3e 100644 --- a/src/main/java/com/redstoner/modules/afk/AFK.java +++ b/src/main/java/com/redstoner/modules/afk/AFK.java @@ -1,40 +1,23 @@ package com.redstoner.modules.afk; -import java.lang.reflect.InvocationTargetException; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.EventException; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.EventExecutor; - import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; import com.redstoner.annotations.Commands; import com.redstoner.annotations.Version; -import com.redstoner.misc.BroadcastFilter; +import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.Main; import com.redstoner.misc.Utils; import com.redstoner.modules.Module; import com.redstoner.modules.datamanager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.event.HandlerList; @Commands(CommandHolderType.File) @AutoRegisterListener @Version(major = 4, minor = 0, revision = 6, compatible = 5) -public class AFK implements Module, Listener { - private CustomListener listener; +public class AFK implements Module { + private AFKListener listener; @Override public void firstLoad() { @@ -59,7 +42,9 @@ public class AFK implements Module, Listener { @Override public void postEnable() { - listener = new CustomListener(); + listener = new AFKListener(); + + Bukkit.getServer().getPluginManager().registerEvents(listener, ModuleLoader.getPlugin()); update_afk_listeners(Bukkit.getConsoleSender()); } @@ -73,15 +58,15 @@ public class AFK implements Module, Listener { return afk(sender, false, ""); } - @Command(hook = "afks") + @Command(hook = "afksilent") public boolean afk(CommandSender sender, boolean silent) { return afk(sender, silent, ""); } - @Command(hook = "afk2") + @Command(hook = "afkreason") public boolean afk(CommandSender sender, boolean silent, String reason) { - if (AFKUtil.isafk(sender)) { - AFKUtil.unafk(sender, silent); + if (AFKUtil.isAfk(sender)) { + AFKUtil.unAfk(sender, silent); } else { DataManager.setData(sender, "afk_time", System.currentTimeMillis()); DataManager.setData(sender, "afk_reason", reason); @@ -94,107 +79,22 @@ public class AFK implements Module, Listener { return true; } - private void registerCustomListenerEvent(Class<? extends Event> event) { - Bukkit.getPluginManager().registerEvent(event, listener, EventPriority.MONITOR, listener, Main.plugin); - } - - /* - * This is perfectly valid code. Copied from the source code of the Event class: - * "All events require a static method named getHandlerList()" - */ - private void unregisterCustomListenerEvent(Class<? extends Event> clazz) { - try { - HandlerList list = (HandlerList) clazz.getMethod("getHandlerList").invoke(null); - list.unregister(listener); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { - e.printStackTrace(); - } - } - private boolean getListenSetting(String name, String def) { return DataManager.getConfigOrDefault(name, def).equals("listen"); } - private void updateCustomListener(boolean listen, Class<? extends Event> clazz) { - if (listen) registerCustomListenerEvent(PlayerInteractEvent.class); - else unregisterCustomListenerEvent(PlayerInteractEvent.class); - } - @Command(hook = "update_afk_listeners") public boolean update_afk_listeners(CommandSender sender) { - Utils.broadcast(null, "Updating afk listeners...", new BroadcastFilter() { - @Override - public boolean sendTo(CommandSender recipient) { - return recipient.hasPermission("utils.afk.admin"); - } - }); - - updateCustomListener(getListenSetting("move", "listen") || getListenSetting("look", "ignore"), PlayerMoveEvent.class); - updateCustomListener(getListenSetting("chat", "listen"), AsyncPlayerChatEvent.class); - updateCustomListener(getListenSetting("interact", "listen"), PlayerInteractEvent.class); - updateCustomListener(getListenSetting("command", "ignore"), PlayerCommandPreprocessEvent.class); + Utils.broadcast(null, "Updating afk listeners...", recipient -> recipient.hasPermission("utils.afk.admin")); - return true; - } + listener.listenTo( + getListenSetting("move", "listen"), + getListenSetting("look", "ignore"), + getListenSetting("chat", "listen"), + getListenSetting("interact", "listen"), + getListenSetting("command", "ignore") + ); - @EventHandler - public void onLeave(PlayerQuitEvent event) { - DataManager.setState(event.getPlayer(), "afk", false); - } -} - -class CustomListener implements Listener, EventExecutor { - private boolean move = true, look = false; - - @Override - public void execute(Listener listener, Event event) throws EventException { - if (event instanceof PlayerEvent) { - if (event instanceof PlayerMoveEvent) { - PlayerMoveEvent pevent = (PlayerMoveEvent) event; - - double distance = pevent.getFrom().distance(pevent.getTo()); - boolean moved = distance > 0; - boolean looked = (pevent.getFrom().getPitch() != pevent.getTo().getPitch()) || (pevent.getFrom().getYaw() != pevent.getTo().getYaw()); - - if ((move && moved) || (look && looked)) { - Player player = pevent.getPlayer(); - - if (AFKUtil.isafk(player) && !AFKUtil.isVanished(player)) AFKUtil.unafk(player, AFKUtil.isSilent(player)); - } - } else { - PlayerEvent pevent = (PlayerEvent) event; - Player player = pevent.getPlayer(); - - if (AFKUtil.isafk(player) && !AFKUtil.isVanished(player)) AFKUtil.unafk(player, AFKUtil.isSilent(player)); - } - } - } - - public void listenMove(boolean move) { - this.move = move; - } - - public void listenLook(boolean look) { - this.look = look; - } -} - -class AFKUtil { - protected static void unafk(CommandSender sender, boolean silent) { - DataManager.setState(sender, "afk", false); - - if (!silent) Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null); - } - - protected static boolean isafk(CommandSender sender) { - return DataManager.getState(sender, "afk"); - } - - protected static boolean isVanished(Player player) { - return DataManager.getState(player, "vanished"); - } - - protected static boolean isSilent(CommandSender sender) { - return DataManager.getState(sender, "afk_silent"); + return true; } } diff --git a/src/main/java/com/redstoner/modules/afk/AFKListener.java b/src/main/java/com/redstoner/modules/afk/AFKListener.java new file mode 100644 index 0000000..d995d8b --- /dev/null +++ b/src/main/java/com/redstoner/modules/afk/AFKListener.java @@ -0,0 +1,64 @@ +package com.redstoner.modules.afk; + +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.Utils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.*; + +public class AFKListener implements Listener { + private boolean + move = false, + look = false, + chat = false, + interact = false, + command = false; + + protected void listenTo(boolean move, boolean look, boolean chat, boolean interact, boolean command) { + this.move = move; + this.look = look; + this.chat = chat; + this.interact = interact; + this.command = command; + + String lt = "Listening to:"; + + if (move) lt += " move"; + if (look) lt += " look"; + if (chat) lt += " chat"; + if (interact) lt+= " interact"; + if (command) lt += " command"; + + Utils.broadcast(null, lt, recipient -> recipient.hasPermission("utils.afk.admin")); + } + + @EventHandler + public void onMove(PlayerMoveEvent event) { + double distance = event.getFrom().distance(event.getTo()); + + boolean moved = distance > 0; + boolean looked = (event.getFrom().getPitch() != event.getTo().getPitch()) || (event.getFrom().getYaw() != event.getTo().getYaw()); + + if ((move && moved) || (look && looked)) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onChat(PlayerChatEvent event) { + if (chat) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + if (interact) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) { + if (command) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + AFKUtil.unAfk(event.getPlayer(), true); + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/afk/AFKUtil.java b/src/main/java/com/redstoner/modules/afk/AFKUtil.java new file mode 100644 index 0000000..3746632 --- /dev/null +++ b/src/main/java/com/redstoner/modules/afk/AFKUtil.java @@ -0,0 +1,30 @@ +package com.redstoner.modules.afk; + +import com.redstoner.misc.Utils; +import com.redstoner.modules.datamanager.DataManager; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class AFKUtil { + protected static void unAfk(CommandSender sender, boolean silent) { + DataManager.setState(sender, "afk", false); + + if (!silent) Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null); + } + + protected static boolean isAfk(CommandSender sender) { + return DataManager.getState(sender, "afk"); + } + + protected static boolean isVanished(Player player) { + return DataManager.getState(player, "vanished"); + } + + protected static boolean isSilent(CommandSender sender) { + return DataManager.getState(sender, "afk_silent"); + } + + protected static void checkedUnAfk(Player player) { + if (isAfk(player) && !isVanished(player)) unAfk(player, isSilent(player)); + } +}
\ No newline at end of file |