17 Commits
Author SHA1 Message Date
CaptainObvious0 3141a08a5e DefaultConfig - FightSync values 2019-04-07 16:10:59 -05:00
CaptainObvious0 82fd3226a4 FightListener - FightSync VL changes
Lower the players VL when their count is reset.
2019-04-07 16:05:23 -05:00
CaptainObvious0 040e7bc73a FightListener - Fix compile error 2019-04-07 15:45:13 -05:00
CaptainObvious0 0a9f832a06 DefaultConfig - FightSync 2019-04-07 15:37:06 -05:00
CaptainObvious0 8a45246d2c ConfPaths - FightSync 2019-04-07 15:34:41 -05:00
CaptainObvious0 5ae32be309 CheckType - Add FightSync + Scaffold 2019-04-07 15:33:17 -05:00
CaptainObvious0 47cf9d9833 UseEntityAdapter - Get packet location (FightSync)
Gets the players location via packets, used for FightSync
2019-04-07 15:32:08 -05:00
CaptainObvious0 391a8af30b FightSync - New check
This check attempts to verify that client and server yaw/pitch data are in sync.
2019-04-07 15:30:40 -05:00
CaptainObvious0 853ce8dba4 FightListener - FightSync Listener 2019-04-07 15:28:26 -05:00
CaptainObvious0 ea3b11a435 NetData - FightSync data 2019-04-07 15:23:46 -05:00
CaptainObvious0 2ffa0c726c NetConfig - FightSync Config 2019-04-07 15:23:05 -05:00
CaptainObvious0 3de05e27c4 DefaultConfig - Scaffold Check 2019-04-06 21:42:47 -05:00
CaptainObvious0 5a42e3fc37 ConfPaths - Scaffold Check 2019-04-06 21:40:24 -05:00
CaptainObvious0 612b073824 BlockPlaceConfig - ScaffoldActions 2019-04-06 21:39:34 -05:00
CaptainObvious0 fec7f4bcbc BlockPlaceData - ScaffoldVL 2019-04-06 21:38:37 -05:00
CaptainObvious0 a00921fafc BlockPlaceListener - Added listener for the scaffold check 2019-04-06 21:37:59 -05:00
CaptainObvious0 73ed92e299 Scaffold - Added check [BETA]
Added new block place check, scaffold. This will check that the player is interacting with the block face they are placing against. 

More sub-checks will be added to catch more scaffold cheats. 

[BETA] - The check is not yet finished and needs more testing.
2019-04-06 21:37:09 -05:00
12 changed files with 176 additions and 7 deletions

No files matched your search

@@ -134,6 +134,7 @@ public class UseEntityAdapter extends BaseAdapter {
final NetData data = pData.getGenericInstance(NetData.class);
// Always set last received time.
data.lastKeepAliveTime = time;
data.lastHitLocation = player.getLocation();
// Quick return, if no checks are active.
if (!pData.isCheckActive(CheckType.NET_ATTACKFREQUENCY, player)) {
@@ -51,6 +51,7 @@ public enum CheckType {
BLOCKPLACE_FASTPLACE(CheckTypeType.CHECK, BLOCKPLACE, Permissions.BLOCKPLACE_FASTPLACE),
BLOCKPLACE_NOSWING(CheckTypeType.CHECK, BLOCKPLACE, Permissions.BLOCKPLACE_NOSWING),
BLOCKPLACE_REACH(CheckTypeType.CHECK, BLOCKPLACE, Permissions.BLOCKBREAK_REACH),
BLOCKPLACE_SCAFFOLD(CheckTypeType.CHECK, BLOCKPLACE, Permissions.BLOCKBREAK_REACH),
BLOCKPLACE_SPEED(CheckTypeType.CHECK, BLOCKPLACE, Permissions.BLOCKPLACE_SPEED),
CHAT(CheckTypeType.GROUP, CheckType.ALL, Permissions.CHAT),
@@ -104,6 +105,7 @@ public enum CheckType {
NET(CheckTypeType.GROUP, CheckType.ALL, Permissions.NET),
NET_ATTACKFREQUENCY(CheckTypeType.CHECK, NET, Permissions.NET_ATTACKFREQUENCY),
NET_FIGHTSYNC(CheckTypeType.CHECK, NET, Permissions.NET_FLYINGFREQUENCY),
NET_FLYINGFREQUENCY(CheckTypeType.CHECK, NET, Permissions.NET_FLYINGFREQUENCY),
NET_KEEPALIVEFREQUENCY(CheckTypeType.CHECK, NET, Permissions.NET_KEEPALIVEFREQUENCY),
NET_PACKETFREQUENCY(CheckTypeType.CHECK, NET, Permissions.NET_PACKETFREQUENCY),
@@ -48,6 +48,8 @@ public class BlockPlaceConfig extends ACheckConfig {
public final ActionList noSwingActions;
public final ActionList reachActions;
public final ActionList scaffoldActions;
public final long speedInterval;
public final ActionList speedActions;
@@ -82,6 +84,8 @@ public class BlockPlaceConfig extends ACheckConfig {
noSwingActions = config.getOptimizedActionList(ConfPaths.BLOCKPLACE_NOSWING_ACTIONS, Permissions.BLOCKPLACE_NOSWING);
reachActions = config.getOptimizedActionList(ConfPaths.BLOCKPLACE_REACH_ACTIONS, Permissions.BLOCKPLACE_REACH);
scaffoldActions = config.getOptimizedActionList(ConfPaths.BLOCKPLACE_SCAFFOLD_ACTIONS, Permissions.BLOCKPLACE_REACH);
speedInterval = config.getLong(ConfPaths.BLOCKPLACE_SPEED_INTERVAL);
speedActions = config.getOptimizedActionList(ConfPaths.BLOCKPLACE_SPEED_ACTIONS, Permissions.BLOCKPLACE_SPEED);
@@ -29,6 +29,7 @@ public class BlockPlaceData extends ACheckData {
public double fastPlaceVL = 0;
public double noSwingVL = 0;
public double reachVL = 0;
public double scaffoldVL = 0;
public double speedVL = 0;
// AutoSign.
@@ -14,6 +14,9 @@
*/
package fr.neatmonster.nocheatplus.checks.blockplace;
import java.util.List;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -108,7 +111,10 @@ public class BlockPlaceListener extends CheckListener {
/** The reach check. */
private final Reach reach = addCheck(new Reach());
/** The speed check. */
/** The scaffold check. */
private final Scaffold Scaffold = addCheck(new Scaffold());
/** The speed check. */
private final Speed speed = addCheck(new Speed());
/** For temporary use: LocUtil.clone before passing deeply, call setWorld(null) after use. */
@@ -394,6 +400,31 @@ public class BlockPlaceListener extends CheckListener {
}
}
}
/**
* Listens for PlayerInteract events to check for their target block face vs their
* attempted block face. This is used for the scaffold check.
*/
@EventHandler(priority = EventPriority.MONITOR)
public void placeBlock(PlayerInteractEvent event) {
if (!Scaffold.isEnabled(event.getPlayer())) return;
Player player = event.getPlayer();
Block targetBlock = player.getTargetBlock((Set<Material>) null, 7);
if (event.getAction() != Action.RIGHT_CLICK_BLOCK || !event.isBlockInHand() || player.isFlying() && player.getAllowFlight() || targetBlock.isLiquid() || player.isSneaking()) return;
List<Block> lastTarget = player.getLastTwoTargetBlocks((Set<Material>) null, 7);
BlockFace blockFace = event.getBlockFace();
if (targetBlock.getY() != player.getLocation().subtract(0, 1, 0).getY()) return;
final IPlayerData pData = DataManager.getPlayerData(player);
final BlockPlaceData data = pData.getGenericInstance(BlockPlaceData.class);
if (Scaffold.check(player, targetBlock, lastTarget, blockFace, pData, data)) {
event.setCancelled(true);
}
}
private void checkBoatsAnywhere(final Player player, final PlayerInteractEvent event,
final BlockPlaceConfig cc, final IPlayerData pData) {
@@ -0,0 +1,34 @@
package fr.neatmonster.nocheatplus.checks.blockplace;
import java.util.List;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.players.IPlayerData;
public class Scaffold extends Check {
public Scaffold() {
super(CheckType.BLOCKPLACE_SCAFFOLD);
}
public boolean check(Player player, Block targetBlock, List<Block> lastTarget, BlockFace blockFace, final IPlayerData pData, final BlockPlaceData data) {
BlockFace face = null;
boolean cancel = false;
if (lastTarget.size() > 1) {
face = lastTarget.get(1).getFace(lastTarget.get(0));
}
if (blockFace != face) {
cancel = executeActions(player, data.scaffoldVL, 1D, pData.getGenericInstance(BlockPlaceConfig.class).scaffoldActions).willCancel();
data.scaffoldVL += 1D;
}
return cancel;
}
}
@@ -52,6 +52,8 @@ import fr.neatmonster.nocheatplus.checks.moving.player.UnusedVelocity;
import fr.neatmonster.nocheatplus.checks.moving.util.AuxMoving;
import fr.neatmonster.nocheatplus.checks.moving.util.MovingUtil;
import fr.neatmonster.nocheatplus.checks.moving.velocity.VelocityFlags;
import fr.neatmonster.nocheatplus.checks.net.NetConfig;
import fr.neatmonster.nocheatplus.checks.net.NetData;
import fr.neatmonster.nocheatplus.compat.Bridge1_9;
import fr.neatmonster.nocheatplus.compat.BridgeEnchant;
import fr.neatmonster.nocheatplus.compat.BridgeHealth;
@@ -101,6 +103,8 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
/** The no swing check. */
private final NoSwing noSwing = addCheck(new NoSwing());
private final FightSync FightSync = addCheck(new FightSync());
/** The reach check. */
private final Reach reach = addCheck(new Reach());
@@ -827,6 +831,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
*/
DataManager.getGenericInstance(event.getPlayer(),
FightData.class).noSwingArmSwung = true;
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
@@ -871,10 +876,9 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
final double health = Math.min(BridgeHealth.getHealth(player) + BridgeHealth.getAmount(event), BridgeHealth.getMaxHealth(player));
data.godModeHealth = Math.max(data.godModeHealth, health);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false)
public void entityInteract(PlayerInteractEntityEvent e) {
Entity entity = e.getRightClicked();
final Player player = e.getPlayer();
final FightData data = DataManager.getGenericInstance(player, FightData.class);
@@ -883,7 +887,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
data.exemptArmSwing = true;
} else {
data.exemptArmSwing = false;
}
}
}
@Override
@@ -905,5 +909,28 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
pData.getGenericInstance(FightData.class).attackPenalty.applyPenalty(penalty);
}
}
@EventHandler
public void entityDamage(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player)) return;
Player player = (Player) event.getDamager();
final IPlayerData pData = DataManager.getPlayerData(player);
final NetData data = pData.getGenericInstance(NetData.class);
final NetConfig cc = pData.getGenericInstance(NetConfig.class);
if (data.fightSyncCount >= cc.fightSyncResetCount) {
data.fightSyncCount = 0;
data.fightSyncReset = 0;
data.fightSyncVL *= 0.99D;
}
data.fightSyncReset += 1;
Location packet = data.lastHitLocation, eventLoc = player.getLocation();
if (FightSync.check(player, pData, data, packet, eventLoc, cc)) {
event.setCancelled(true);
}
}
}
@@ -0,0 +1,34 @@
package fr.neatmonster.nocheatplus.checks.fight;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.net.NetConfig;
import fr.neatmonster.nocheatplus.checks.net.NetData;
import fr.neatmonster.nocheatplus.players.IPlayerData;
public class FightSync extends Check {
public FightSync() {
super(CheckType.NET_FIGHTSYNC);
}
public boolean check(Player player, IPlayerData pData, NetData data, Location packet, Location eventLoc, final NetConfig cc) {
boolean cancel = false;
double diff = Math.abs(eventLoc.getYaw() - packet.getYaw()) + Math.abs(eventLoc.getPitch() - packet.getPitch());
if (diff != 0) {
if (data.fightSyncCount >= cc.fightSyncThreshold) {
data.fightSyncVL += diff * 5;
cancel = executeActions(player, data.fightSyncVL, Math.abs(diff * 5), pData.getGenericInstance(NetConfig.class).fightSyncActions).willCancel();
data.fightSyncCount = 0;
} else {
data.fightSyncCount += 1;
}
}
return cancel;
}
}
@@ -56,6 +56,10 @@ public class NetConfig extends ACheckConfig {
public final float attackFrequencyLimitSecondsFour;
public final float attackFrequencyLimitSecondsEight;
public final ActionList attackFrequencyActions;
public final int fightSyncResetCount;
public final int fightSyncThreshold;
public final ActionList fightSyncActions;
public final int flyingFrequencySeconds;
public final double flyingFrequencyPPS;
@@ -65,7 +69,7 @@ public class NetConfig extends ACheckConfig {
public final ActionList flyingFrequencyRedundantActions;
public final ActionList keepAliveFrequencyActions;
public final int keepAliveFrequencyStartupDelay;
public final int keepAliveFrequencyStartupDelay;
public final float packetFrequencyPacketsPerSecond;
public final int packetFrequencySeconds;
@@ -89,6 +93,10 @@ public class NetConfig extends ACheckConfig {
attackFrequencyLimitSecondsFour= config.getInt(ConfPaths.NET_ATTACKFREQUENCY_SECONDS_FOUR);
attackFrequencyLimitSecondsEight = config.getInt(ConfPaths.NET_ATTACKFREQUENCY_SECONDS_EIGHT);
attackFrequencyActions = config.getOptimizedActionList(ConfPaths.NET_ATTACKFREQUENCY_ACTIONS, Permissions.NET_ATTACKFREQUENCY);
fightSyncResetCount = config.getInt(ConfPaths.NET_FIGHTSYNC_RESETCOUNT);
fightSyncThreshold = config.getInt(ConfPaths.NET_FIGHTSYNC_THRESHOLD);
fightSyncActions = config.getOptimizedActionList(ConfPaths.NET_FIGHTSYNC_ACTIONS, Permissions.NET_ATTACKFREQUENCY);
flyingFrequencySeconds = Math.max(1, globalConfig.getInt(ConfPaths.NET_FLYINGFREQUENCY_SECONDS));
flyingFrequencyPPS = Math.max(1.0, globalConfig.getDouble(ConfPaths.NET_FLYINGFREQUENCY_PACKETSPERSECOND));
@@ -99,7 +107,7 @@ public class NetConfig extends ACheckConfig {
flyingFrequencyRedundantActions = config.getOptimizedActionList(ConfPaths.NET_FLYINGFREQUENCY_REDUNDANT_ACTIONS, Permissions.NET_FLYINGFREQUENCY);
keepAliveFrequencyActions = config.getOptimizedActionList(ConfPaths.NET_KEEPALIVEFREQUENCY_ACTIONS, Permissions.NET_KEEPALIVEFREQUENCY);
keepAliveFrequencyStartupDelay = config.getInt(ConfPaths.NET_KEEPALIVEFREQUENCY_SECONDS) * 1000;
keepAliveFrequencyStartupDelay = config.getInt(ConfPaths.NET_KEEPALIVEFREQUENCY_SECONDS) * 1000;
if (ServerVersion.compareMinecraftVersion("1.9") >= 0) {
// TODO: Disable packet frequency or activate 'pessimistically'.
@@ -18,6 +18,7 @@ import java.util.LinkedList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.access.ACheckData;
@@ -34,12 +35,18 @@ import fr.neatmonster.nocheatplus.utilities.ds.count.ActionFrequency;
*
*/
public class NetData extends ACheckData {
public double fightSyncVL;
// Reentrant lock.
private final Lock lock = new ReentrantLock();
// AttackFrequency
public ActionFrequency attackFrequencySeconds = new ActionFrequency(16, 500);
public Location lastHitLocation;
public int fightSyncReset;
public int fightSyncCount;
// FlyingFrequency
/** All flying packets, use System.currentTimeMillis() for time. */
@@ -279,6 +279,10 @@ public abstract class ConfPaths {
private static final String BLOCKPLACE_REACH = BLOCKPLACE + "reach.";
public static final String BLOCKPLACE_REACH_CHECK = BLOCKPLACE_REACH + SUB_ACTIVE;
public static final String BLOCKPLACE_REACH_ACTIONS = BLOCKPLACE_REACH + "actions";
private static final String BLOCKPLACE_SCAFFOLD = BLOCKPLACE + "scaffold.";
public static final String BLOCKPLACE_SCAFFOLD_CHECK = BLOCKPLACE_SCAFFOLD + SUB_ACTIVE;
public static final String BLOCKPLACE_SCAFFOLD_ACTIONS = BLOCKPLACE_SCAFFOLD + "actions";
private static final String BLOCKPLACE_SPEED = BLOCKPLACE + "speed.";
public static final String BLOCKPLACE_SPEED_CHECK = BLOCKPLACE_SPEED + SUB_ACTIVE;
@@ -738,6 +742,12 @@ public abstract class ConfPaths {
public static final String NET_ATTACKFREQUENCY_SECONDS_FOUR = NET_ATTACKFREQUENCY_SECONDS + "four";
public static final String NET_ATTACKFREQUENCY_SECONDS_EIGHT = NET_ATTACKFREQUENCY_SECONDS + "eight";
public static final String NET_ATTACKFREQUENCY_ACTIONS = NET_ATTACKFREQUENCY + "actions";
private static final String NET_FIGHTSYNC = NET + "fightsync.";
public static final String NET_FIGHTSYNC_ACTIVE = NET_FIGHTSYNC + SUB_ACTIVE;
public static final String NET_FIGHTSYNC_THRESHOLD = NET_FIGHTSYNC + "threshold";
public static final String NET_FIGHTSYNC_RESETCOUNT = NET_FIGHTSYNC + "reset_count";
public static final String NET_FIGHTSYNC_ACTIONS = NET_FIGHTSYNC + "actions";
private static final String NET_FLYINGFREQUENCY = NET + "flyingfrequency.";
public static final String NET_FLYINGFREQUENCY_ACTIVE = NET_FLYINGFREQUENCY + SUB_ACTIVE;
@@ -190,6 +190,9 @@ public class DefaultConfig extends ConfigFile {
set(ConfPaths.BLOCKPLACE_NOSWING_CHECK, "default", 785);
set(ConfPaths.BLOCKPLACE_NOSWING_EXCEPTIONS, Arrays.asList("LILY_PAD", Material.FLINT_AND_STEEL.toString()), 785);
set(ConfPaths.BLOCKPLACE_NOSWING_ACTIONS, "cancel vl>10 log:noswing:0:5:if cancel", 785);
set(ConfPaths.BLOCKPLACE_SCAFFOLD_CHECK, "default", 1154);
set(ConfPaths.BLOCKPLACE_SCAFFOLD_ACTIONS, "vl>15 log:scaffold:0:6:if", 1154);
set(ConfPaths.BLOCKPLACE_SPEED_CHECK, "default", 785);
set(ConfPaths.BLOCKPLACE_SPEED_INTERVAL, 45L, 785);
@@ -562,6 +565,11 @@ public class DefaultConfig extends ConfigFile {
set(ConfPaths.NET_ATTACKFREQUENCY_SECONDS_EIGHT, 100, 785);
set(ConfPaths.NET_ATTACKFREQUENCY_ACTIONS, "cancel vl>30 cancel log:attackfrequency:0:5:if vl>160 cancel log:attackfrequency:0:0:cif cmd:kickattackfrequency", 785);
// FightSync
set(ConfPaths.NET_FIGHTSYNC_ACTIVE, "default", 1154);
set(ConfPaths.NET_FIGHTSYNC_THRESHOLD, 5, 1154);
set(ConfPaths.NET_FIGHTSYNC_RESETCOUNT, 11, 1154);
set(ConfPaths.NET_FIGHTSYNC_ACTIONS, "vl<10 log:fightsync:0:5:if", 1154);
// FlyingFrequency
set(ConfPaths.NET_FLYINGFREQUENCY_ACTIVE, "default", 785);
set(ConfPaths.NET_FLYINGFREQUENCY_SECONDS, 5, 785);
@@ -621,6 +629,7 @@ public class DefaultConfig extends ConfigFile {
set(ConfPaths.STRINGS + ".fastheal", start + "regenerates health faster than usual (health [health])" + end, 785);
set(ConfPaths.STRINGS + ".fastplace", start + "tried to place too many blocks" + end, 785);
set(ConfPaths.STRINGS + ".fdirection", start + "tried to hit an entity out of line of sight" + end, 785);
set(ConfPaths.STRINGS + ".fightsync", start + "client and server fight data out of sync" + end, 1154);
set(ConfPaths.STRINGS + ".flyshort", start + "tried to move unexpectedly" + end, 785);
set(ConfPaths.STRINGS + ".flylong", start
+ "tried to move: [locationfrom] -> [locationto], d=[distance] ([tags])" + end, 1067);
@@ -666,6 +675,7 @@ public class DefaultConfig extends ConfigFile {
set(ConfPaths.STRINGS + ".noswing", start + "didn't swing arm" + end, 785);
set(ConfPaths.STRINGS + ".passable", start + "moved into a block ([blocktype]) from [locationfrom] to [locationto] distance [distance] " + end, 785);
set(ConfPaths.STRINGS + ".relog", start + "relogs too fast" + end, 785);
set(ConfPaths.STRINGS + ".scaffold", start + "placed against a block face they did not interact with" + end, 1154);
set(ConfPaths.STRINGS + ".tellchatnormal", tell + "&cNCP: &eToo many messages, slow down...", 785);
set(ConfPaths.STRINGS + ".tempkick1", "ncp tempkick [player] 1 Wait a minute!", 785);
set(ConfPaths.STRINGS + ".tempkick5", "ncp tempkick [player] 5 You have five minutes to think about it!", 785);