/**
* Copyright (C) 2012 t7seven7t
*/
package net.t7seven7t.swornguard.handlers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.dmulloy2.util.FormatUtil;
import net.dmulloy2.util.Util;
import net.t7seven7t.swornguard.SwornGuard;
import net.t7seven7t.swornguard.types.Permission;
import net.t7seven7t.swornguard.types.PlayerData;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
/**
* @author t7seven7t
*/
public class PatrolHandler {
private final SwornGuard plugin;
private int index = 0;
private List<String> recentCheaters;
private Map<String, Integer> taskIDs;
public PatrolHandler(final SwornGuard plugin) {
this.plugin = plugin;
this.recentCheaters = new ArrayList<String>();
this.taskIDs = new HashMap<String, Integer>();
}
public void patrol(Player player) {
patrol(player, null);
}
public void patrol(Player player, Player target) {
List<Player> online = Util.getOnlinePlayers();
int n = online.size();
if (index >= n)
index = 0;
if (! recentCheaters.isEmpty() && target == null) {
target = plugin.getServer().getPlayerExact(recentCheaters.get(0));
recentCheaters.remove(0);
}
if (target == null) {
int iteration = 0;
target = online.get(index);
while (plugin.getPermissionHandler().hasPermission(target, Permission.CMD_AUTO_PATROL)) {
index++;
if (index >= n) {
index = 0;
iteration++;
if (iteration > 1)
break;
}
target = online.get(index);
}
if (iteration > 1) {
player.sendMessage(ChatColor.RED + "No players to be patrolled are online.");
if (plugin.getPlayerDataCache().getData(player).isPatrolling()) {
unAutoPatrol(player);
}
return;
}
}
PlayerData data = plugin.getPlayerDataCache().getData(player);
data.setPatrols(data.getPatrols() + 1);
player.teleport(target);
player.sendMessage(ChatColor.RED + "You were teleported to " + ChatColor.GOLD + target.getName());
plugin.getLogHandler().log("{0} was teleported to {1}", player.getName(), target.getName());
index++;
}
public void autoPatrol(final Player player, final int interval) {
final PlayerData data = plugin.getPlayerDataCache().getData(player);
if (data.getPreviousLocation() == null)
data.setPreviousLocation(player.getLocation());
data.setPatrolling(true);
data.setPatrolInterval(interval);
applyPatrolBuffs(player, true);
plugin.getLogHandler().log(player.getName() + " has started auto patrolling.");
class AutoPatrolTask extends BukkitRunnable {
@Override
public void run() {
if (data.isPatrolling())
patrol(player);
else
this.cancel();
}
}
int id = new AutoPatrolTask().runTaskTimer(plugin, 0L, interval * 20L).getTaskId();
cancelTasks(player);
taskIDs.put(player.getName(), id);
}
public void unAutoPatrol(final Player player) {
final PlayerData data = plugin.getPlayerDataCache().getData(player);
data.setCooldownPatrolling(true);
int interval = data.getPatrolInterval();
player.sendMessage(ChatColor.YELLOW + "Patrol mode will wear off in " + interval + " seconds.");
class UnAutoPatrolTask extends BukkitRunnable {
@Override
public void run() {
if (data.isCooldownPatrolling()) {
player.teleport(data.getPreviousLocation());
applyPatrolBuffs(player, false);
data.setPreviousLocation(null);
data.setPatrolling(false);
data.setCooldownPatrolling(false);
}
}
}
int id = new UnAutoPatrolTask().runTaskLater(plugin, interval * 20L).getTaskId();
cancelTasks(player);
taskIDs.put(player.getName(), id);
}
public void unAutoPatrolNoCooldown(Player player) {
PlayerData data = plugin.getPlayerDataCache().getData(player);
applyPatrolBuffs(player, false);
player.teleport(data.getPreviousLocation());
data.setPreviousLocation(null);
data.setPatrolling(false);
data.setCooldownPatrolling(false);
cancelTasks(player);
}
public void cancelTasks(Player player) {
if (taskIDs.get(player.getName()) != null) {
plugin.getServer().getScheduler().cancelTask(taskIDs.get(player.getName()));
}
}
public void applyPatrolBuffs(Player player, boolean apply) {
vanish(player, apply);
if (player.getGameMode().equals(GameMode.SURVIVAL)){
player.setAllowFlight(apply);
player.setFlying(apply);
}
}
public void vanish(Player player, boolean vanish) {
plugin.getPlayerDataCache().getData(player).setVanished(vanish);
if (vanish) {
for (Player p : Util.getOnlinePlayers()) {
if (!plugin.getPermissionHandler().hasPermission(p, Permission.VANISH_SPY)) {
p.hidePlayer(player);
String msg = plugin.getConfig().getString("quitMessage");
msg = FormatUtil.format(msg, player.getName());
p.sendMessage(msg);
} else {
p.sendMessage(ChatColor.DARK_GRAY + player.getName() + " is now vanished. Shhh...");
}
}
plugin.getLogHandler().log(player.getName() + " is now vanished.");
player.sendMessage(ChatColor.AQUA + "Vanished!");
} else {
for (Player p : Util.getOnlinePlayers()) {
p.showPlayer(player);
if (plugin.getPermissionHandler().hasPermission(p, Permission.VANISH_SPY)) {
p.sendMessage(ChatColor.DARK_GRAY + player.getName() + " is no longer vanished.");
} else {
String msg = plugin.getConfig().getString("joinMessage");
msg = FormatUtil.format(msg, player.getName());
p.sendMessage(msg);
}
}
plugin.getLogHandler().log(player.getName() + " is no longer vanished.");
player.sendMessage(ChatColor.AQUA + "Unvanished!");
}
}
public void cheaterTeleport(final Player player, final Player target) {
final PlayerData data = plugin.getPlayerDataCache().getData(player);
if (data.getPreviousLocation() == null)
data.setPreviousLocation(player.getLocation());
if (data.getReportsRespondedTo() == 0)
data.setReportsRespondedTo(1);
else
data.setReportsRespondedTo(data.getReportsRespondedTo() + 1);
data.setInspecting(true);
applyPatrolBuffs(player, true);
// teleportToGround(player, target);
player.teleport(target);
plugin.getLogHandler().log("{0} is now inspecting {1} for cheat report.", player.getName(), target.getName());
class CheaterTeleportTask extends BukkitRunnable {
@Override
public void run() {
if (data.isInspecting())
returnFromInspecting(player);
}
}
int id = new CheaterTeleportTask().runTaskLater(plugin, 60 * 20L).getTaskId();
cancelTasks(player);
taskIDs.put(player.getName(), id);
}
public void returnFromInspecting(final Player player) {
final PlayerData data = plugin.getPlayerDataCache().getData(player);
player.teleport(data.getPreviousLocation());
applyPatrolBuffs(player, false);
data.setPreviousLocation(null);
class ReturnFromInspectingTask extends BukkitRunnable {
@Override
public void run() {
data.setInspecting(false);
}
}
int id = new ReturnFromInspectingTask().runTaskLater(plugin, 20L).getTaskId();
cancelTasks(player);
taskIDs.put(player.getName(), id);
}
// public void teleportToGround(Player player, Player target) {
// Location loc = target.getLocation();
// while (target.getWorld().getBlockAt(loc.subtract(0, 1, 0)).getType() == Material.AIR);
// player.teleport(loc);
// }
public void addCheater(final String player) {
recentCheaters.add(player);
class AddCheaterTask extends BukkitRunnable {
@Override
public void run() {
recentCheaters.remove(player);
}
}
new AddCheaterTask().runTaskLater(plugin, 120 * 20L);
}
public List<String> getRecentCheaters() {
return recentCheaters;
}
}