Check activity before using the BlockChangeTracker.

This commit is contained in:
asofold 2016-11-26 22:57:28 +01:00
parent d96abe9a3e
commit baf09380f7
3 changed files with 19 additions and 11 deletions

View File

@ -82,6 +82,7 @@ import fr.neatmonster.nocheatplus.compat.BridgeEnchant;
import fr.neatmonster.nocheatplus.compat.BridgeHealth;
import fr.neatmonster.nocheatplus.compat.BridgeMisc;
import fr.neatmonster.nocheatplus.compat.MCAccess;
import fr.neatmonster.nocheatplus.compat.blocks.BlockChangeTracker;
import fr.neatmonster.nocheatplus.components.data.IData;
import fr.neatmonster.nocheatplus.components.location.SimplePositionWithLook;
import fr.neatmonster.nocheatplus.components.modifier.IAttributeAccess;
@ -159,6 +160,8 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
private IGenericInstanceHandle<IAttributeAccess> attributeAccess = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstanceHandle(IAttributeAccess.class);
private final BlockChangeTracker blockChangeTracker;
/** Statistics / debugging counters. */
private final Counters counters = NCPAPIProvider.getNoCheatPlusAPI().getGenericInstance(Counters.class);
private final int idMoveHandled = counters.registerKey("event.player.move.handled");
@ -171,6 +174,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
super(CheckType.MOVING);
// Register vehicleChecks.
NCPAPIProvider.getNoCheatPlusAPI().addComponent(vehicleChecks);
blockChangeTracker = NCPAPIProvider.getNoCheatPlusAPI().getBlockChangeTracker();
}
/**
@ -505,7 +509,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
return true;
}
{
{ // TODO: Consider to remove ?
// Debugging statistics, rather light weight.
final boolean hasPos = !moveInfo.from.isSamePos(moveInfo.to);
final boolean hasLook = from.getYaw() != to.getYaw() || from.getPitch() != to.getPitch();
@ -668,13 +672,17 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
}
}
}
// TODO: More adaptive margin / method (bouunding boxes).
final boolean useBlockChangeTracker = cc.trackBlockMove && (cc.passableCheck || cc.survivalFlyCheck)
&& blockChangeTracker.hasActivity(from.getWorld().getUID(), pFrom, pTo, 3.0);
// Check passable first to prevent set-back override.
// TODO: Redesign to set set-backs later (queue + invalidate).
boolean mightSkipNoFall = false; // If to skip nofall check (mainly on violation of other checks).
if (newTo == null && cc.passableCheck && player.getGameMode() != BridgeMisc.GAME_MODE_SPECTATOR && !NCPExemptionManager.isExempted(player, CheckType.MOVING_PASSABLE) && !player.hasPermission(Permissions.MOVING_PASSABLE)) {
// Passable is checked first to get the original set-back locations from the other checks, if needed.
newTo = passable.check(player, pFrom, pTo, data, cc, tick);
newTo = passable.check(player, pFrom, pTo, data, cc, tick, useBlockChangeTracker);
if (newTo != null) {
// Check if to skip the nofall check.
mightSkipNoFall = true;
@ -697,7 +705,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
// Actual check.
if (newTo == null) {
// Only check if passable has not already set back.
newTo = survivalFly.check(player, pFrom, pTo, mightBeMultipleMoves, data, cc, tick, time);
newTo = survivalFly.check(player, pFrom, pTo, mightBeMultipleMoves, data, cc, tick, time, useBlockChangeTracker);
}
// Only check NoFall, if not already vetoed.
if (checkNf) {

View File

@ -73,17 +73,17 @@ public class Passable extends Check {
}
public Location check(final Player player, final PlayerLocation from, final PlayerLocation to,
final MovingData data, final MovingConfig cc, final int tick) {
final MovingData data, final MovingConfig cc, final int tick, final boolean useBlockChangeTracker) {
if (rt_legacy) {
return checkLegacy(player, from, to, data, cc);
}
else {
return checkActual(player, from, to, data, cc, tick);
return checkActual(player, from, to, data, cc, tick, useBlockChangeTracker);
}
}
private Location checkActual(final Player player, final PlayerLocation from, final PlayerLocation to,
final MovingData data, final MovingConfig cc, final int tick) {
final MovingData data, final MovingConfig cc, final int tick, final boolean useBlockChangeTracker) {
// TODO: Distinguish feet vs. box.
// Block distances (sum, max) for from-to (not for loc!).
@ -91,7 +91,7 @@ public class Passable extends Check {
// General condition check for using ray-tracing.
if (cc.passableRayTracingCheck && (!cc.passableRayTracingBlockChangeOnly || manhattan > 0)) {
final String newTag = checkRayTracing(player, from, to, manhattan, data, cc, tick);
final String newTag = checkRayTracing(player, from, to, manhattan, data, cc, tick, useBlockChangeTracker);
if (newTag != null) {
// Direct return.
return potentialViolation(player, from, to, manhattan, newTag, data, cc);
@ -111,12 +111,12 @@ public class Passable extends Check {
}
private String checkRayTracing(final Player player, final PlayerLocation from, final PlayerLocation to,
final int manhattan, final MovingData data, final MovingConfig cc, final int tick) {
final int manhattan, final MovingData data, final MovingConfig cc, final int tick, final boolean useBlockChangeTracker) {
String tags = null;
setNormalMargins(rayTracingActual, from);
rayTracingActual.set(from, to);
rayTracingActual.setIgnoreInitiallyColliding(true);
if (cc.trackBlockMove) { // TODO: Extra flag for 'any' block changes.
if (useBlockChangeTracker) { // TODO: Extra flag for 'any' block changes.
rayTracingActual.setBlockChangeTracker(blockTracker, data.blockChangeRef, tick, from.getWorld().getUID());
}
//rayTracing.setCutOppositeDirectionMargin(true);

View File

@ -115,7 +115,7 @@ public class SurvivalFly extends Check {
*/
public Location check(final Player player, final PlayerLocation from, final PlayerLocation to,
final boolean mightBeMultipleMoves, final MovingData data, final MovingConfig cc,
final int tick, final long now) {
final int tick, final long now, final boolean useBlockChangeTracker) {
tags.clear();
if (data.debug) {
justUsedWorkarounds.clear();
@ -423,7 +423,7 @@ public class SurvivalFly extends Check {
}
// Post-check recovery.
if (vDistanceAboveLimit > 0.0 && Math.abs(yDistance) <= 1.015 && cc.trackBlockMove) {
if (useBlockChangeTracker && vDistanceAboveLimit > 0.0 && Math.abs(yDistance) <= 1.015) {
// TODO: Better place for checking for moved blocks [redesign for intermediate result objects?].
// Vertical push/pull.
double[] blockMoveResult = getBlockMoveResult(yDistance, from, to, data);