From 7c5f37ce469816e204bfca70da92ce7f702fa8af Mon Sep 17 00:00:00 2001 From: asofold Date: Thu, 21 Mar 2013 11:22:42 +0100 Subject: [PATCH] Workaround for fences. --- .../utilities/BlockProperties.java | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/NCPCompat/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java b/NCPCompat/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java index cb281297..e8902db1 100644 --- a/NCPCompat/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java +++ b/NCPCompat/src/main/java/fr/neatmonster/nocheatplus/utilities/BlockProperties.java @@ -1358,18 +1358,10 @@ public class BlockProperties { if (Math.min(fy, fy + dY * dT) >= 0.875) return true; // 0.125 } else if (id == Material.IRON_FENCE.getId() || id == Material.THIN_GLASS.getId()){ - final double dFx = 0.5 - fx; - final double dFz = 0.5 - fz; - if (Math.abs(dFx) > 0.05 && Math.abs(dFz) > 0.05){ - // 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) > 0.05){ - if (dFx * dFx2 > 0.0 && dFz * dFz2 > 0.0){ - return true; - } - } - } + if (!collidesFence(fx, fz, dX, dZ, dT, 0.05)) return true; + } + else if (id == Material.FENCE.getId() || id == Material.NETHER_FENCE.getId()){ + if (!collidesFence(fx, fz, dX, dZ, dT, 0.425)) return true; } else if (id == Material.FENCE_GATE.getId()){ if ((access.getData(bx, by, bz) & 0x4)!= 0) return true; @@ -1399,6 +1391,32 @@ public class BlockProperties { return false; } + /** + * XZ-collision check for (bounds / pseudo-ray) with fence type blocks (fences, glass panes), margin configurable. + * @param fx + * @param fz + * @param dX + * @param dZ + * @param dT + * @param d Distance to the fence middle to keep (see code of isPassableworkaround for reference). + * @return + */ + 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){ + // 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 (dFx * dFx2 > 0.0 && dFz * dFz2 > 0.0){ + return false; + } + } + } + return true; + } + /** * Collision for x-z ray / bounds. Use this to check if a box is really outside. * @param fx