+ Added the Knockback check

+ Added an "opbyconsoleonly" option
= Fixed an issue with the RunFly check and vines
= Fixed an issue with the WaterWalk check and blocks above the player
- Removed the fly tracker because of all its issues
This commit is contained in:
NeatMonster 2012-04-18 01:18:37 +02:00
parent 8546a649ed
commit 44f4da5080
25 changed files with 499 additions and 337 deletions

View File

@ -301,6 +301,10 @@
- nocheatplus.checks.fight.instantheal
Don't prevent the player from accellerating their health generation by
food saturation
- nocheatplus.checks.fight.knockback
Don't prevent the player from doing knockbacks when it's not technically
possible
--------------------------------------------------------------------------------
@ -409,18 +413,6 @@
config.yml file. It is further split into logical sections
--------------------------------------------------------------------------------
----------------------------- CLIENT MODS Section ------------------------------
--------------------------------------------------------------------------------
Everything that in has to do with the client mods can be found at this part of
the config.yml.
allow:
Allow all your players to use all the client mods (Zombe, CJB, Rei's Minimap,
Minecraft AutoMap and Smart Moving).
--------------------------------------------------------------------------------
-------------------------------- LOGGING Section -------------------------------
--------------------------------------------------------------------------------
@ -476,6 +468,22 @@
version to version. This is deactivated by default.
--------------------------------------------------------------------------------
---------------------------- MISCELLANEOUS Section -----------------------------
--------------------------------------------------------------------------------
Everything that in has nothing to do with the other categories
allowclientmods:
Allow all your players to use all the client mods (Zombe, CJB, Rei's Minimap,
Minecraft AutoMap and Smart Moving).
opbyconsoleonly:
Only allow the commands /op and /deop to be executed by the console.
--------------------------------------------------------------------------------
-------------------------------- CHECKS Section --------------------------------
--------------------------------------------------------------------------------
@ -641,21 +649,6 @@
fall distance in blocks that the player tried to avoid. It gets
increased every time that the player fails the check, and decreased
over time if the player doesn't fail the check.
TRACKER:
This is an entire subsection dedicated to a recently introduced check
specially designed to prevent players from staying in the air longer
than a defined value.
active:
Should players get checked for this type of movement related hacks at
all. If deactivated, player may stay in the air without being noticed
by NoCheat+.
actions:
What should happen if a player tries to stay too much time in the air.
Default is to kick the player. The Violation Level is the time the
player has spent in the air minus the maximum time allowed (6 seconds).
FLYING:
This is an entire subsection dedicated to the "moving.flying" check.
@ -1240,10 +1233,30 @@
actions:
What should happen if the player fails this check. Default is to not
allow the health regeneration ("cancel" the regeneration) and log a
message. The Violation LEvel (VL) for this check is the number of
message. The Violation Level (VL) for this check is the number of
seconds that the player tried to skip while regenerating health. It
gets reduced whenever the player regenerates health while obeying the
normal regeneration times.
7) KNOCKBACK:
Players may send sprint packets to the server just before attacking an
entity in order to do a knockback on this entity. This check will try to
identify players doing this.
active:
Should players be checked for this behavior.
interval:
The minimal interval in milliseconds to enable sprinting before
attacking an entity (50 milliseconds is a good default value).
actions:
What should happen if the player fails this check. Default is to not
allow the player to attack the entity ("cancel" the attack) and log a
message. The Violation Level (VL) for this check is difference between
the interval defined in the configuration file and the real interval.
--------------------------------------------------------------------------------

View File

@ -103,6 +103,8 @@ permissions:
description: Allow a player to not take damage by exploiting a design flaw in Minecraft
nocheatplus.checks.fight.instantheal:
description: Allow a player to artificially speed up his health regeneration
nocheatplus.checks.fight.knockback:
description: Allow a player to do knockbacks when it's not technically possible
nocheatplus.checks.inventory:
description: Allow the player to bypass all inventory checks
children:

View File

@ -4,7 +4,7 @@
<!-- Informations -->
<name>NoCheatPlus</name>
<version>3.5.6</version>
<version>3.5.7</version>
<description>Detect and fight the exploitation of various flaws/bugs in Minecraft.</description>
<url>http://dev.bukkit.org/server-mods/nocheatplus</url>

View File

@ -188,8 +188,7 @@ public class NoCheatPlus extends JavaPlugin implements Listener {
ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onPlayerJoin(final PlayerJoinEvent event) {
final Player player = event.getPlayer();
if (conf.getConfigurationCacheForWorld(player.getWorld().getName()).getConfiguration()
.getBoolean(ConfPaths.CLIENT_MODS_ALLOW))
if (getConfig(player).getConfiguration().getBoolean(ConfPaths.MISCELLANEOUS_ALLOWCLIENTMODS))
return;
String message = "";
// Disable Zombe's fly mod

View File

@ -7,6 +7,7 @@ import net.minecraft.server.Block;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
@ -170,8 +171,8 @@ public class CheckUtil {
if (!isInGround(result))
// Original location: X, Z (allow standing in walls this time)
if (isSolid(types[world.getBlockTypeIdAt(Location.locToBlock(location.x), Location.locToBlock(location.y),
Location.locToBlock(location.z))]))
if (isSolid(getType(world, Location.locToBlock(location.x), Location.locToBlock(location.y),
Location.locToBlock(location.z))))
result |= INGROUND;
return result;
@ -192,16 +193,16 @@ public class CheckUtil {
// First we need to know about the block itself, the block
// below it and the block above it
final int top = types[world.getBlockTypeIdAt(x, y + 1, z)];
final int base = types[world.getBlockTypeIdAt(x, y, z)];
final int below = types[world.getBlockTypeIdAt(x, y - 1, z)];
final int top = getType(world, x, y + 1, z);
final int base = getType(world, x, y, z);
final int below = getType(world, x, y - 1, z);
int type = 0;
// Special case: Standing on a fence
// Behave as if there is a block on top of the fence
if (below == FENCE && base != FENCE && isNonSolid(top))
type = INGROUND;
else if (below != FENCE && isNonSolid(base) && types[world.getBlockTypeIdAt(x, y - 2, z)] == FENCE)
else if (below != FENCE && isNonSolid(base) && getType(world, x, y - 2, z) == FENCE)
type = ONGROUND;
else if (isNonSolid(top))
// Simplest (and most likely) case:
@ -224,6 +225,28 @@ public class CheckUtil {
return types[typeId];
}
private static int getType(final World world, final int x, final int y, final int z) {
return types[world.getBlockAt(x, y, z).getType() == Material.VINE && !isClimbable(world, x, y, z) ? 0 : world
.getBlockTypeIdAt(x, y, z)];
}
public static boolean isClimbable(final World world, final int x, final int y, final int z) {
BlockFace attachedFace = null;
if (world.getBlockAt(x, y, z).getData() == 0x1)
attachedFace = BlockFace.WEST;
else if (world.getBlockAt(x, y, z).getData() == 0x2)
attachedFace = BlockFace.NORTH;
else if (world.getBlockAt(x, y, z).getData() == 0x4)
attachedFace = BlockFace.EAST;
else if (world.getBlockAt(x, y, z).getData() == 0x8)
attachedFace = BlockFace.SOUTH;
if (attachedFace == null)
return true;
return isSolid(getType(world, world.getBlockAt(x, y, z).getRelative(attachedFace).getX(),
world.getBlockAt(x, y, z).getRelative(attachedFace).getY(),
world.getBlockAt(x, y, z).getRelative(attachedFace).getZ()));
}
public static boolean isFood(final ItemStack item) {
if (item == null)
return false;
@ -308,5 +331,4 @@ public class CheckUtil {
else
return (int) floor;
}
}

View File

@ -9,6 +9,10 @@ import me.neatmonster.nocheatplus.data.Statistics.Id;
import org.bukkit.GameMode;
/**
* A check used to verify if the player isn't placing his blocks too quickly
*
*/
public class FastBreakCheck extends BlockBreakCheck {
public FastBreakCheck(final NoCheatPlus plugin) {

View File

@ -7,6 +7,10 @@ import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.actions.ParameterName;
import me.neatmonster.nocheatplus.data.Statistics.Id;
/**
* A check used to verify if the player isn't breaking his blocks too quickly
*
*/
public class FastPlaceCheck extends BlockPlaceCheck {
public FastPlaceCheck(final NoCheatPlus plugin) {

View File

@ -7,6 +7,10 @@ import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.actions.ParameterName;
import me.neatmonster.nocheatplus.data.Statistics.Id;
/**
* A check used to verify if the player isn't throwing projectiles too quickly
*
*/
public class ProjectileCheck extends BlockPlaceCheck {
public ProjectileCheck(final NoCheatPlus plugin) {

View File

@ -5,6 +5,10 @@ import java.util.Arrays;
import me.neatmonster.nocheatplus.NoCheatPlus;
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
/**
* A check used to limit the number of new players allowed to join in a specified time frame
*
*/
public class ArrivalsLimitCheck extends ChatCheck {
// Used to know if the cooldown is enabled and since when

View File

@ -7,9 +7,11 @@ import java.util.List;
import me.neatmonster.nocheatplus.EventManager;
import me.neatmonster.nocheatplus.NoCheatPlus;
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.config.ConfPaths;
import me.neatmonster.nocheatplus.config.ConfigurationCacheStore;
import me.neatmonster.nocheatplus.config.Permissions;
import org.bukkit.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -96,6 +98,19 @@ public class ChatCheckListener implements Listener, EventManager {
@EventHandler(
priority = EventPriority.LOWEST)
public void commandPreprocess(final PlayerCommandPreprocessEvent event) {
// If OP by console only is enabled, prevent the op/deop commands
// to be used by a player who is OP or has the required permissions
if (plugin.getConfig(event.getPlayer()).getConfiguration().getBoolean(ConfPaths.MISCELLANEOUS_OPBYCONSOLEONLY)
&& (event.getMessage().startsWith("/op")
&& (event.getPlayer().isOp() || event.getPlayer().hasPermission("bukkit.command.op.give")) || event
.getMessage().startsWith("/deop")
&& (event.getPlayer().isOp() || event.getPlayer().hasPermission("bukkit.command.op.take")))) {
event.getPlayer().sendMessage(ChatColor.RED + "This command can be executed from the console!");
event.setCancelled(true);
return;
}
// This type of event is derived from PlayerChatEvent, therefore
// just treat it like that
chat(event);
@ -115,6 +130,12 @@ public class ChatCheckListener implements Listener, EventManager {
return s;
}
/**
* We listen to PlayerJoin events for the nopwnage check
*
* @param event
* The PlayerJoin Event
*/
@EventHandler(
priority = EventPriority.LOWEST)
public void join(final PlayerJoinEvent event) {
@ -128,6 +149,12 @@ public class ChatCheckListener implements Listener, EventManager {
noPwnageCheck.handleJoin(player, data, cc);
}
/**
* We listen to PlayerLogin events for the arrivalslimit check
*
* @param event
* The PlayerLogin Event
*/
@EventHandler(
ignoreCancelled = true, priority = EventPriority.LOWEST)
public void login(final PlayerLoginEvent event) {

View File

@ -13,6 +13,10 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
/**
* A check used to verify if players aren't spam bots
*
*/
public class NoPwnageCheck extends ChatCheck {
private String lastBanCausingMessage;
private long lastBanCausingMessageTime;
@ -163,6 +167,14 @@ public class NoPwnageCheck extends ChatCheck {
return cancel;
}
/**
* This function is used to generate a captcha
*
* @param cc
* The ChatConfig
* @return
* The captcha generated
*/
private String generateCaptcha(final ChatConfig cc) {
final StringBuilder b = new StringBuilder();
@ -213,6 +225,18 @@ public class NoPwnageCheck extends ChatCheck {
data.commandsHaveBeenRun = false;
}
/**
* This function return the minimum between the 3 Integers
*
* @param a
* The first Integer
* @param b
* The second Integer
* @param c
* The third Integer
* @return
* The minimum
*/
private int minimum(final int a, final int b, final int c) {
int mi;
@ -224,6 +248,18 @@ public class NoPwnageCheck extends ChatCheck {
return mi;
}
/**
* This function executes the commands defined in the configuration
*
* @param player
* The Player
* @param reason
* The reason
* @param data
* The ChatData
* @param cc
* The ChatConfig
*/
private void runCommands(final NoCheatPlusPlayer player, final String reason, final ChatData data,
final ChatConfig cc) {
data.reason = reason;
@ -235,6 +271,16 @@ public class NoPwnageCheck extends ChatCheck {
}
}
/**
* This function is used to know if two messages are similar
*
* @param message1
* The first message
* @param message2
* The second message
* @return
* true if the messages are similar, false otherwise
*/
private boolean similar(final String message1, final String message2) {
return message1 != null && message2 != null
&& stringDifference(message1, message2) < 1 + message1.length() / 10;
@ -283,6 +329,12 @@ public class NoPwnageCheck extends ChatCheck {
return d[n][m];
}
/**
* This function is used to warn the other player
*
* @param player
* The Player
*/
private void warnOthers(final NoCheatPlusPlayer player) {
plugin.getServer().broadcastMessage(
ChatColor.YELLOW + player.getName() + ChatColor.DARK_RED + " has set off the autoban!");
@ -290,6 +342,12 @@ public class NoPwnageCheck extends ChatCheck {
ChatColor.DARK_RED + " Please do not say anything similar to what the user said!");
}
/**
* This function is used to warn the player
*
* @param player
* The Player
*/
private void warnPlayer(final NoCheatPlusPlayer player) {
player.sendMessage(player.getConfigurationStore().getConfiguration().getString(ConfPaths.LOGGING_PREFIX)
+ ChatColor.DARK_RED + "Our system has detected unusual bot activities coming from you.");

View File

@ -8,6 +8,7 @@ import me.neatmonster.nocheatplus.EventManager;
import me.neatmonster.nocheatplus.NoCheatPlus;
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.config.ConfigurationCacheStore;
import me.neatmonster.nocheatplus.config.Permissions;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.craftbukkit.entity.CraftPlayer;
@ -23,6 +24,7 @@ import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerToggleSprintEvent;
/**
* Central location to listen to events that are
@ -31,7 +33,7 @@ import org.bukkit.event.player.PlayerAnimationEvent;
*/
public class FightCheckListener implements Listener, EventManager {
private final List<FightCheck> checks = new ArrayList<FightCheck>(4);
private final List<FightCheck> checks = new ArrayList<FightCheck>(5);
private final GodmodeCheck godmodeCheck;
private final InstanthealCheck instanthealCheck;
@ -44,6 +46,7 @@ public class FightCheckListener implements Listener, EventManager {
checks.add(new NoswingCheck(plugin));
checks.add(new DirectionCheck(plugin));
checks.add(new ReachCheck(plugin));
checks.add(new KnockbackCheck(plugin));
godmodeCheck = new GodmodeCheck(plugin);
instanthealCheck = new InstanthealCheck(plugin);
@ -177,6 +180,8 @@ public class FightCheckListener implements Listener, EventManager {
s.add("fight.godmode");
if (f.instanthealCheck)
s.add("fight.instantHeal");
if (f.knockbackCheck)
s.add("fight.knockback");
return s;
}
@ -249,4 +254,26 @@ public class FightCheckListener implements Listener, EventManager {
if (cancelled)
event.setCancelled(true);
}
/**
* We listen to the PlayerToggleSprint event for the
* knockback check
*
* @param event
* The PlayerToggleSprintEvent
*/
@EventHandler(
ignoreCancelled = true, priority = EventPriority.LOWEST)
public void sprint(final PlayerToggleSprintEvent event) {
final NoCheatPlusPlayer player = plugin.getPlayer(event.getPlayer());
final FightConfig cc = FightCheck.getConfig(player);
if (!cc.knockbackCheck || player.hasPermission(Permissions.FIGHT_KNOCKBACK))
return;
// Store when the player has started sprinting
final FightData data = FightCheck.getData(player);
data.sprint = System.currentTimeMillis();
}
}

View File

@ -37,6 +37,10 @@ public class FightConfig implements ConfigItem {
public final boolean instanthealCheck;
public final ActionList instanthealActions;
public final boolean knockbackCheck;
public final long knockbackInterval;
public final ActionList knockbackActions;
public FightConfig(final NoCheatPlusConfiguration data) {
directionCheck = data.getBoolean(ConfPaths.FIGHT_DIRECTION_CHECK);
@ -58,5 +62,9 @@ public class FightConfig implements ConfigItem {
instanthealCheck = data.getBoolean(ConfPaths.FIGHT_INSTANTHEAL_CHECK);
instanthealActions = data.getActionList(ConfPaths.FIGHT_INSTANTHEAL_ACTIONS, Permissions.FIGHT_INSTANTHEAL);
knockbackCheck = data.getBoolean(ConfPaths.FIGHT_KNOCKBACK_CHECK);
knockbackInterval = data.getLong(ConfPaths.FIGHT_KNOCKBACK_INTERVAL);
knockbackActions = data.getActionList(ConfPaths.FIGHT_KNOCKBACK_ACTIONS, Permissions.FIGHT_KNOCKBACK);
}
}

View File

@ -16,6 +16,7 @@ public class FightData implements DataItem {
public int speedVL;
public double godmodeVL;
public double instanthealVL;
public double knockbackVL;
// For checks that have penalty time
public long directionLastViolationTime;
@ -45,4 +46,7 @@ public class FightData implements DataItem {
public long speedTime;
public int speedAttackCount;
// Remember when the player has toggled his sprint mode
public long sprint = 0L;
}

View File

@ -0,0 +1,61 @@
package me.neatmonster.nocheatplus.checks.fight;
import java.util.Locale;
import me.neatmonster.nocheatplus.NoCheatPlus;
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.actions.ParameterName;
import me.neatmonster.nocheatplus.config.Permissions;
import me.neatmonster.nocheatplus.data.Statistics.Id;
/**
* A check used to verify if players aren't knockbacking other players when it's not technically possible
*
*/
public class KnockbackCheck extends FightCheck {
public KnockbackCheck(final NoCheatPlus plugin) {
super(plugin, "fight.knockback", Permissions.FIGHT_KNOCKBACK);
}
@Override
public boolean check(final NoCheatPlusPlayer player, final FightData data, final FightConfig cc) {
boolean cancel = false;
// Check how long ago has the player started sprinting
if (data.sprint > 0L && System.currentTimeMillis() - data.sprint < cc.knockbackInterval) {
// Player failed the check, but this is influenced by lag,
// so don't do it if there was lag
if (!plugin.skipCheck()) {
// The violation level if the difference between the regular and the elapsed time
final long delta = cc.knockbackInterval - System.currentTimeMillis() + data.sprint;
// Increment the violation level
data.knockbackVL += delta;
// Increment the statisctics of the player
incrementStatistics(player, Id.FI_KNOCKBACK, delta);
}
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
cancel = executeActions(player, cc.knockbackActions, data.knockbackVL);
}
return cancel;
}
@Override
public String getParameter(final ParameterName wildcard, final NoCheatPlusPlayer player) {
if (wildcard == ParameterName.VIOLATIONS)
return String.format(Locale.US, "%d", (int) getData(player).knockbackVL);
else
return super.getParameter(wildcard, player);
}
@Override
public boolean isEnabled(final FightConfig cc) {
return cc.knockbackCheck;
}
}

View File

@ -7,6 +7,15 @@ import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.actions.ParameterName;
import me.neatmonster.nocheatplus.data.Statistics.Id;
/**
* The morePacketsVehiculeCheck will try to identify players that send more than
* the usual amount of vehicule-move-packets to the server to be able to move
* faster than normal, without getting caught by the other checks (flying/running).
*
* It monitors the number of packets sent to the server within 1 second and
* compares it to the "legal" number of packets for that timeframe (22).
*
*/
public class MorePacketsVehicleCheck extends MovingCheck {
// 20 would be for perfect internet connections, 22 is good enough

View File

@ -11,7 +11,6 @@ import me.neatmonster.nocheatplus.config.ConfigurationCacheStore;
import me.neatmonster.nocheatplus.config.Permissions;
import me.neatmonster.nocheatplus.data.PreciseLocation;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@ -45,7 +44,6 @@ public class MovingCheckListener implements Listener, EventManager {
private final MorePacketsVehicleCheck morePacketsVehicleCheck;
private final FlyingCheck flyingCheck;
private final RunningCheck runningCheck;
private final TrackerCheck trackerCheck;
private final WaterWalkCheck waterWalkCheck;
private final NoCheatPlus plugin;
@ -54,31 +52,10 @@ public class MovingCheckListener implements Listener, EventManager {
flyingCheck = new FlyingCheck(plugin);
runningCheck = new RunningCheck(plugin);
trackerCheck = new TrackerCheck(plugin);
morePacketsCheck = new MorePacketsCheck(plugin);
morePacketsVehicleCheck = new MorePacketsVehicleCheck(plugin);
waterWalkCheck = new WaterWalkCheck(plugin);
// Schedule a new synchronized repeating task repeated 20 times/s.
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
@Override
public void run() {
// Loop through all players
for (final Player bukkitPlayer : Bukkit.getOnlinePlayers()) {
// Get some data about the player/config
final NoCheatPlusPlayer player = plugin.getPlayer(bukkitPlayer);
final MovingConfig cc = MovingCheck.getConfig(player);
final MovingData data = MovingCheck.getData(player);
// Execute the check
trackerCheck.check(player, data, cc);
}
}
}, 1L, 1L);
this.plugin = plugin;
}
@ -169,8 +146,6 @@ public class MovingCheckListener implements Listener, EventManager {
s.add("moving.sneaking");
if (m.nofallCheck)
s.add("moving.nofall");
if (m.trackerCheck)
s.add("moving.tracker");
if (m.waterWalkCheck)
s.add("moving.waterwalk");
} else
@ -321,12 +296,8 @@ public class MovingCheckListener implements Listener, EventManager {
@EventHandler
public void quit(final PlayerQuitEvent event) {
final NoCheatPlusPlayer player = plugin.getPlayer(event.getPlayer());
final MovingData data = MovingCheck.getData(player);
// Reset the variable
data.fallingSince = 0L;
// If the player has buried himself, remove the blocks to prevent
// him from respawning at the surface
if (!event.getPlayer().hasPermission(Permissions.MOVING_RESPAWNTRICK)
&& (event.getPlayer().getLocation().getBlock().getType() == Material.GRAVEL || event.getPlayer()
.getLocation().getBlock().getType() == Material.SAND)) {

View File

@ -24,9 +24,6 @@ public class MovingConfig implements ConfigItem {
public final int maxCooldown;
public final ActionList actions;
public final boolean trackerCheck;
public final ActionList trackerActions;
public final boolean allowFlying;
public final double flyingSpeedLimitVertical;
public final double flyingSpeedLimitHorizontal;
@ -68,9 +65,6 @@ public class MovingConfig implements ConfigItem {
maxCooldown = data.getInt(ConfPaths.MOVING_RUNFLY_MAXCOOLDOWN);
actions = data.getActionList(ConfPaths.MOVING_RUNFLY_ACTIONS, Permissions.MOVING_RUNFLY);
trackerCheck = data.getBoolean(ConfPaths.MOVING_RUNFLY_TRACKER_CHECK);
trackerActions = data.getActionList(ConfPaths.MOVING_RUNFLY_TRACKER_ACTIONS, Permissions.MOVING_FLYING);
allowFlying = data.getBoolean(ConfPaths.MOVING_RUNFLY_FLYING_ALLOWALWAYS);
flyingSpeedLimitVertical = data.getInt(ConfPaths.MOVING_RUNFLY_FLYING_SPEEDLIMITVERTICAL) / 100D;
flyingSpeedLimitHorizontal = data.getInt(ConfPaths.MOVING_RUNFLY_FLYING_SPEEDLIMITHORIZONTAL) / 100D;

View File

@ -45,9 +45,6 @@ public class MovingData implements DataItem {
public float fallDistance;
public float lastAddedFallDistance;
// Keep in mind since when the player in falling/jumping
public long fallingSince = 0L;
// Is the player flying because of a plugin has modified his velocity
public boolean velocityChanged = false;
@ -90,6 +87,9 @@ public class MovingData implements DataItem {
public boolean fromOnOrInGround;
public boolean toOnOrInGround;
// Store if the player had blocks above his head when he moved previously
public boolean[] hadBlocksAbove = new boolean[5];
public Id statisticCategory = Id.MOV_RUNNING;
public void clearMorePacketsData() {
@ -102,6 +102,11 @@ public class MovingData implements DataItem {
fallDistance = 0;
lastAddedFallDistance = 0;
bunnyhopdelay = 0;
fallingSince = 0;
}
public void rotateWaterWalkData(final boolean aboveSolid) {
for (int i = 0; i < hadBlocksAbove.length - 1; i++)
hadBlocksAbove[i] = hadBlocksAbove[i + 1];
hadBlocksAbove[hadBlocksAbove.length - 1] = aboveSolid;
}
}

View File

@ -1,86 +0,0 @@
package me.neatmonster.nocheatplus.checks.moving;
import java.util.Locale;
import me.neatmonster.nocheatplus.NoCheatPlus;
import me.neatmonster.nocheatplus.NoCheatPlusPlayer;
import me.neatmonster.nocheatplus.actions.ParameterName;
import me.neatmonster.nocheatplus.checks.CheckUtil;
import me.neatmonster.nocheatplus.config.Permissions;
import me.neatmonster.nocheatplus.data.PreciseLocation;
import me.neatmonster.nocheatplus.data.Statistics.Id;
import org.bukkit.GameMode;
import org.bukkit.Material;
public class TrackerCheck extends MovingCheck {
public TrackerCheck(final NoCheatPlus plugin) {
super(plugin, "moving.tracker");
}
public void check(final NoCheatPlusPlayer player, final MovingData data, final MovingConfig cc) {
final PreciseLocation location = new PreciseLocation();
location.x = player.getPlayer().getLocation().getX();
location.y = player.getPlayer().getLocation().getY();
location.z = player.getPlayer().getLocation().getZ();
final int type = CheckUtil.evaluateLocation(player.getPlayer().getWorld(), location);
final boolean isLiquid = CheckUtil.isLiquid(type);
// Check if the player is on the ground
if (player.getPlayer().getLocation().add(0, -1, 0).getBlock().getType() != Material.AIR)
data.hasAlreadyBeenOnTheGround = true;
// Do not do the check if it's disabled, if flying is allowed, if the player is
// allowed to fly because of its game mode, if he has the required permission,
// if he is in water, on a ladder or in vines.
if (!cc.trackerCheck || cc.allowFlying || player.getPlayer().getGameMode() == GameMode.CREATIVE
|| player.getPlayer().getAllowFlight() || player.getPlayer().hasPermission(Permissions.MOVING_RUNFLY)
|| player.getPlayer().hasPermission(Permissions.MOVING_FLYING) || isLiquid
|| player.getPlayer().getLocation().getBlock().getType() == Material.LADDER
|| player.getPlayer().getLocation().getBlock().getType() == Material.VINE
|| player.getPlayer().getLocation().getY() < 0D) {
data.fallingSince = 0L;
return;
}
// If the player isn't static or jumping
if (Math.abs(player.getPlayer().getVelocity().getY()) > 0.1D && !data.velocityChanged) {
// Only do something if the player has already been on the ground
if (!data.hasAlreadyBeenOnTheGround)
return;
// The player is static/jumping, check if he was previously on the ground
if (data.fallingSince == 0L)
data.fallingSince = System.currentTimeMillis();
// Check if he has stayed too much time in the air (more than 6 seconds)
else if (System.currentTimeMillis() - data.fallingSince > 6000L) {
// He has, so increment the violation level and the statistics
data.trackerVL += System.currentTimeMillis() - data.fallDistance - 6000L;
incrementStatistics(player, Id.MOV_TRACKER, data.trackerVL);
// Execute whatever actions are associated with this check and the
// violation level and find out if we should cancel the event
executeActions(player, cc.trackerActions, data.trackerVL);
}
} else {
// Reset the timer
data.fallingSince = 0L;
// Reduce the violation level
data.trackerVL *= 0.95;
}
}
@Override
public String getParameter(final ParameterName wildcard, final NoCheatPlusPlayer player) {
if (wildcard == ParameterName.VIOLATIONS)
return String.format(Locale.US, "%d", (int) getData(player).trackerVL);
else
return super.getParameter(wildcard, player);
}
}

View File

@ -13,6 +13,10 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
/**
* This check is used to verify that players aren't walking on water
*
*/
public class WaterWalkCheck extends MovingCheck {
public WaterWalkCheck(final NoCheatPlus plugin) {
@ -28,6 +32,15 @@ public class WaterWalkCheck extends MovingCheck {
up.y = to.y + 1;
up.z = to.z;
final PreciseLocation toAbove = new PreciseLocation();
toAbove.x = to.x;
toAbove.y = to.y + 2;
toAbove.z = to.z;
final PreciseLocation fromAbove = new PreciseLocation();
fromAbove.x = from.x;
fromAbove.y = from.y + 2;
fromAbove.z = from.z;
// To know if a player "is in water" is useful
final int fromType = CheckUtil.evaluateLocation(player.getPlayer().getWorld(), from);
final int toType = CheckUtil.evaluateLocation(player.getPlayer().getWorld(), to);
@ -37,6 +50,17 @@ public class WaterWalkCheck extends MovingCheck {
final boolean toLiquid = CheckUtil.isLiquid(toType);
final boolean upLiquid = CheckUtil.isLiquid(upType);
final boolean toAboveSolid = CheckUtil.isSolid(CheckUtil.getType(new Location(player.getPlayer().getWorld(),
toAbove.x, toAbove.y, toAbove.z).getBlock().getTypeId()));
final boolean fromAboveSolid = CheckUtil.isSolid(CheckUtil.getType(new Location(player.getPlayer().getWorld(),
fromAbove.x, fromAbove.y, fromAbove.z).getBlock().getTypeId()));
boolean aboveSolid = toAboveSolid || fromAboveSolid;
final boolean save = aboveSolid;
for (final boolean hadBlocksAbove : data.hadBlocksAbove)
if (hadBlocksAbove)
aboveSolid = true;
data.rotateWaterWalkData(save);
final Block fromBlock = new Location(player.getPlayer().getWorld(), from.x, from.y, from.z).getBlock();
// Handle the issue with water streams
@ -69,7 +93,8 @@ public class WaterWalkCheck extends MovingCheck {
// Slowly reduce the level with each event
data.waterWalkVL *= 0.95;
if (!slabsStairsFix && fromLiquid && toLiquid && !upLiquid && deltaY == 0D && deltaWithSurface < 0.8D) {
if (!slabsStairsFix && fromLiquid && toLiquid && !upLiquid && !aboveSolid && deltaY == 0D
&& deltaWithSurface < 0.8D) {
// If the player is trying to move while being in water
// Increment violation counter
data.waterWalkVL += resultY;
@ -81,7 +106,7 @@ public class WaterWalkCheck extends MovingCheck {
// Was one of the actions a cancel? Then do it
if (cancel)
newToLocation = from;
} else if (waterStreamsFix && fromLiquid && !toLiquid && (deltaX < 0.28D || deltaX > 0.31D)
} else if (waterStreamsFix && fromLiquid && !toLiquid && !aboveSolid && (deltaX < 0.28D || deltaX > 0.31D)
&& (deltaZ < 0.28D || deltaZ > 0.31D)) {
// If the player is trying to jump while being in water
// Increment violation counter

View File

@ -8,227 +8,229 @@ package me.neatmonster.nocheatplus.config;
*/
public abstract class ConfPaths {
private final static String CLIENT_MODS = "clientmods.";
public final static String CLIENT_MODS_ALLOW = CLIENT_MODS + "allow";
private static final String LOGGING = "logging.";
public static final String LOGGING_ACTIVE = LOGGING + "active";
public static final String LOGGING_PREFIX = LOGGING + "prefix";
public static final String LOGGING_FILENAME = LOGGING + "filename";
public static final String LOGGING_LOGTOFILE = LOGGING + "file";
public static final String LOGGING_LOGTOCONSOLE = LOGGING + "console";
public static final String LOGGING_LOGTOINGAMECHAT = LOGGING + "ingamechat";
public static final String LOGGING_SHOWACTIVECHECKS = LOGGING + "showactivechecks";
public static final String LOGGING_DEBUGMESSAGES = LOGGING + "debugmessages";
private final static String LOGGING = "logging.";
public final static String LOGGING_ACTIVE = LOGGING + "active";
public final static String LOGGING_PREFIX = LOGGING + "prefix";
public final static String LOGGING_FILENAME = LOGGING + "filename";
public final static String LOGGING_LOGTOFILE = LOGGING + "file";
public final static String LOGGING_LOGTOCONSOLE = LOGGING + "console";
public final static String LOGGING_LOGTOINGAMECHAT = LOGGING + "ingamechat";
public final static String LOGGING_SHOWACTIVECHECKS = LOGGING + "showactivechecks";
public final static String LOGGING_DEBUGMESSAGES = LOGGING + "debugmessages";
private static final String MISCELLANEOUS = "miscellaneous.";
public static final String MISCELLANEOUS_ALLOWCLIENTMODS = MISCELLANEOUS + "allowclientmods";
public static final String MISCELLANEOUS_OPBYCONSOLEONLY = MISCELLANEOUS + "opbyconsoleonly";
private final static String CHECKS = "checks.";
private static final String CHECKS = "checks.";
private final static String INVENTORY = CHECKS + "inventory.";
private static final String INVENTORY = CHECKS + "inventory.";
private final static String INVENTORY_DROP = INVENTORY + "drop.";
public final static String INVENTORY_DROP_CHECK = INVENTORY_DROP + "active";
public final static String INVENTORY_DROP_TIMEFRAME = INVENTORY_DROP + "time";
public final static String INVENTORY_DROP_LIMIT = INVENTORY_DROP + "limit";
public final static String INVENTORY_DROP_ACTIONS = INVENTORY_DROP + "actions";
private static final String INVENTORY_DROP = INVENTORY + "drop.";
public static final String INVENTORY_DROP_CHECK = INVENTORY_DROP + "active";
public static final String INVENTORY_DROP_TIMEFRAME = INVENTORY_DROP + "time";
public static final String INVENTORY_DROP_LIMIT = INVENTORY_DROP + "limit";
public static final String INVENTORY_DROP_ACTIONS = INVENTORY_DROP + "actions";
private static final String INVENTORY_INSTANTBOW = INVENTORY + "instantbow.";
public final static String INVENTORY_INSTANTBOW_CHECK = INVENTORY_INSTANTBOW + "active";
public static final String INVENTORY_INSTANTBOW_CHECK = INVENTORY_INSTANTBOW + "active";
public static final String INVENTORY_INSTANTBOW_ACTIONS = INVENTORY_INSTANTBOW + "actions";
private static final String INVENTORY_INSTANTEAT = INVENTORY + "instanteat.";
public final static String INVENTORY_INSTANTEAT_CHECK = INVENTORY_INSTANTEAT + "active";
public static final String INVENTORY_INSTANTEAT_CHECK = INVENTORY_INSTANTEAT + "active";
public static final String INVENTORY_INSTANTEAT_ACTIONS = INVENTORY_INSTANTEAT + "actions";
private final static String MOVING = CHECKS + "moving.";
private static final String MOVING = CHECKS + "moving.";
private final static String MOVING_RUNFLY = MOVING + "runfly.";
public final static String MOVING_RUNFLY_CHECK = MOVING_RUNFLY + "active";
private static final String MOVING_RUNFLY = MOVING + "runfly.";
public static final String MOVING_RUNFLY_CHECK = MOVING_RUNFLY + "active";
// These four are not automatically shown in the config
public final static String MOVING_RUNFLY_WALKSPEED = MOVING_RUNFLY + "walkspeed";
public final static String MOVING_RUNFLY_SNEAKSPEED = MOVING_RUNFLY + "sneakspeed";
public final static String MOVING_RUNFLY_SWIMSPEED = MOVING_RUNFLY + "swimspeed";
public final static String MOVING_RUNFLY_SPRINTSPEED = MOVING_RUNFLY + "sprintspeed";
public static final String MOVING_RUNFLY_WALKSPEED = MOVING_RUNFLY + "walkspeed";
public static final String MOVING_RUNFLY_SNEAKSPEED = MOVING_RUNFLY + "sneakspeed";
public static final String MOVING_RUNFLY_SWIMSPEED = MOVING_RUNFLY + "swimspeed";
public static final String MOVING_RUNFLY_SPRINTSPEED = MOVING_RUNFLY + "sprintspeed";
public final static String MOVING_RUNFLY_ALLOWFASTSNEAKING = MOVING_RUNFLY + "allowfastsneaking";
public final static String MOVING_RUNFLY_MAXCOOLDOWN = MOVING_RUNFLY + "maxcooldown";
public final static String MOVING_RUNFLY_ACTIONS = MOVING_RUNFLY + "actions";
public static final String MOVING_RUNFLY_ALLOWFASTSNEAKING = MOVING_RUNFLY + "allowfastsneaking";
public static final String MOVING_RUNFLY_MAXCOOLDOWN = MOVING_RUNFLY + "maxcooldown";
public static final String MOVING_RUNFLY_ACTIONS = MOVING_RUNFLY + "actions";
public final static String MOVING_RUNFLY_CHECKNOFALL = MOVING_RUNFLY + "checknofall";
public final static String MOVING_RUNFLY_NOFALLAGGRESSIVE = MOVING_RUNFLY + "nofallaggressivemode";
public final static String MOVING_RUNFLY_NOFALLACTIONS = MOVING_RUNFLY + "nofallactions";
public static final String MOVING_RUNFLY_CHECKNOFALL = MOVING_RUNFLY + "checknofall";
public static final String MOVING_RUNFLY_NOFALLAGGRESSIVE = MOVING_RUNFLY + "nofallaggressivemode";
public static final String MOVING_RUNFLY_NOFALLACTIONS = MOVING_RUNFLY + "nofallactions";
private final static String MOVING_RUNFLY_TRACKER = MOVING_RUNFLY + "tracker.";
public final static String MOVING_RUNFLY_TRACKER_CHECK = MOVING_RUNFLY_TRACKER + "active";
public final static String MOVING_RUNFLY_TRACKER_ACTIONS = MOVING_RUNFLY_TRACKER + "actions";
private final static String MOVING_RUNFLY_FLYING = MOVING_RUNFLY + "flying.";
public final static String MOVING_RUNFLY_FLYING_ALLOWALWAYS = MOVING_RUNFLY_FLYING + "allowflyingalways";
public final static String MOVING_RUNFLY_FLYING_ALLOWINCREATIVE = MOVING_RUNFLY_FLYING
private static final String MOVING_RUNFLY_FLYING = MOVING_RUNFLY + "flying.";
public static final String MOVING_RUNFLY_FLYING_ALLOWALWAYS = MOVING_RUNFLY_FLYING + "allowflyingalways";
public static final String MOVING_RUNFLY_FLYING_ALLOWINCREATIVE = MOVING_RUNFLY_FLYING
+ "allowflyingincreative";
public final static String MOVING_RUNFLY_FLYING_SPEEDLIMITVERTICAL = MOVING_RUNFLY_FLYING
public static final String MOVING_RUNFLY_FLYING_SPEEDLIMITVERTICAL = MOVING_RUNFLY_FLYING
+ "flyingspeedlimitvertical";
public final static String MOVING_RUNFLY_FLYING_SPEEDLIMITHORIZONTAL = MOVING_RUNFLY_FLYING
public static final String MOVING_RUNFLY_FLYING_SPEEDLIMITHORIZONTAL = MOVING_RUNFLY_FLYING
+ "flyingspeedlimithorizontal";
public final static String MOVING_RUNFLY_FLYING_HEIGHTLIMIT = MOVING_RUNFLY_FLYING + "flyingheightlimit";
public final static String MOVING_RUNFLY_FLYING_ACTIONS = MOVING_RUNFLY_FLYING + "actions";
public static final String MOVING_RUNFLY_FLYING_HEIGHTLIMIT = MOVING_RUNFLY_FLYING + "flyingheightlimit";
public static final String MOVING_RUNFLY_FLYING_ACTIONS = MOVING_RUNFLY_FLYING + "actions";
private final static String MOVING_MOREPACKETS = MOVING + "morepackets.";
public final static String MOVING_MOREPACKETS_CHECK = MOVING_MOREPACKETS + "active";
public final static String MOVING_MOREPACKETS_ACTIONS = MOVING_MOREPACKETS + "actions";
private static final String MOVING_MOREPACKETS = MOVING + "morepackets.";
public static final String MOVING_MOREPACKETS_CHECK = MOVING_MOREPACKETS + "active";
public static final String MOVING_MOREPACKETS_ACTIONS = MOVING_MOREPACKETS + "actions";
private final static String MOVING_MOREPACKETSVEHICLE = MOVING + "morepacketsvehicle.";
public final static String MOVING_MOREPACKETSVEHICLE_CHECK = MOVING_MOREPACKETSVEHICLE + "active";
public final static String MOVING_MOREPACKETSVEHICLE_ACTIONS = MOVING_MOREPACKETSVEHICLE + "actions";
private static final String MOVING_MOREPACKETSVEHICLE = MOVING + "morepacketsvehicle.";
public static final String MOVING_MOREPACKETSVEHICLE_CHECK = MOVING_MOREPACKETSVEHICLE + "active";
public static final String MOVING_MOREPACKETSVEHICLE_ACTIONS = MOVING_MOREPACKETSVEHICLE + "actions";
private final static String MOVING_WATERWALK = MOVING + "waterwalk.";
public final static String MOVING_WATERWALK_CHECK = MOVING_WATERWALK + "active";
public final static String MOVING_WATERWALK_ACTIONS = MOVING_WATERWALK + "actions";
private static final String MOVING_WATERWALK = MOVING + "waterwalk.";
public static final String MOVING_WATERWALK_CHECK = MOVING_WATERWALK + "active";
public static final String MOVING_WATERWALK_ACTIONS = MOVING_WATERWALK + "actions";
private final static String BLOCKBREAK = CHECKS + "blockbreak.";
private static final String BLOCKBREAK = CHECKS + "blockbreak.";
private final static String BLOCKBREAK_FASTBREAK = BLOCKBREAK + "fastbreak.";
public final static String BLOCKBREAK_FASTBREAK_CHECK = BLOCKBREAK_FASTBREAK + "active";
public final static String BLOCKBREAK_FASTBREAK_INTERVALSURVIVAL = BLOCKBREAK_FASTBREAK + "intervalsurvival";
public final static String BLOCKBREAK_FASTBREAK_INTERVALCREATIVE = BLOCKBREAK_FASTBREAK + "intervalcreative";
public final static String BLOCKBREAK_FASTBREAK_ACTIONS = BLOCKBREAK_FASTBREAK + "actions";
private static final String BLOCKBREAK_FASTBREAK = BLOCKBREAK + "fastbreak.";
public static final String BLOCKBREAK_FASTBREAK_CHECK = BLOCKBREAK_FASTBREAK + "active";
public static final String BLOCKBREAK_FASTBREAK_INTERVALSURVIVAL = BLOCKBREAK_FASTBREAK + "intervalsurvival";
public static final String BLOCKBREAK_FASTBREAK_INTERVALCREATIVE = BLOCKBREAK_FASTBREAK + "intervalcreative";
public static final String BLOCKBREAK_FASTBREAK_ACTIONS = BLOCKBREAK_FASTBREAK + "actions";
private final static String BLOCKBREAK_REACH = BLOCKBREAK + "reach.";
public final static String BLOCKBREAK_REACH_CHECK = BLOCKBREAK_REACH + "active";
public final static String BLOCKBREAK_REACH_ACTIONS = BLOCKBREAK_REACH + "actions";
private static final String BLOCKBREAK_REACH = BLOCKBREAK + "reach.";
public static final String BLOCKBREAK_REACH_CHECK = BLOCKBREAK_REACH + "active";
public static final String BLOCKBREAK_REACH_ACTIONS = BLOCKBREAK_REACH + "actions";
private final static String BLOCKBREAK_DIRECTION = BLOCKBREAK + "direction.";
public final static String BLOCKBREAK_DIRECTION_CHECK = BLOCKBREAK_DIRECTION + "active";
public final static String BLOCKBREAK_DIRECTION_PRECISION = BLOCKBREAK_DIRECTION + "precision";
public final static String BLOCKBREAK_DIRECTION_PENALTYTIME = BLOCKBREAK_DIRECTION + "penaltytime";
public final static String BLOCKBREAK_DIRECTION_ACTIONS = BLOCKBREAK_DIRECTION + "actions";
private static final String BLOCKBREAK_DIRECTION = BLOCKBREAK + "direction.";
public static final String BLOCKBREAK_DIRECTION_CHECK = BLOCKBREAK_DIRECTION + "active";
public static final String BLOCKBREAK_DIRECTION_PRECISION = BLOCKBREAK_DIRECTION + "precision";
public static final String BLOCKBREAK_DIRECTION_PENALTYTIME = BLOCKBREAK_DIRECTION + "penaltytime";
public static final String BLOCKBREAK_DIRECTION_ACTIONS = BLOCKBREAK_DIRECTION + "actions";
private final static String BLOCKBREAK_NOSWING = BLOCKBREAK + "noswing.";
private static final String BLOCKBREAK_NOSWING = BLOCKBREAK + "noswing.";
public static final String BLOCKBREAK_NOSWING_CHECK = BLOCKBREAK_NOSWING + "active";
public static final String BLOCKBREAK_NOSWING_ACTIONS = BLOCKBREAK_NOSWING + "actions";
private final static String BLOCKPLACE = CHECKS + "blockplace.";
private static final String BLOCKPLACE = CHECKS + "blockplace.";
private final static String BLOCKPLACE_FASTPLACE = BLOCKPLACE + "fastplace.";
public final static String BLOCKPLACE_FASTPLACE_CHECK = BLOCKPLACE_FASTPLACE + "active";
public final static String BLOCKPLACE_FASTPLACE_INTERVAL = BLOCKPLACE_FASTPLACE + "interval";
public final static String BLOCKPLACE_FASTPLACE_ACTIONS = BLOCKPLACE_FASTPLACE + "actions";
private static final String BLOCKPLACE_FASTPLACE = BLOCKPLACE + "fastplace.";
public static final String BLOCKPLACE_FASTPLACE_CHECK = BLOCKPLACE_FASTPLACE + "active";
public static final String BLOCKPLACE_FASTPLACE_INTERVAL = BLOCKPLACE_FASTPLACE + "interval";
public static final String BLOCKPLACE_FASTPLACE_ACTIONS = BLOCKPLACE_FASTPLACE + "actions";
private final static String BLOCKPLACE_REACH = BLOCKPLACE + "reach.";
public final static String BLOCKPLACE_REACH_CHECK = BLOCKPLACE_REACH + "active";
public final static String BLOCKPLACE_REACH_ACTIONS = BLOCKPLACE_REACH + "actions";
private static final String BLOCKPLACE_REACH = BLOCKPLACE + "reach.";
public static final String BLOCKPLACE_REACH_CHECK = BLOCKPLACE_REACH + "active";
public static final String BLOCKPLACE_REACH_ACTIONS = BLOCKPLACE_REACH + "actions";
private final static String BLOCKPLACE_DIRECTION = BLOCKPLACE + "direction.";
public final static String BLOCKPLACE_DIRECTION_CHECK = BLOCKPLACE_DIRECTION + "active";
public final static String BLOCKPLACE_DIRECTION_PRECISION = BLOCKPLACE_DIRECTION + "precision";
public final static String BLOCKPLACE_DIRECTION_PENALTYTIME = BLOCKPLACE_DIRECTION + "penaltytime";
public final static String BLOCKPLACE_DIRECTION_ACTIONS = BLOCKPLACE_DIRECTION + "actions";
private static final String BLOCKPLACE_DIRECTION = BLOCKPLACE + "direction.";
public static final String BLOCKPLACE_DIRECTION_CHECK = BLOCKPLACE_DIRECTION + "active";
public static final String BLOCKPLACE_DIRECTION_PRECISION = BLOCKPLACE_DIRECTION + "precision";
public static final String BLOCKPLACE_DIRECTION_PENALTYTIME = BLOCKPLACE_DIRECTION + "penaltytime";
public static final String BLOCKPLACE_DIRECTION_ACTIONS = BLOCKPLACE_DIRECTION + "actions";
private final static String BLOCKPLACE_PROJECTILE = BLOCKPLACE + "projectile.";
public final static String BLOCKPLACE_PROJECTILE_CHECK = BLOCKPLACE_PROJECTILE + "active";
public final static String BLOCKPLACE_PROJECTILE_INTERVAL = BLOCKPLACE_PROJECTILE + "interval";
public final static String BLOCKPLACE_PROJECTILE_ACTIONS = BLOCKPLACE_PROJECTILE + "actions";
private static final String BLOCKPLACE_PROJECTILE = BLOCKPLACE + "projectile.";
public static final String BLOCKPLACE_PROJECTILE_CHECK = BLOCKPLACE_PROJECTILE + "active";
public static final String BLOCKPLACE_PROJECTILE_INTERVAL = BLOCKPLACE_PROJECTILE + "interval";
public static final String BLOCKPLACE_PROJECTILE_ACTIONS = BLOCKPLACE_PROJECTILE + "actions";
private final static String CHAT = CHECKS + "chat.";
private static final String CHAT = CHECKS + "chat.";
public final static String CHAT_HIDECOMMANDS = CHAT + "hidecommands";
public static final String CHAT_HIDECOMMANDS = CHAT + "hidecommands";
private final static String CHAT_NOPWNAGE = CHAT + "nopwnage.";
public final static String CHAT_NOPWNAGE_CHECK = CHAT_NOPWNAGE + "active";
public final static String CHAT_NOPWNAGE_WARNPLAYERS = CHAT_NOPWNAGE + "warnplayers";
public final static String CHAT_NOPWNAGE_WARNOTHERS = CHAT_NOPWNAGE + "warnothers";
public final static String CHAT_NOPWNAGE_WARNLEVEL = CHAT_NOPWNAGE + "warnlevel";
public final static String CHAT_NOPWNAGE_WARNTIMEOUT = CHAT_NOPWNAGE + "warntimeout";
public final static String CHAT_NOPWNAGE_BANLEVEL = CHAT_NOPWNAGE + "banlevel";
public final static String CHAT_NOPWNAGE_ACTIONS = CHAT_NOPWNAGE + "actions";
private static final String CHAT_NOPWNAGE = CHAT + "nopwnage.";
public static final String CHAT_NOPWNAGE_CHECK = CHAT_NOPWNAGE + "active";
public static final String CHAT_NOPWNAGE_WARNPLAYERS = CHAT_NOPWNAGE + "warnplayers";
public static final String CHAT_NOPWNAGE_WARNOTHERS = CHAT_NOPWNAGE + "warnothers";
public static final String CHAT_NOPWNAGE_WARNLEVEL = CHAT_NOPWNAGE + "warnlevel";
public static final String CHAT_NOPWNAGE_WARNTIMEOUT = CHAT_NOPWNAGE + "warntimeout";
public static final String CHAT_NOPWNAGE_BANLEVEL = CHAT_NOPWNAGE + "banlevel";
public static final String CHAT_NOPWNAGE_ACTIONS = CHAT_NOPWNAGE + "actions";
private final static String CHAT_NOPWNAGE_MOVE = CHAT_NOPWNAGE + "move.";
public final static String CHAT_NOPWNAGE_MOVE_CHECK = CHAT_NOPWNAGE_MOVE + "active";
public final static String CHAT_NOPWNAGE_MOVE_WEIGHTBONUS = CHAT_NOPWNAGE_MOVE + "weightbonus";
public final static String CHAT_NOPWNAGE_MOVE_WEIGHTMALUS = CHAT_NOPWNAGE_MOVE + "weightmalus";
public final static String CHAT_NOPWNAGE_MOVE_TIMEOUT = CHAT_NOPWNAGE_MOVE + "timeout";
private static final String CHAT_NOPWNAGE_MOVE = CHAT_NOPWNAGE + "move.";
public static final String CHAT_NOPWNAGE_MOVE_CHECK = CHAT_NOPWNAGE_MOVE + "active";
public static final String CHAT_NOPWNAGE_MOVE_WEIGHTBONUS = CHAT_NOPWNAGE_MOVE + "weightbonus";
public static final String CHAT_NOPWNAGE_MOVE_WEIGHTMALUS = CHAT_NOPWNAGE_MOVE + "weightmalus";
public static final String CHAT_NOPWNAGE_MOVE_TIMEOUT = CHAT_NOPWNAGE_MOVE + "timeout";
private final static String CHAT_NOPWNAGE_REPEAT = CHAT_NOPWNAGE + "repeat.";
public final static String CHAT_NOPWNAGE_REPEAT_CHECK = CHAT_NOPWNAGE_REPEAT + "active";
public final static String CHAT_NOPWNAGE_REPEAT_WEIGHT = CHAT_NOPWNAGE_REPEAT + "weight";
public final static String CHAT_NOPWNAGE_REPEAT_TIMEOUT = CHAT_NOPWNAGE_REPEAT + "timeout";
private static final String CHAT_NOPWNAGE_REPEAT = CHAT_NOPWNAGE + "repeat.";
public static final String CHAT_NOPWNAGE_REPEAT_CHECK = CHAT_NOPWNAGE_REPEAT + "active";
public static final String CHAT_NOPWNAGE_REPEAT_WEIGHT = CHAT_NOPWNAGE_REPEAT + "weight";
public static final String CHAT_NOPWNAGE_REPEAT_TIMEOUT = CHAT_NOPWNAGE_REPEAT + "timeout";
private final static String CHAT_NOPWNAGE_SPEED = CHAT_NOPWNAGE + "speed.";
public final static String CHAT_NOPWNAGE_SPEED_CHECK = CHAT_NOPWNAGE_SPEED + "active";
public final static String CHAT_NOPWNAGE_SPEED_WEIGHT = CHAT_NOPWNAGE_SPEED + "weight";
public final static String CHAT_NOPWNAGE_SPEED_TIMEOUT = CHAT_NOPWNAGE_SPEED + "timeout";
private static final String CHAT_NOPWNAGE_SPEED = CHAT_NOPWNAGE + "speed.";
public static final String CHAT_NOPWNAGE_SPEED_CHECK = CHAT_NOPWNAGE_SPEED + "active";
public static final String CHAT_NOPWNAGE_SPEED_WEIGHT = CHAT_NOPWNAGE_SPEED + "weight";
public static final String CHAT_NOPWNAGE_SPEED_TIMEOUT = CHAT_NOPWNAGE_SPEED + "timeout";
private final static String CHAT_NOPWNAGE_FIRST = CHAT_NOPWNAGE + "first.";
public final static String CHAT_NOPWNAGE_FIRST_CHECK = CHAT_NOPWNAGE_FIRST + "active";
public final static String CHAT_NOPWNAGE_FIRST_WEIGHT = CHAT_NOPWNAGE_FIRST + "weight";
public final static String CHAT_NOPWNAGE_FIRST_TIMEOUT = CHAT_NOPWNAGE_FIRST + "timeout";
private static final String CHAT_NOPWNAGE_FIRST = CHAT_NOPWNAGE + "first.";
public static final String CHAT_NOPWNAGE_FIRST_CHECK = CHAT_NOPWNAGE_FIRST + "active";
public static final String CHAT_NOPWNAGE_FIRST_WEIGHT = CHAT_NOPWNAGE_FIRST + "weight";
public static final String CHAT_NOPWNAGE_FIRST_TIMEOUT = CHAT_NOPWNAGE_FIRST + "timeout";
private final static String CHAT_NOPWNAGE_GLOBAL = CHAT_NOPWNAGE + "global.";
public final static String CHAT_NOPWNAGE_GLOBAL_CHECK = CHAT_NOPWNAGE_GLOBAL + "active";
public final static String CHAT_NOPWNAGE_GLOBAL_WEIGHT = CHAT_NOPWNAGE_GLOBAL + "weight";
public final static String CHAT_NOPWNAGE_GLOBAL_TIMEOUT = CHAT_NOPWNAGE_GLOBAL + "timeout";
private static final String CHAT_NOPWNAGE_GLOBAL = CHAT_NOPWNAGE + "global.";
public static final String CHAT_NOPWNAGE_GLOBAL_CHECK = CHAT_NOPWNAGE_GLOBAL + "active";
public static final String CHAT_NOPWNAGE_GLOBAL_WEIGHT = CHAT_NOPWNAGE_GLOBAL + "weight";
public static final String CHAT_NOPWNAGE_GLOBAL_TIMEOUT = CHAT_NOPWNAGE_GLOBAL + "timeout";
private final static String CHAT_NOPWNAGE_BANNED = CHAT_NOPWNAGE + "banned.";
public final static String CHAT_NOPWNAGE_BANNED_CHECK = CHAT_NOPWNAGE_BANNED + "active";
public final static String CHAT_NOPWNAGE_BANNED_WEIGHT = CHAT_NOPWNAGE_BANNED + "weight";
public final static String CHAT_NOPWNAGE_BANNED_TIMEOUT = CHAT_NOPWNAGE_BANNED + "timeout";
private static final String CHAT_NOPWNAGE_BANNED = CHAT_NOPWNAGE + "banned.";
public static final String CHAT_NOPWNAGE_BANNED_CHECK = CHAT_NOPWNAGE_BANNED + "active";
public static final String CHAT_NOPWNAGE_BANNED_WEIGHT = CHAT_NOPWNAGE_BANNED + "weight";
public static final String CHAT_NOPWNAGE_BANNED_TIMEOUT = CHAT_NOPWNAGE_BANNED + "timeout";
private final static String CHAT_NOPWNAGE_RELOG = CHAT_NOPWNAGE + "relog.";
public final static String CHAT_NOPWNAGE_RELOG_CHECK = CHAT_NOPWNAGE_RELOG + "active";
public final static String CHAT_NOPWNAGE_RELOG_TIME = CHAT_NOPWNAGE_RELOG + "time";
public final static String CHAT_NOPWNAGE_RELOG_WARNINGS = CHAT_NOPWNAGE_RELOG + "warnings";
public final static String CHAT_NOPWNAGE_RELOG_TIMEOUT = CHAT_NOPWNAGE_RELOG + "timeout";
private static final String CHAT_NOPWNAGE_RELOG = CHAT_NOPWNAGE + "relog.";
public static final String CHAT_NOPWNAGE_RELOG_CHECK = CHAT_NOPWNAGE_RELOG + "active";
public static final String CHAT_NOPWNAGE_RELOG_TIME = CHAT_NOPWNAGE_RELOG + "time";
public static final String CHAT_NOPWNAGE_RELOG_WARNINGS = CHAT_NOPWNAGE_RELOG + "warnings";
public static final String CHAT_NOPWNAGE_RELOG_TIMEOUT = CHAT_NOPWNAGE_RELOG + "timeout";
private final static String CHAT_NOPWNAGE_CAPTCHA = CHAT_NOPWNAGE + "captcha.";
public final static String CHAT_NOPWNAGE_CAPTCHA_CHECK = CHAT_NOPWNAGE_CAPTCHA + "active";
public final static String CHAT_NOPWNAGE_CAPTCHA_TRIES = CHAT_NOPWNAGE_CAPTCHA + "tries";
public final static String CHAT_NOPWNAGE_CAPTCHA_LENGTH = CHAT_NOPWNAGE_CAPTCHA + "length";
public final static String CHAT_NOPWNAGE_CAPTCHA_CHARACTERS = CHAT_NOPWNAGE_CAPTCHA + "characters";
private static final String CHAT_NOPWNAGE_CAPTCHA = CHAT_NOPWNAGE + "captcha.";
public static final String CHAT_NOPWNAGE_CAPTCHA_CHECK = CHAT_NOPWNAGE_CAPTCHA + "active";
public static final String CHAT_NOPWNAGE_CAPTCHA_TRIES = CHAT_NOPWNAGE_CAPTCHA + "tries";
public static final String CHAT_NOPWNAGE_CAPTCHA_LENGTH = CHAT_NOPWNAGE_CAPTCHA + "length";
public static final String CHAT_NOPWNAGE_CAPTCHA_CHARACTERS = CHAT_NOPWNAGE_CAPTCHA + "characters";
private final static String CHAT_ARRIVALSLIMIT = CHAT + "arrivalslimit.";
public final static String CHAT_ARRIVALSLIMIT_CHECK = CHAT_ARRIVALSLIMIT + "active";
public final static String CHAT_ARRIVALSLIMIT_PLAYERSLIMIT = CHAT_ARRIVALSLIMIT + "playerslimit";
public final static String CHAT_ARRIVALSLIMIT_TIMEFRAME = CHAT_ARRIVALSLIMIT + "timeframe";
public final static String CHAT_ARRIVALSLIMIT_COOLDOWNDELAY = CHAT_ARRIVALSLIMIT + "cooldowndelay";
public final static String CHAT_ARRIVALSLIMIT_KICKMESSAGE = CHAT_ARRIVALSLIMIT + "kickmessage";
public final static String CHAT_ARRIVALSLIMIT_NEWTIME = CHAT_ARRIVALSLIMIT + "newtime";
public final static String CHAT_ARRIVALSLIMIT_ACTIONS = CHAT_ARRIVALSLIMIT + "actions";
private static final String CHAT_ARRIVALSLIMIT = CHAT + "arrivalslimit.";
public static final String CHAT_ARRIVALSLIMIT_CHECK = CHAT_ARRIVALSLIMIT + "active";
public static final String CHAT_ARRIVALSLIMIT_PLAYERSLIMIT = CHAT_ARRIVALSLIMIT + "playerslimit";
public static final String CHAT_ARRIVALSLIMIT_TIMEFRAME = CHAT_ARRIVALSLIMIT + "timeframe";
public static final String CHAT_ARRIVALSLIMIT_COOLDOWNDELAY = CHAT_ARRIVALSLIMIT + "cooldowndelay";
public static final String CHAT_ARRIVALSLIMIT_KICKMESSAGE = CHAT_ARRIVALSLIMIT + "kickmessage";
public static final String CHAT_ARRIVALSLIMIT_NEWTIME = CHAT_ARRIVALSLIMIT + "newtime";
public static final String CHAT_ARRIVALSLIMIT_ACTIONS = CHAT_ARRIVALSLIMIT + "actions";
private final static String CHAT_COLOR = CHAT + "color.";
public final static String CHAT_COLOR_CHECK = CHAT_COLOR + "active";
public final static String CHAT_COLOR_ACTIONS = CHAT_COLOR + "actions";
private static final String CHAT_COLOR = CHAT + "color.";
public static final String CHAT_COLOR_CHECK = CHAT_COLOR + "active";
public static final String CHAT_COLOR_ACTIONS = CHAT_COLOR + "actions";
private final static String FIGHT = CHECKS + "fight.";
private static final String FIGHT = CHECKS + "fight.";
private final static String FIGHT_DIRECTION = FIGHT + "direction.";
public final static String FIGHT_DIRECTION_CHECK = FIGHT_DIRECTION + "active";
public final static String FIGHT_DIRECTION_PRECISION = FIGHT_DIRECTION + "precision";
public final static String FIGHT_DIRECTION_PENALTYTIME = FIGHT_DIRECTION + "penaltytime";
public final static String FIGHT_DIRECTION_ACTIONS = FIGHT_DIRECTION + "actions";
private static final String FIGHT_DIRECTION = FIGHT + "direction.";
public static final String FIGHT_DIRECTION_CHECK = FIGHT_DIRECTION + "active";
public static final String FIGHT_DIRECTION_PRECISION = FIGHT_DIRECTION + "precision";
public static final String FIGHT_DIRECTION_PENALTYTIME = FIGHT_DIRECTION + "penaltytime";
public static final String FIGHT_DIRECTION_ACTIONS = FIGHT_DIRECTION + "actions";
private final static String FIGHT_NOSWING = FIGHT + "noswing.";
public final static String FIGHT_NOSWING_CHECK = FIGHT_NOSWING + "active";
public final static String FIGHT_NOSWING_ACTIONS = FIGHT_NOSWING + "actions";
private static final String FIGHT_NOSWING = FIGHT + "noswing.";
public static final String FIGHT_NOSWING_CHECK = FIGHT_NOSWING + "active";
public static final String FIGHT_NOSWING_ACTIONS = FIGHT_NOSWING + "actions";
private final static String FIGHT_REACH = FIGHT + "reach.";
private static final String FIGHT_REACH = FIGHT + "reach.";
public static final String FIGHT_REACH_CHECK = FIGHT_REACH + "active";
public static final String FIGHT_REACH_LIMIT = FIGHT_REACH + "distance";
public static final String FIGHT_REACH_PENALTYTIME = FIGHT_REACH + "penaltytime";
public static final String FIGHT_REACH_ACTIONS = FIGHT_REACH + "actions";
private final static String FIGHT_SPEED = FIGHT + "speed.";
public final static String FIGHT_SPEED_CHECK = FIGHT_SPEED + "active";
public final static String FIGHT_SPEED_ATTACKLIMIT = FIGHT_SPEED + "attacklimit";
public final static String FIGHT_SPEED_ACTIONS = FIGHT_SPEED + "actions";
private static final String FIGHT_SPEED = FIGHT + "speed.";
public static final String FIGHT_SPEED_CHECK = FIGHT_SPEED + "active";
public static final String FIGHT_SPEED_ATTACKLIMIT = FIGHT_SPEED + "attacklimit";
public static final String FIGHT_SPEED_ACTIONS = FIGHT_SPEED + "actions";
private final static String FIGHT_GODMODE = FIGHT + "godmode.";
private static final String FIGHT_GODMODE = FIGHT + "godmode.";
public static final String FIGHT_GODMODE_CHECK = FIGHT_GODMODE + "active";
public final static String FIGHT_GODMODE_ACTIONS = FIGHT_GODMODE + "actions";
public static final String FIGHT_GODMODE_ACTIONS = FIGHT_GODMODE + "actions";
private final static String FIGHT_INSTANTHEAL = FIGHT + "instantheal.";
private static final String FIGHT_INSTANTHEAL = FIGHT + "instantheal.";
public static final String FIGHT_INSTANTHEAL_CHECK = FIGHT_INSTANTHEAL + "active";
public final static String FIGHT_INSTANTHEAL_ACTIONS = FIGHT_INSTANTHEAL + "actions";
public static final String FIGHT_INSTANTHEAL_ACTIONS = FIGHT_INSTANTHEAL + "actions";
public final static String STRINGS = "strings";
private static final String FIGHT_KNOCKBACK = FIGHT + "knockback.";
public static final String FIGHT_KNOCKBACK_CHECK = FIGHT_KNOCKBACK + "active";
public static final String FIGHT_KNOCKBACK_INTERVAL = FIGHT_KNOCKBACK + "interval";
public static final String FIGHT_KNOCKBACK_ACTIONS = FIGHT_KNOCKBACK + "actions";
public static final String STRINGS = "strings";
}

View File

@ -14,11 +14,7 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
options().header("Main configuration file for NoCheatPlus. Read \"Instructions.txt\"");
/** CLIENT MODS **/
set(ConfPaths.CLIENT_MODS_ALLOW, false);
/** LOGGING **/
/*** LOGGING ***/
set(ConfPaths.LOGGING_ACTIVE, true);
set(ConfPaths.LOGGING_SHOWACTIVECHECKS, false);
@ -29,6 +25,11 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
set(ConfPaths.LOGGING_LOGTOCONSOLE, true);
set(ConfPaths.LOGGING_LOGTOINGAMECHAT, true);
/*** MISCELLANEOUS ***/
set(ConfPaths.MISCELLANEOUS_ALLOWCLIENTMODS, false);
set(ConfPaths.MISCELLANEOUS_OPBYCONSOLEONLY, true);
/*** INVENTORY ***/
set(ConfPaths.INVENTORY_DROP_CHECK, true);
@ -54,9 +55,6 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
set(ConfPaths.MOVING_RUNFLY_NOFALLAGGRESSIVE, true);
set(ConfPaths.MOVING_RUNFLY_NOFALLACTIONS, "log:nofall:0:5:cif cancel");
set(ConfPaths.MOVING_RUNFLY_TRACKER_CHECK, true);
set(ConfPaths.MOVING_RUNFLY_TRACKER_ACTIONS, "cmd:kick");
set(ConfPaths.MOVING_RUNFLY_FLYING_ALLOWALWAYS, false);
set(ConfPaths.MOVING_RUNFLY_FLYING_ALLOWINCREATIVE, true);
set(ConfPaths.MOVING_RUNFLY_FLYING_SPEEDLIMITHORIZONTAL, 60);
@ -199,6 +197,10 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
set(ConfPaths.FIGHT_INSTANTHEAL_CHECK, true);
set(ConfPaths.FIGHT_INSTANTHEAL_ACTIONS, "log:fheal:1:1:if cancel");
set(ConfPaths.FIGHT_KNOCKBACK_CHECK, true);
set(ConfPaths.FIGHT_KNOCKBACK_INTERVAL, 50);
set(ConfPaths.FIGHT_KNOCKBACK_ACTIONS, "cancel vl>50 log:fknock:0:5:cif cancel");
set(ConfPaths.STRINGS + ".drop",
"[player] failed [check]: Tried to drop more items than allowed. VL [violations]");
set(ConfPaths.STRINGS + ".moveshort", "[player] failed [check]. VL [violations]");
@ -238,6 +240,8 @@ public class DefaultConfiguration extends NoCheatPlusConfiguration {
set(ConfPaths.STRINGS + ".fgod", "[player] failed [check]: Avoided taking damage or lagging. VL [violations]");
set(ConfPaths.STRINGS + ".fheal",
"[player] failed [check]: Tried to regenerate health faster than normal. VL [violations]");
set(ConfPaths.STRINGS + ".fknock",
"[player] failed [check]: Tried to do a knockback but wasn't really sprinting. VL [violations]");
set(ConfPaths.STRINGS + ".ibow", "[player] failed [check]: Fires bow to fast. VL [violations]");
set(ConfPaths.STRINGS + ".ieat", "[player] failed [check]: Eats food [food] too fast. VL [violations]");
set(ConfPaths.STRINGS + ".kick", "kick [player]");

View File

@ -42,6 +42,7 @@ public class Permissions {
public static final String FIGHT_SPEED = FIGHT + ".speed";
public static final String FIGHT_GODMODE = FIGHT + ".godmode";
public static final String FIGHT_INSTANTHEAL = FIGHT + ".instantheal";
public static final String FIGHT_KNOCKBACK = FIGHT + ".knockback";
private static final String INVENTORY = CHECKS + ".inventory";
public static final String INVENTORY_DROP = INVENTORY + ".drop";

View File

@ -22,11 +22,11 @@ public class Statistics {
FI_NOSWING("fight.noswing"),
FI_REACH("fight.reach"),
FI_SPEED("fight.speed"),
FI_KNOCKBACK("fight.knockback"),
INV_DROP("inventory.drop"),
INV_BOW("inventory.instantbow"),
INV_EAT("inventory.instanteat"),
MOV_RUNNING("moving.running"),
MOV_TRACKER("moving.tracker"),
MOV_FLYING("moving.flying"),
MOV_MOREPACKETS("moving.morepackets"),
MOV_MOREPACKETSVEHICLE("moving.morepacketsvehicle"),