From 5d0d5d411dc048720dc9c62985610212346f9371 Mon Sep 17 00:00:00 2001 From: asofold Date: Fri, 10 Jun 2016 10:45:03 +0200 Subject: [PATCH] Meanwhile ... passable and ray-racing... and fixes. * Increase precision of debug logging. * Fix iteration conditions for the axes. * Fix margins for collidesFence (method + THICK_FENCE workaround parameter). --- .../checks/moving/player/Passable.java | 18 ++++++++++++----- .../utilities/BlockProperties.java | 6 +++--- .../utilities/collision/AxisTracing.java | 20 ++++++++++++------- .../collision/PassableAxisTracing.java | 1 + 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/player/Passable.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/player/Passable.java index 1ad5ee50..0a94a7fa 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/player/Passable.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/player/Passable.java @@ -36,7 +36,14 @@ import fr.neatmonster.nocheatplus.utilities.collision.PassableRayTracing; public class Passable extends Check { /** TESTING RATHER. */ - private static boolean preferAxisWise = false; + + // TODO: Make this configurable once a working set of settings has been found. + // TODO: Once made configurable... intense testing... and test cases. + private static boolean rt_legacy = true; + // TODO: rt_xzFactor = 1.0; // Problems: Doors, fences. + private static double rt_xzFactor = 0.98; + // TODO: Test bumping head into things. + private static double rt_heightFactor = 1.0; /** * Convenience for player moving, to keep a better overview. @@ -46,10 +53,11 @@ public class Passable extends Check { * @return */ public static boolean isPassable(Location from, Location to) { - return preferAxisWise ? BlockProperties.isPassableAxisWise(from, to) : BlockProperties.isPassable(from, to); + return rt_legacy ? BlockProperties.isPassable(from, to) : BlockProperties.isPassableAxisWise(from, to); } - private final ICollidePassable rayTracing = preferAxisWise ? new PassableAxisTracing() : new PassableRayTracing(); + // TODO: Store both and select on check (with config then). + private final ICollidePassable rayTracing = rt_legacy ? new PassableRayTracing() : new PassableAxisTracing(); public Passable() { super(CheckType.MOVING_PASSABLE); @@ -78,7 +86,7 @@ public class Passable extends Check { boolean toPassable = to.isPassable(); // General condition check for using ray-tracing. if (toPassable && cc.passableRayTracingCheck && (!cc.passableRayTracingBlockChangeOnly || manhattan > 0)) { - rayTracing.setMargins(from.getEyeHeight(), from.getWidth() / 2.0); // max from/to + resolution ? + rayTracing.setMargins(from.getEyeHeight() * rt_heightFactor, from.getWidth() / 2.0 * rt_xzFactor); // max from/to + resolution ? rayTracing.set(from, to); rayTracing.loop(); if (rayTracing.collides() || rayTracing.getStepsDone() >= rayTracing.getMaxSteps()) { @@ -271,7 +279,7 @@ public class Passable extends Check { debug(player, "Raytracing collision (" + tag + "): " + rayTracing.getCollidingAxis()); } else if (rayTracing.getStepsDone() >= rayTracing.getMaxSteps()) { - debug(player, "Raytracing collision (" + tag + "): max steps exceeded."); + debug(player, "Raytracing max steps exceeded (" + tag + "): "+ rayTracing.getCollidingAxis()); } } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java index 96aa64ce..1b697426 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java @@ -1886,7 +1886,7 @@ public class BlockProperties { return true; } else if ((flags & F_THICK_FENCE) != 0) { - if (!collidesFence(fx, fz, dX, dZ, dT, 0.425)) { + if (!collidesFence(fx, fz, dX, dZ, dT, 0.125)) { return true; } } @@ -1939,11 +1939,11 @@ public class BlockProperties { public static boolean collidesFence(final double fx, final double fz, final double dX, final double dZ, final double dT, final double d) { final double dFx = 0.5 - fx; final double dFz = 0.5 - fz; - if (Math.abs(dFx) > 0.05 && Math.abs(dFz) > d) { + if (Math.abs(dFx) > d && Math.abs(dFz) > d) { // Check moving between quadrants. final double dFx2 = 0.5 - (fx + dX * dT); final double dFz2 = 0.5 - (fz + dZ * dT); - if (Math.abs(dFx2) > 0.05 && Math.abs(dFz2) > d) { + if (Math.abs(dFx2) > d && Math.abs(dFz2) > d) { if (dFx * dFx2 > 0.0 && dFz * dFz2 > 0.0) { return false; } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/AxisTracing.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/AxisTracing.java index 6698b5cd..7f0e6539 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/AxisTracing.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/AxisTracing.java @@ -123,6 +123,7 @@ public abstract class AxisTracing implements ICollide, ISetMargins { double z = this.z0; for (int i = 0; i < 3; i++) { final Axis axis = axisOrder[i]; + collidesAxis = axis; // Ensure here, to get it on max steps. if (axis == Axis.Y_AXIS) { runAxisY(x, y, z); y = this.y1; @@ -142,7 +143,6 @@ public abstract class AxisTracing implements ICollide, ISetMargins { } // NONE = skip if (collides) { - collidesAxis = axis; break; } } @@ -161,24 +161,26 @@ public abstract class AxisTracing implements ICollide, ISetMargins { final double zMin = zIn - marginZneg; final double zMax = zIn + marginZpos; final double yStart, yEnd; + final int iEndY; if (yIn < this.y1) { increment = 1; yStart = yIn - marginYneg; yEnd = this.y1 + marginYpos; + iEndY = Location.locToBlock(yEnd) + 1; } else { increment = -1; yStart = yIn + marginYpos; yEnd = this.y1 - marginYneg; + iEndY = Location.locToBlock(yEnd) - 1; } final int iMinX = Location.locToBlock(xMin); final int iMaxX = Location.locToBlock(xMax); final int iMinZ = Location.locToBlock(zMin); final int iMaxZ = Location.locToBlock(zMax); final int iStartY = Location.locToBlock(yStart); - final int iEndY = Location.locToBlock(yEnd); axisStep = 0; - for (int y = iStartY; y <= iEndY; y += increment) { + for (int y = iStartY; y != iEndY; y += increment) { ++step; ++axisStep; if (step > maxSteps) { @@ -210,24 +212,26 @@ public abstract class AxisTracing implements ICollide, ISetMargins { final double zMin = zIn - marginZneg; final double zMax = zIn + marginZpos; final double xStart, xEnd; + final int iEndX; if (xIn < this.x1) { increment = 1; xStart = xIn - marginXneg; xEnd = this.x1 + marginXpos; + iEndX = Location.locToBlock(xEnd) + 1; } else { increment = -1; xStart = xIn + marginXpos; xEnd = this.x1 - marginXneg; + iEndX = Location.locToBlock(xEnd) - 1; } final int iMinY = Location.locToBlock(yMin); final int iMaxY = Location.locToBlock(yMax); final int iMinZ = Location.locToBlock(zMin); final int iMaxZ = Location.locToBlock(zMax); final int iStartX = Location.locToBlock(xStart); - final int iEndX = Location.locToBlock(xEnd); axisStep = 0; - for (int x = iStartX; x <= iEndX; x += increment) { + for (int x = iStartX; x != iEndX; x += increment) { ++step; ++axisStep; if (step > maxSteps) { @@ -259,24 +263,26 @@ public abstract class AxisTracing implements ICollide, ISetMargins { final double xMin = xIn - marginXneg; final double xMax = xIn + marginXpos; final double zStart, zEnd; + final int iEndZ; if (zIn < this.z1) { increment = 1; zStart = zIn - marginZneg; zEnd = this.z1 + marginZpos; + iEndZ = Location.locToBlock(zEnd + 1); } else { increment = -1; zStart = zIn + marginZpos; zEnd = this.z1 - marginZneg; + iEndZ = Location.locToBlock(zEnd - 1); } final int iMinY = Location.locToBlock(yMin); final int iMaxY = Location.locToBlock(yMax); final int iMinX = Location.locToBlock(xMin); final int iMaxX = Location.locToBlock(xMax); final int iStartZ = Location.locToBlock(zStart); - final int iEndZ = Location.locToBlock(zEnd); axisStep = 0; - for (int z = iStartZ; z <= iEndZ; z += increment) { + for (int z = iStartZ; z != iEndZ; z += increment) { ++step; ++axisStep; if (step > maxSteps) { diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/PassableAxisTracing.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/PassableAxisTracing.java index 83179118..beada661 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/PassableAxisTracing.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/collision/PassableAxisTracing.java @@ -10,6 +10,7 @@ public class PassableAxisTracing extends AxisTracing implements ICollidePassable private boolean ignoreFirst = false; + // TODO: Might need another option for margins (option to skip margin for the axis-start point, or alter ignoreFirst behavior). // TODO: Consider an iteration margin as well (0.5 below for fences). public BlockCache getBlockCache() {