Expanded the idea of having timeouts to the blockbreak direction

check.
This commit is contained in:
Evenprime 2011-10-17 20:18:54 +02:00
parent 2c27063b75
commit c87f99262e
6 changed files with 37 additions and 26 deletions

View File

@ -12,8 +12,6 @@ import cc.co.evenprime.bukkit.nocheat.data.BaseData;
* The DirectionCheck will find out if a player tried to interact with something
* that's not in his field of view.
*
* @author Evenprime
*
*/
public class DirectionCheck {
@ -26,15 +24,17 @@ public class DirectionCheck {
public boolean check(Player player, Block brokenBlock, ConfigurationCache cc) {
BaseData data = plugin.getPlayerData(player);
// If the block is instabreak and we don't check instabreak, return
if(!cc.blockbreak.checkinstabreakblocks && brokenBlock.getLocation().equals(data.blockbreak.instaBrokeBlockLocation)) {
return false;
}
boolean cancel = false;
double off = CheckUtil.directionCheck(player, brokenBlock.getX() + 0.5D, brokenBlock.getY() + 0.5D, brokenBlock.getZ() + 0.5D, 1D, 1D, 0.5D);
double off = CheckUtil.directionCheck(player, brokenBlock.getX() + 0.5D, brokenBlock.getY() + 0.5D, brokenBlock.getZ() + 0.5D, 1D, 1D, cc.blockbreak.directionPrecision);
long time = System.currentTimeMillis();
if(off < 0.1D) {
// Player did nothing wrong
@ -49,6 +49,16 @@ public class DirectionCheck {
data.log.check = "blockbreak.direction";
cancel = plugin.getActionManager().executeActions(player, cc.blockbreak.directionActions, (int) data.blockbreak.directionViolationLevel, data.blockbreak.history, cc);
if(cancel) {
// Needed to calculate penalty times
data.fight.directionLastViolationTime = time;
}
}
// If the player is still in penalty time, cancel the event anyway
if(data.blockbreak.directionLastViolationTime + cc.blockbreak.directionPenaltyTime >= time) {
return true;
}
return cancel;

View File

@ -15,8 +15,6 @@ import cc.co.evenprime.bukkit.nocheat.log.LogLevel;
* methods
* to retrieve and store more complex datatypes based on strings.
*
* @author Evenprime
*
*/
public abstract class Configuration {
@ -68,7 +66,9 @@ public abstract class Configuration {
private final static OptionNode BLOCKBREAK_DIRECTION = new OptionNode("direction", BLOCKBREAK, DataType.PARENT);
public final static OptionNode BLOCKBREAK_DIRECTION_CHECK = new OptionNode("check", BLOCKBREAK_DIRECTION, DataType.BOOLEAN);
public static final OptionNode BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS = new OptionNode("checkinstabreakblocks", BLOCKBREAK_DIRECTION, DataType.BOOLEAN);
public final static OptionNode BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS = new OptionNode("checkinstabreakblocks", BLOCKBREAK_DIRECTION, DataType.BOOLEAN);
public final static OptionNode BLOCKBREAK_DIRECTION_PRECISION = new OptionNode("precision", BLOCKBREAK_DIRECTION, DataType.INTEGER);
public final static OptionNode BLOCKBREAK_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", BLOCKBREAK_DIRECTION, DataType.INTEGER); ;
public final static OptionNode BLOCKBREAK_DIRECTION_ACTIONS = new OptionNode("actions", BLOCKBREAK_DIRECTION, DataType.ACTIONLIST);
private final static OptionNode BLOCKPLACE = new OptionNode("blockplace", ROOT, DataType.PARENT);
@ -93,12 +93,12 @@ public abstract class Configuration {
public final static OptionNode CHAT_SPAM_ACTIONS = new OptionNode("actions", CHAT_SPAM, DataType.ACTIONLIST);
private final static OptionNode FIGHT = new OptionNode("fight", ROOT, DataType.PARENT);
public static final OptionNode FIGHT_CHECK = new OptionNode("check", FIGHT, DataType.BOOLEAN);
public final static OptionNode FIGHT_CHECK = new OptionNode("check", FIGHT, DataType.BOOLEAN);
private final static OptionNode FIGHT_DIRECTION = new OptionNode("direction", FIGHT, DataType.PARENT);
public final static OptionNode FIGHT_DIRECTION_CHECK = new OptionNode("check", FIGHT_DIRECTION, DataType.BOOLEAN);
public static final OptionNode FIGHT_DIRECTION_PRECISION = new OptionNode("precision", FIGHT_DIRECTION, DataType.INTEGER);
public static final OptionNode FIGHT_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", FIGHT_DIRECTION, DataType.INTEGER);
public final static OptionNode FIGHT_DIRECTION_PRECISION = new OptionNode("precision", FIGHT_DIRECTION, DataType.INTEGER);
public final static OptionNode FIGHT_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", FIGHT_DIRECTION, DataType.INTEGER);
public final static OptionNode FIGHT_DIRECTION_ACTIONS = new OptionNode("actions", FIGHT_DIRECTION, DataType.ACTIONLIST);
private final Map<OptionNode, Object> values;

View File

@ -13,8 +13,6 @@ import cc.co.evenprime.bukkit.nocheat.log.LogLevel;
* The place where the structure of the configuration tree is defined, the
* default settings are defined, the default files are defined.
*
* @author Evenprime
*
*/
public class DefaultConfiguration extends Configuration {
@ -99,6 +97,8 @@ public class DefaultConfiguration extends Configuration {
setValue(BLOCKBREAK_DIRECTION_CHECK, true);
setValue(BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS, false);
setValue(BLOCKBREAK_DIRECTION_PRECISION, 50);
setValue(BLOCKBREAK_DIRECTION_PENALTYTIME, 300);
ActionList directionActionList = new ActionList();
directionActionList.setActions(0, action.getActions("directionLog blockbreakCancel".split(" ")));

View File

@ -9,8 +9,6 @@ import cc.co.evenprime.bukkit.nocheat.config.util.OptionNode;
* Textual explainations of options, will be displayed in the gui tool and the
* descriptions.txt file.
*
* @author Evenprime
*
*/
public class Explainations {
@ -60,6 +58,8 @@ public class Explainations {
set(Configuration.BLOCKBREAK_DIRECTION_CHECK, "If true, check if a player is looking at the block that he's breaking.");
set(Configuration.BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS, "If true, NoCheat will also check for direction for Instant-Breaking blocks.\nTHIS WILL CAUSE FALSE POSITIVES, when a player keeps his mouse button pressed and moves the mouse fast over the screen.");
set(Configuration.BLOCKBREAK_DIRECTION_PRECISION, "Define how precise a player has to hit blocks when mining. Lower values mean more precision, higher values less precision.");
set(Configuration.BLOCKBREAK_DIRECTION_PENALTYTIME, "Define how long after a failed attempt to dig a player will be disallowed to break another block. \nUnit is milliseconds, default is 300.");
set(Configuration.BLOCKBREAK_DIRECTION_ACTIONS, "What should be done if a player is breaking blocks that are not in his line of sight.\nUnit is number of break(attempt)s outside the line of sight.");
set(Configuration.BLOCKPLACE_CHECK, "If true, do various checks on BlockPlace events.");

View File

@ -7,8 +7,6 @@ import cc.co.evenprime.bukkit.nocheat.config.util.ActionList;
* Configurations specific for the "BlockBreak" checks
* Every world gets one of these assigned to it.
*
* @author Evenprime
*
*/
public class CCBlockBreak {
@ -19,6 +17,8 @@ public class CCBlockBreak {
public final ActionList reachActions;
public final boolean directionCheck;
public final ActionList directionActions;
public final double directionPrecision;
public final long directionPenaltyTime;
public CCBlockBreak(Configuration data) {
@ -26,8 +26,11 @@ public class CCBlockBreak {
reachCheck = data.getBoolean(Configuration.BLOCKBREAK_REACH_CHECK);
reachDistance = ((double) data.getInteger(Configuration.BLOCKBREAK_REACH_LIMIT)) / 100D;
reachActions = data.getActionList(Configuration.BLOCKBREAK_REACH_ACTIONS);
checkinstabreakblocks = data.getBoolean(Configuration.BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS);
checkinstabreakblocks = data.getBoolean(Configuration.BLOCKBREAK_DIRECTION_CHECKINSTABREAKBLOCKS);
directionCheck = data.getBoolean(Configuration.BLOCKBREAK_DIRECTION_CHECK);
directionActions = data.getActionList(Configuration.BLOCKBREAK_DIRECTION_ACTIONS);
directionPrecision = ((double) data.getInteger(Configuration.BLOCKBREAK_DIRECTION_PRECISION)) / 100D;
directionPenaltyTime = data.getInteger(Configuration.BLOCKBREAK_DIRECTION_PENALTYTIME);
directionActions = data.getActionList(Configuration.BLOCKBREAK_DIRECTION_ACTIONS);
}
}

View File

@ -2,19 +2,17 @@ package cc.co.evenprime.bukkit.nocheat.data;
import org.bukkit.Location;
/**
* Playerspecific data for the blockbreak check group
*
* @author Evenprime
*
*/
public class BlockBreakData extends Data {
public double reachViolationLevel = 0.0D;
public double directionViolationLevel = 0.0D;
public double reachViolationLevel = 0.0D;
public double directionViolationLevel = 0.0D;
public Location instaBrokeBlockLocation = null;
public final ExecutionHistory history = new ExecutionHistory();
public long directionLastViolationTime = 0;
public Location instaBrokeBlockLocation = null;
public final ExecutionHistory history = new ExecutionHistory();
}