/**
* Copyright (C) 2012 t7seven7t
*/
package net.t7seven7t.swornguard.detectors;
import net.dmulloy2.util.FormatUtil;
import net.dmulloy2.util.NumberUtil;
import net.dmulloy2.util.TimeUtil;
import net.t7seven7t.swornguard.SwornGuard;
import net.t7seven7t.swornguard.events.CheatEvent;
import net.t7seven7t.swornguard.types.CheatType;
import net.t7seven7t.swornguard.types.PlayerData;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
/**
* @author t7seven7t
*/
public class XrayDetector implements Listener {
private final SwornGuard plugin;
private final double warnOnDiamondRatio;
private final double warnOnIronRatio;
public XrayDetector(final SwornGuard plugin) {
this.plugin = plugin;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
this.warnOnDiamondRatio = plugin.getConfig().getDouble("xrayWarnOnDiamondRatio");
this.warnOnIronRatio = plugin.getConfig().getDouble("xrayWarnOnIronRatio");
}
@EventHandler(priority = EventPriority.MONITOR)
public void onBlockBreak(final BlockBreakEvent event) {
if (!event.isCancelled()
&& (event.getBlock().getType().equals(Material.IRON_ORE)
|| event.getBlock().getType().equals(Material.DIAMOND_ORE)
|| event.getBlock().getType().equals(Material.STONE))) {
final PlayerData data = plugin.getPlayerDataCache().getData(event.getPlayer());
if (event.getBlock().getType().equals(Material.IRON_ORE))
data.setIronMined(data.getIronMined() + 1);
else if (event.getBlock().getType().equals(Material.DIAMOND_ORE))
data.setDiamondMined(data.getDiamondMined() + 1);
else if (event.getBlock().getType().equals(Material.STONE))
data.setStoneMined(data.getStoneMined() + 1);
checkRatio(event.getPlayer());
}
}
public void checkRatio(final OfflinePlayer player) {
final PlayerData data = plugin.getPlayerDataCache().getData(player);
if (data.getStoneMined() > 150 && TimeUtil.getTimeDifference(data.getLastXrayWarn(), System.currentTimeMillis()) > 45000L
&& ((warnOnIronRatio > 0 && data.getIronMined() > 0 && getIronRatio(player) > warnOnIronRatio)
|| (warnOnDiamondRatio > 0 && data.getDiamondMined() > 0 && getDiamondRatio(player) > warnOnDiamondRatio))) {
CheatEvent event = new CheatEvent(player, CheatType.XRAY, FormatUtil.format(plugin.getMessage("cheat_message"), player.getName(), "xraying"));
plugin.getCheatHandler().announceCheat(event);
data.setLastXrayWarn(System.currentTimeMillis());
}
}
public double getDiamondRatio(final OfflinePlayer player) {
PlayerData data = plugin.getPlayerDataCache().getData(player);
return getRatio(data.getDiamondMined(), data.getDiamondMined() + data.getStoneMined());
}
public double getIronRatio(final OfflinePlayer player) {
PlayerData data = plugin.getPlayerDataCache().getData(player);
return getRatio(data.getIronMined(), data.getIronMined() + data.getStoneMined());
}
public double getRatio(final int top, final int bottom) {
return NumberUtil.roundNumDecimals((double) top / bottom * 100, 2);
}
public void legit(final OfflinePlayer player) {
final PlayerData data = plugin.getPlayerDataCache().getData(player);
data.setIronMined(0);
data.setDiamondMined(0);
data.setStoneMined(0);
}
}