/**
* Copyright (C) 2012 t7seven7t
*/
package net.t7seven7t.swornguard.handlers;
import net.dmulloy2.util.FormatUtil;
import net.dmulloy2.util.TimeUtil;
import net.dmulloy2.util.Util;
import net.t7seven7t.swornguard.SwornGuard;
import net.t7seven7t.swornguard.events.CheatEvent;
import net.t7seven7t.swornguard.types.CheatType;
import net.t7seven7t.swornguard.types.Permission;
import net.t7seven7t.swornguard.types.PlayerData;
import org.apache.commons.lang.WordUtils;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
/**
* @author t7seven7t
*/
public class CheatHandler {
private final SwornGuard plugin;
public CheatHandler(SwornGuard plugin) {
this.plugin = plugin;
}
public void announceCheat(CheatEvent event) {
// "Wing Clipping"
if (event.getCheat() == CheatType.FLYING) {
if (plugin.getConfig().getBoolean("clipHackersWings", false)) {
plugin.getLogHandler().log("Clipping {0}\'s wings", event.getPlayerName());
teleportToGround(event.getPlayer());
return;
}
}
plugin.getServer().getPluginManager().callEvent(event);
PlayerData data = plugin.getPlayerDataCache().getData(event.getPlayer());
for (Player player : Util.getOnlinePlayers()) {
if (plugin.getPermissionHandler().hasPermission(player, Permission.SHOW_CHEAT_REPORTS)) {
player.sendMessage(ChatColor.RED + event.getMessage());
if (data.getJails() >= plugin.getConfig().getInt("jailsBeforeNotice") && plugin.getConfig().getBoolean("jailAmountNoticeEnabled"))
player.sendMessage(FormatUtil.format(plugin.getMessage("cheat_jail_notice"), event.getPlayerName(), data.getJails()));
}
}
if ((plugin.getAutoModerator().isOnlyModOnline() && plugin.getConfig().getBoolean("autoModEnabled")) || event.getCheat() == CheatType.SPAM) {
plugin.getAutoModerator().manageCheatEvent(event);
}
if (event.getCheat() != CheatType.XRAY || System.currentTimeMillis() - data.getLastXrayWarn() > 432000000L) {
data.getProfilerList().add(FormatUtil.format("[{0} GMT] &cpinged the cheat detector for: &6{1}",
TimeUtil.getLongDateCurr(), WordUtils.capitalize(event.getCheat().toString().replaceAll("_", " "))));
}
if (event.getCheat() == CheatType.FLYING || event.getCheat() == CheatType.XRAY || event.getCheat() == CheatType.SPEED) {
// Add cheater to patrol list
plugin.getPatrolHandler().addCheater(event.getPlayerName());
for (Player player : Util.getOnlinePlayers()) {
if (plugin.getPermissionHandler().hasPermission(player, Permission.CMD_CHEAT_TELEPORT))
player.sendMessage(ChatColor.RED + "To respond to this cheat alert use /ctp " + event.getPlayerName());
}
}
plugin.getLogHandler().log("Cheatevent player: {0}", event.getPlayerName());
plugin.getLogHandler().log("Cheatevent type: {0}", event.getCheat().toString().replaceAll("_", " "));
}
public void teleportToGround(Player player) {
if (! isPlayerFallingIntoVoid(player)) {
Location loc = player.getLocation().clone();
while (loc.getWorld().getBlockAt(loc.subtract(0, 1, 0)).getType() == Material.AIR);
player.teleport(loc);
}
}
public final boolean isPlayerFallingIntoVoid(Player player) {
Location loc = player.getLocation();
if (loc.getBlockY() < 0) {
return true;
}
for (int y = loc.getBlockY(); y >= 0; y--) {
if (loc.getWorld().getBlockAt(loc.getBlockX(), y, loc.getBlockZ()).getType() != Material.AIR) {
return false;
}
}
return true;
}
}