mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-09-27 14:13:11 +02:00
Check activity before using the BlockChangeTracker.
This commit is contained in:
parent
d96abe9a3e
commit
baf09380f7
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user