mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-12-28 19:38:35 +01:00
New permission "fastswim" and config option "allowfastswim" to
accompany the new moving-check feature.
This commit is contained in:
parent
7945496e79
commit
30622e9235
@ -3,7 +3,7 @@ name: NoCheat
|
|||||||
author: Evenprime
|
author: Evenprime
|
||||||
|
|
||||||
main: cc.co.evenprime.bukkit.nocheat.NoCheat
|
main: cc.co.evenprime.bukkit.nocheat.NoCheat
|
||||||
version: 1.01a
|
version: 1.02
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
nocheat:
|
nocheat:
|
||||||
|
@ -52,8 +52,8 @@ public class MovingCheck extends Check {
|
|||||||
private final static double stepHeight = 0.501D;
|
private final static double stepHeight = 0.501D;
|
||||||
|
|
||||||
private final static double stepWidth = 0.6D;
|
private final static double stepWidth = 0.6D;
|
||||||
private final static double sneakStepWidth = 0.25D;
|
private final static double sneakWidth = 0.25D;
|
||||||
private final static double swimStepWidth = 0.4D;
|
private final static double swimWidth = 0.4D;
|
||||||
|
|
||||||
private int ticksBeforeSummary = 100;
|
private int ticksBeforeSummary = 100;
|
||||||
|
|
||||||
@ -61,6 +61,7 @@ public class MovingCheck extends Check {
|
|||||||
|
|
||||||
public boolean allowFlying;
|
public boolean allowFlying;
|
||||||
public boolean allowFakeSneak;
|
public boolean allowFakeSneak;
|
||||||
|
private boolean allowFastSwim;
|
||||||
|
|
||||||
private String logMessage;
|
private String logMessage;
|
||||||
private String summaryMessage;
|
private String summaryMessage;
|
||||||
@ -106,6 +107,8 @@ public class MovingCheck extends Check {
|
|||||||
statisticTotalEvents++;
|
statisticTotalEvents++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**** Horizontal movement check START ****/
|
||||||
|
|
||||||
// First check the distance the player has moved horizontally
|
// First check the distance the player has moved horizontally
|
||||||
final double xDistance = from.getX()-to.getX();
|
final double xDistance = from.getX()-to.getX();
|
||||||
@ -113,7 +116,7 @@ public class MovingCheck extends Check {
|
|||||||
|
|
||||||
double combined = Math.sqrt((xDistance*xDistance + zDistance*zDistance));
|
double combined = Math.sqrt((xDistance*xDistance + zDistance*zDistance));
|
||||||
|
|
||||||
// If the target is a bed and distance not too big, allow it
|
// If the target is a bed and distance not too big, allow it always
|
||||||
// Bukkit prevents using blocks behind walls already, so I don't have to check for that
|
// Bukkit prevents using blocks behind walls already, so I don't have to check for that
|
||||||
if(to.getWorld().getBlockTypeIdAt(to) == Material.BED_BLOCK.getId() && combined < 8.0D) {
|
if(to.getWorld().getBlockTypeIdAt(to) == Material.BED_BLOCK.getId() && combined < 8.0D) {
|
||||||
statisticElapsedTimeNano += System.nanoTime() - startTime;
|
statisticElapsedTimeNano += System.nanoTime() - startTime;
|
||||||
@ -121,15 +124,14 @@ public class MovingCheck extends Check {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**** Horizontal movement check START ****/
|
|
||||||
|
|
||||||
final int onGroundFrom = playerIsOnGround(from, 0.0D);
|
final int onGroundFrom = playerIsOnGround(from, 0.0D);
|
||||||
|
|
||||||
|
// Do various checks on the players horizontal movement
|
||||||
int sn = getSneakingViolationLevel(combined, data, player);
|
int sn = getSneakingViolationLevel(combined, data, player);
|
||||||
int sw = getSwimmingViolationLevel(combined, data, onGroundFrom == MovingData.LIQUID);
|
int sw = getSwimmingViolationLevel(combined, data, onGroundFrom == MovingData.LIQUID, player);
|
||||||
int s = limitCheck(combined - (data.horizFreedom + stepWidth));
|
int s = limitCheck(combined - (data.horizFreedom + stepWidth));
|
||||||
|
|
||||||
// The maximum of the three values
|
// The maximum of the three values is the biggest violation measured
|
||||||
int violationLevelHorizontal = sn > sw && sn > s ? sn : (sw > s ? sw : s);
|
int violationLevelHorizontal = sn > sw && sn > s ? sn : (sw > s ? sw : s);
|
||||||
|
|
||||||
// Reduce horiz moving freedom with each event
|
// Reduce horiz moving freedom with each event
|
||||||
@ -234,14 +236,31 @@ public class MovingCheck extends Check {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a check if a sneaking player is moving too fast
|
||||||
|
*
|
||||||
|
* @param combined Distance moved
|
||||||
|
* @param data the players data
|
||||||
|
* @param player the player
|
||||||
|
* @return violation level
|
||||||
|
*/
|
||||||
private int getSneakingViolationLevel(final double combined, final MovingData data, final Player player) {
|
private int getSneakingViolationLevel(final double combined, final MovingData data, final Player player) {
|
||||||
|
|
||||||
final boolean canFakeSneak = allowFakeSneak || plugin.hasPermission(player, PermissionData.PERMISSION_FAKESNEAK);
|
|
||||||
int violationLevelSneaking = -1;
|
int violationLevelSneaking = -1;
|
||||||
|
|
||||||
|
// Maybe the player is allowed to sneak faster than usual?
|
||||||
|
final boolean canFakeSneak = allowFakeSneak || plugin.hasPermission(player, PermissionData.PERMISSION_FAKESNEAK);
|
||||||
|
|
||||||
if(!canFakeSneak) {
|
if(!canFakeSneak) {
|
||||||
|
|
||||||
|
// Explaination blob:
|
||||||
|
// When a player starts to sneak, he may have a phase where he is still moving faster than he
|
||||||
|
// should be, e.g. because he is in air, on slippery ground, ...
|
||||||
|
// Therefore he gets a counter that gets reduced everytime he is too fast and slowly incremented
|
||||||
|
// every time he is slow enough
|
||||||
|
// If the counter reaches zero, his movement is considered a violation.
|
||||||
if(player.isSneaking()) {
|
if(player.isSneaking()) {
|
||||||
violationLevelSneaking = limitCheck(combined - (data.horizFreedom + sneakStepWidth));
|
violationLevelSneaking = limitCheck(combined - (data.horizFreedom + sneakWidth));
|
||||||
if(violationLevelSneaking >= 0) {
|
if(violationLevelSneaking >= 0) {
|
||||||
if(combined >= data.sneakingLastDistance * 0.9)
|
if(combined >= data.sneakingLastDistance * 0.9)
|
||||||
data.sneakingFreedomCounter -= 2;
|
data.sneakingFreedomCounter -= 2;
|
||||||
@ -265,30 +284,45 @@ public class MovingCheck extends Check {
|
|||||||
return violationLevelSneaking;
|
return violationLevelSneaking;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getSwimmingViolationLevel( final double combined, final MovingData data, final boolean isSwimming) {
|
private int getSwimmingViolationLevel( final double combined, final MovingData data, final boolean isSwimming, final Player player) {
|
||||||
|
|
||||||
int violationLevelSwimming = -1;
|
int violationLevelSwimming = -1;
|
||||||
final double limit = data.horizFreedom + swimStepWidth;
|
|
||||||
|
|
||||||
if(isSwimming) {
|
// Maybe the player is allowed to swim faster than usual?
|
||||||
violationLevelSwimming = limitCheck(combined - limit);
|
final boolean canFastSwim = allowFastSwim || plugin.hasPermission(player, PermissionData.PERMISSION_FASTSWIM);
|
||||||
if(violationLevelSwimming >= 0) {
|
|
||||||
if(combined >= data.swimmingLastDistance * 0.9)
|
if(!canFastSwim) {
|
||||||
data.swimmingFreedomCounter -= 2;
|
|
||||||
else
|
final double limit = data.horizFreedom + swimWidth;
|
||||||
{
|
|
||||||
violationLevelSwimming = -1;
|
|
||||||
|
// Explaination blob:
|
||||||
|
// When a player starts to swim, he may have a phase where he is still moving faster than he
|
||||||
|
// should be, e.g. because he jumped into the water ...
|
||||||
|
// Therefore he gets a counter that gets reduced everytime he is too fast and slowly incremented
|
||||||
|
// every time he is slow enough
|
||||||
|
// If the counter reaches zero, his movement is considered a violation.
|
||||||
|
if(isSwimming) {
|
||||||
|
violationLevelSwimming = limitCheck(combined - limit);
|
||||||
|
if(violationLevelSwimming >= 0) {
|
||||||
|
if(combined >= data.swimmingLastDistance * 0.9)
|
||||||
|
data.swimmingFreedomCounter -= 2;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
violationLevelSwimming = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.swimmingLastDistance = combined;
|
||||||
}
|
}
|
||||||
|
|
||||||
data.swimmingLastDistance = combined;
|
if(violationLevelSwimming >= 0 && data.swimmingFreedomCounter > 0) {
|
||||||
}
|
violationLevelSwimming = -1;
|
||||||
|
}
|
||||||
|
else if(violationLevelSwimming < 0 && data.swimmingFreedomCounter < 10){
|
||||||
|
data.swimmingFreedomCounter += 1;
|
||||||
|
}
|
||||||
|
|
||||||
if(violationLevelSwimming >= 0 && data.swimmingFreedomCounter > 0) {
|
|
||||||
violationLevelSwimming = -1;
|
|
||||||
}
|
|
||||||
else if(violationLevelSwimming < 0 && data.swimmingFreedomCounter < 10){
|
|
||||||
data.swimmingFreedomCounter += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return violationLevelSwimming;
|
return violationLevelSwimming;
|
||||||
@ -582,11 +616,6 @@ public class MovingCheck extends Check {
|
|||||||
// return standing
|
// return standing
|
||||||
return MovingData.SOLID;
|
return MovingData.SOLID;
|
||||||
}
|
}
|
||||||
// TODO : REMOVE THIS
|
|
||||||
else if((result & MovingData.LIQUID) != 0) {
|
|
||||||
// return swimming
|
|
||||||
return MovingData.LIQUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// check if his head is "stuck" in an block
|
// check if his head is "stuck" in an block
|
||||||
@ -658,6 +687,7 @@ public class MovingCheck extends Check {
|
|||||||
try {
|
try {
|
||||||
allowFlying = config.getBooleanValue("moving.allowflying");
|
allowFlying = config.getBooleanValue("moving.allowflying");
|
||||||
allowFakeSneak = config.getBooleanValue("moving.allowfakesneak");
|
allowFakeSneak = config.getBooleanValue("moving.allowfakesneak");
|
||||||
|
allowFastSwim = config.getBooleanValue("moving.allowfastswim");
|
||||||
|
|
||||||
logMessage = config.getStringValue("moving.logmessage");
|
logMessage = config.getStringValue("moving.logmessage");
|
||||||
summaryMessage = config.getStringValue("moving.summarymessage");
|
summaryMessage = config.getStringValue("moving.summarymessage");
|
||||||
|
@ -61,6 +61,7 @@ public class NoCheatConfiguration {
|
|||||||
try {
|
try {
|
||||||
yamlContent = (Map<String, Object>) SimpleYaml.read(configurationFile);
|
yamlContent = (Map<String, Object>) SimpleYaml.read(configurationFile);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
yamlContent = new HashMap<String, Object>();
|
yamlContent = new HashMap<String, Object>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,6 +160,8 @@ public class NoCheatConfiguration {
|
|||||||
SimpleYaml.getBoolean("moving.allowflying", false, yamlContent)));
|
SimpleYaml.getBoolean("moving.allowflying", false, yamlContent)));
|
||||||
movingNode.add(new BooleanOption("allowfakesneak",
|
movingNode.add(new BooleanOption("allowfakesneak",
|
||||||
SimpleYaml.getBoolean("moving.allowfakesneak", true, yamlContent)));
|
SimpleYaml.getBoolean("moving.allowfakesneak", true, yamlContent)));
|
||||||
|
movingNode.add(new BooleanOption("allowfastswim",
|
||||||
|
SimpleYaml.getBoolean("moving.allowfastswim", false, yamlContent)));
|
||||||
|
|
||||||
/*** MOVING ACTION section ***/
|
/*** MOVING ACTION section ***/
|
||||||
{
|
{
|
||||||
|
@ -6,10 +6,10 @@ import cc.co.evenprime.bukkit.nocheat.NoCheatData;
|
|||||||
|
|
||||||
public class PermissionData {
|
public class PermissionData {
|
||||||
|
|
||||||
public long lastUpdate[] = new long[9];
|
public long lastUpdate[] = new long[10];
|
||||||
public boolean cache[] = new boolean[9];
|
public boolean cache[] = new boolean[10];
|
||||||
|
|
||||||
public static final String[] permissionNames = new String[9];
|
public static final String[] permissionNames = new String[10];
|
||||||
|
|
||||||
public static final int PERMISSION_MOVING = 0;
|
public static final int PERMISSION_MOVING = 0;
|
||||||
public static final int PERMISSION_FLYING = 1;
|
public static final int PERMISSION_FLYING = 1;
|
||||||
@ -20,6 +20,7 @@ public class PermissionData {
|
|||||||
public static final int PERMISSION_NOTIFY = 6;
|
public static final int PERMISSION_NOTIFY = 6;
|
||||||
public static final int PERMISSION_ITEMDUPE = 7;
|
public static final int PERMISSION_ITEMDUPE = 7;
|
||||||
public static final int PERMISSION_FAKESNEAK = 8;
|
public static final int PERMISSION_FAKESNEAK = 8;
|
||||||
|
public static final int PERMISSION_FASTSWIM = 9;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
permissionNames[PERMISSION_AIRBUILD] = "nocheat.airbuild";
|
permissionNames[PERMISSION_AIRBUILD] = "nocheat.airbuild";
|
||||||
@ -31,6 +32,7 @@ public class PermissionData {
|
|||||||
permissionNames[PERMISSION_NOTIFY] = "nocheat.notify";
|
permissionNames[PERMISSION_NOTIFY] = "nocheat.notify";
|
||||||
permissionNames[PERMISSION_ITEMDUPE] = "nocheat.itemdupe";
|
permissionNames[PERMISSION_ITEMDUPE] = "nocheat.itemdupe";
|
||||||
permissionNames[PERMISSION_FAKESNEAK] = "nocheat.fakesneak";
|
permissionNames[PERMISSION_FAKESNEAK] = "nocheat.fakesneak";
|
||||||
|
permissionNames[PERMISSION_FASTSWIM] = "nocheat.fastswim";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PermissionData get(Player p) {
|
public static PermissionData get(Player p) {
|
||||||
|
@ -111,18 +111,20 @@ public class SimpleYaml {
|
|||||||
|
|
||||||
public static int getInt(String path, int defaultValue, Map<String, Object> node) {
|
public static int getInt(String path, int defaultValue, Map<String, Object> node) {
|
||||||
try {
|
try {
|
||||||
return (Integer) getProperty(path, node);
|
return Integer.parseInt((String)getProperty(path, node));
|
||||||
}
|
}
|
||||||
catch(Exception e) {
|
catch(Exception e) {
|
||||||
|
//e.printStackTrace();
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean getBoolean(String path, boolean defaultValue, Map<String, Object> node) {
|
public static boolean getBoolean(String path, boolean defaultValue, Map<String, Object> node) {
|
||||||
try {
|
try {
|
||||||
return (Boolean) getProperty(path, node);
|
return Boolean.parseBoolean((String)getProperty(path, node));
|
||||||
}
|
}
|
||||||
catch(Exception e) {
|
catch(Exception e) {
|
||||||
|
//e.printStackTrace();
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user