Fixed AFK module.
This commit is contained in:
@@ -2,15 +2,19 @@ command afk {
|
|||||||
alias eafk;
|
alias eafk;
|
||||||
alias away;
|
alias away;
|
||||||
alias eaway;
|
alias eaway;
|
||||||
|
|
||||||
perm utils.afk;
|
perm utils.afk;
|
||||||
|
|
||||||
[empty] {
|
[empty] {
|
||||||
run afk;
|
run afk;
|
||||||
}
|
}
|
||||||
|
|
||||||
[optional:-s] {
|
[optional:-s] {
|
||||||
run afks -s;
|
run afksilent -s;
|
||||||
}
|
}
|
||||||
|
|
||||||
[optional:-s] [string:reason...] {
|
[optional:-s] [string:reason...] {
|
||||||
run afk2 -s reason;
|
run afkreason -s reason;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,23 @@
|
|||||||
package com.redstoner.modules.afk;
|
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.nemez.cmdmgr.Command;
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
import com.redstoner.annotations.AutoRegisterListener;
|
||||||
import com.redstoner.annotations.Commands;
|
import com.redstoner.annotations.Commands;
|
||||||
import com.redstoner.annotations.Version;
|
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.CommandHolderType;
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.misc.Utils;
|
import com.redstoner.misc.Utils;
|
||||||
import com.redstoner.modules.Module;
|
import com.redstoner.modules.Module;
|
||||||
import com.redstoner.modules.datamanager.DataManager;
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 0, revision = 6, compatible = 5)
|
@Version(major = 4, minor = 0, revision = 6, compatible = 5)
|
||||||
public class AFK implements Module, Listener {
|
public class AFK implements Module {
|
||||||
private CustomListener listener;
|
private AFKListener listener;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void firstLoad() {
|
public void firstLoad() {
|
||||||
@@ -59,7 +42,9 @@ public class AFK implements Module, Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postEnable() {
|
public void postEnable() {
|
||||||
listener = new CustomListener();
|
listener = new AFKListener();
|
||||||
|
|
||||||
|
Bukkit.getServer().getPluginManager().registerEvents(listener, ModuleLoader.getPlugin());
|
||||||
update_afk_listeners(Bukkit.getConsoleSender());
|
update_afk_listeners(Bukkit.getConsoleSender());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,15 +58,15 @@ public class AFK implements Module, Listener {
|
|||||||
return afk(sender, false, "");
|
return afk(sender, false, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "afks")
|
@Command(hook = "afksilent")
|
||||||
public boolean afk(CommandSender sender, boolean silent) {
|
public boolean afk(CommandSender sender, boolean silent) {
|
||||||
return afk(sender, silent, "");
|
return afk(sender, silent, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "afk2")
|
@Command(hook = "afkreason")
|
||||||
public boolean afk(CommandSender sender, boolean silent, String reason) {
|
public boolean afk(CommandSender sender, boolean silent, String reason) {
|
||||||
if (AFKUtil.isafk(sender)) {
|
if (AFKUtil.isAfk(sender)) {
|
||||||
AFKUtil.unafk(sender, silent);
|
AFKUtil.unAfk(sender, silent);
|
||||||
} else {
|
} else {
|
||||||
DataManager.setData(sender, "afk_time", System.currentTimeMillis());
|
DataManager.setData(sender, "afk_time", System.currentTimeMillis());
|
||||||
DataManager.setData(sender, "afk_reason", reason);
|
DataManager.setData(sender, "afk_reason", reason);
|
||||||
@@ -94,107 +79,22 @@ public class AFK implements Module, Listener {
|
|||||||
return true;
|
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) {
|
private boolean getListenSetting(String name, String def) {
|
||||||
return DataManager.getConfigOrDefault(name, def).equals("listen");
|
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")
|
@Command(hook = "update_afk_listeners")
|
||||||
public boolean update_afk_listeners(CommandSender sender) {
|
public boolean update_afk_listeners(CommandSender sender) {
|
||||||
Utils.broadcast(null, "Updating afk listeners...", new BroadcastFilter() {
|
Utils.broadcast(null, "Updating afk listeners...", recipient -> recipient.hasPermission("utils.afk.admin"));
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient) {
|
|
||||||
return recipient.hasPermission("utils.afk.admin");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
updateCustomListener(getListenSetting("move", "listen") || getListenSetting("look", "ignore"), PlayerMoveEvent.class);
|
listener.listenTo(
|
||||||
updateCustomListener(getListenSetting("chat", "listen"), AsyncPlayerChatEvent.class);
|
getListenSetting("move", "listen"),
|
||||||
updateCustomListener(getListenSetting("interact", "listen"), PlayerInteractEvent.class);
|
getListenSetting("look", "ignore"),
|
||||||
updateCustomListener(getListenSetting("command", "ignore"), PlayerCommandPreprocessEvent.class);
|
getListenSetting("chat", "listen"),
|
||||||
|
getListenSetting("interact", "listen"),
|
||||||
|
getListenSetting("command", "ignore")
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
64
src/main/java/com/redstoner/modules/afk/AFKListener.java
Normal file
64
src/main/java/com/redstoner/modules/afk/AFKListener.java
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/main/java/com/redstoner/modules/afk/AFKUtil.java
Normal file
30
src/main/java/com/redstoner/modules/afk/AFKUtil.java
Normal file
@@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user