226 lines
6.3 KiB
Java
226 lines
6.3 KiB
Java
package com.redstoner.modules.afk;
|
|
|
|
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.misc.CommandHolderType;
|
|
import com.redstoner.misc.Main;
|
|
import com.redstoner.misc.Utils;
|
|
import com.redstoner.modules.Module;
|
|
import com.redstoner.modules.datamanager.DataManager;
|
|
|
|
@Commands(CommandHolderType.File)
|
|
@AutoRegisterListener
|
|
@Version(major = 4, minor = 0, revision = 5, compatible = 5)
|
|
public class AFK implements Module, Listener
|
|
{
|
|
private CustomListener listener;
|
|
boolean move = true, look = false;
|
|
|
|
@Override
|
|
public void firstLoad()
|
|
{
|
|
Module.super.firstLoad();
|
|
DataManager.setConfig("indicator", "&7[AFK]");
|
|
String[] choices = new String[] {"listen", "ignore"};
|
|
DataManager.setConfig("move", "listen", choices);
|
|
DataManager.setConfig("look", "ignore", choices);
|
|
DataManager.setConfig("chat", "listen", choices);
|
|
DataManager.setConfig("interact", "listen", choices);
|
|
DataManager.setConfig("command", "ignore", choices);
|
|
}
|
|
|
|
@Override
|
|
public void migrate(Version old)
|
|
{
|
|
Module.super.migrate(old);
|
|
if ((old.major() == 4) && (old.minor() == 0) && (old.revision() == 3))
|
|
{
|
|
String[] choices = new String[] {"listen", "ignore"};
|
|
DataManager.setConfig("look", "ignore", choices);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void postEnable()
|
|
{
|
|
Module.super.postEnable();
|
|
listener = new CustomListener();
|
|
update_afk_listeners(Bukkit.getConsoleSender());
|
|
}
|
|
|
|
@Override
|
|
public void onDisable()
|
|
{
|
|
Module.super.onDisable();
|
|
HandlerList.unregisterAll(listener);
|
|
}
|
|
|
|
@Command(hook = "afk")
|
|
public boolean afk(CommandSender sender)
|
|
{
|
|
return afk(sender, "");
|
|
}
|
|
|
|
@Command(hook = "afk2")
|
|
public boolean afk(CommandSender sender, String reason)
|
|
{
|
|
return afk(sender, reason, false);
|
|
}
|
|
|
|
public boolean afk(CommandSender sender, String reason, boolean silent)
|
|
{
|
|
if (isafk(sender))
|
|
{
|
|
unafk(sender);
|
|
}
|
|
else
|
|
{
|
|
DataManager.setData(sender, "afk_reason", reason);
|
|
DataManager.setState(sender, "afk", true);
|
|
if (!silent)
|
|
Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is now AFK", null);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void unafk(CommandSender sender)
|
|
{
|
|
DataManager.setState(sender, "afk", false);
|
|
Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null);
|
|
}
|
|
|
|
public boolean isafk(CommandSender sender)
|
|
{
|
|
return DataManager.getState(sender, "afk");
|
|
}
|
|
|
|
public boolean isVanished(Player player)
|
|
{
|
|
return DataManager.getState(player, "vanished");
|
|
}
|
|
|
|
@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");
|
|
}
|
|
});
|
|
move = DataManager.getConfigOrDefault("move", "listen").equals("listen");
|
|
look = DataManager.getConfigOrDefault("look", "ignore").equals("listen");
|
|
if (move || look)
|
|
Bukkit.getPluginManager().registerEvent(PlayerMoveEvent.class, listener, EventPriority.MONITOR, listener,
|
|
Main.plugin);
|
|
else
|
|
PlayerMoveEvent.getHandlerList().unregister(listener);
|
|
if (DataManager.getConfigOrDefault("chat", "listen").equals("listen"))
|
|
Bukkit.getPluginManager().registerEvent(PlayerInteractEvent.class, listener, EventPriority.MONITOR,
|
|
listener, Main.plugin);
|
|
else
|
|
PlayerInteractEvent.getHandlerList().unregister(listener);
|
|
if (DataManager.getConfigOrDefault("interact", "listen").equals("listen"))
|
|
Bukkit.getPluginManager().registerEvent(AsyncPlayerChatEvent.class, listener, EventPriority.MONITOR,
|
|
listener, Main.plugin);
|
|
else
|
|
AsyncPlayerChatEvent.getHandlerList().unregister(listener);
|
|
if (DataManager.getConfigOrDefault("command", "ignore").equals("listen"))
|
|
Bukkit.getPluginManager().registerEvent(PlayerCommandPreprocessEvent.class, listener, EventPriority.MONITOR,
|
|
listener, Main.plugin);
|
|
else
|
|
PlayerCommandPreprocessEvent.getHandlerList().unregister(listener);
|
|
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 (isafk(player))
|
|
if (!isVanished(player))
|
|
unafk(player);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PlayerEvent pevent = (PlayerEvent) event;
|
|
Player player = pevent.getPlayer();
|
|
if (isafk(player))
|
|
if (!isVanished(player))
|
|
unafk(player);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void unafk(CommandSender sender)
|
|
{
|
|
DataManager.setState(sender, "afk", false);
|
|
Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null);
|
|
}
|
|
|
|
public boolean isafk(CommandSender sender)
|
|
{
|
|
return DataManager.getState(sender, "afk");
|
|
}
|
|
|
|
public boolean isVanished(Player player)
|
|
{
|
|
return DataManager.getState(player, "vanished");
|
|
}
|
|
|
|
public void listenMove(boolean move)
|
|
{
|
|
this.move = move;
|
|
}
|
|
|
|
public void listenLook(boolean look)
|
|
{
|
|
this.look = look;
|
|
}
|
|
}
|