Fix some coordinate errors

- Fixes WorldGuard weirdness
 - Fixes #860
This commit is contained in:
dordsor21 2021-01-18 15:37:14 +00:00
parent 798b4cdd4e
commit c218743fa8
No known key found for this signature in database
GPG Key ID: 1E53E88969FFCF0B
4 changed files with 33 additions and 14 deletions

View File

@ -4,7 +4,6 @@ import com.boydti.fawe.FaweCache;
import com.boydti.fawe.object.brush.visualization.VisualExtent; import com.boydti.fawe.object.brush.visualization.VisualExtent;
import com.boydti.fawe.object.mask.IdMask; import com.boydti.fawe.object.mask.IdMask;
import com.boydti.fawe.object.visitor.DFSRecursiveVisitor; import com.boydti.fawe.object.visitor.DFSRecursiveVisitor;
import com.boydti.fawe.util.MathMan;
import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.command.tool.brush.Brush;
@ -14,7 +13,6 @@ import com.sk89q.worldedit.function.mask.MaskIntersection;
import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.MathUtils;
import com.sk89q.worldedit.math.MutableVector3; import com.sk89q.worldedit.math.MutableVector3;
import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.interpolation.Node; import com.sk89q.worldedit.math.interpolation.Node;
@ -197,15 +195,15 @@ public class SplineBrush implements Brush, ResettableTool {
if (det_max == det_x) { if (det_max == det_x) {
double a = (xz * yz - xy * zz) / det_x; double a = (xz * yz - xy * zz) / det_x;
double b = (xy * yz - xz * yy) / det_x; double b = (xy * yz - xz * yy) / det_x;
dir = BlockVector3.at(1.0, (int) MathUtils.roundHalfUp(a), (int) MathUtils.roundHalfUp(b)); dir = BlockVector3.at(1.0, a, b);
} else if (det_max == det_y) { } else if (det_max == det_y) {
double a = (yz * xz - xy * zz) / det_y; double a = (yz * xz - xy * zz) / det_y;
double b = (xy * xz - yz * xx) / det_y; double b = (xy * xz - yz * xx) / det_y;
dir = BlockVector3.at((int) MathUtils.roundHalfUp(a), 1.0, (int) MathUtils.roundHalfUp(b)); dir = BlockVector3.at(a, 1.0, b);
} else { } else {
double a = (yz * xy - xz * yy) / det_z; double a = (yz * xy - xz * yy) / det_z;
double b = (xz * xy - yz * xx) / det_z; double b = (xz * xy - yz * xx) / det_z;
dir = BlockVector3.at((int) MathUtils.roundHalfUp(a), (int) MathUtils.roundHalfUp(b), 1.0); dir = BlockVector3.at(a, b, 1.0);
} }
return dir.normalize(); return dir.normalize();
} }

View File

@ -42,7 +42,7 @@ public class PositionTransformExtent extends ResettableExtent {
mutable.mutY(pos.getY() - min.getY()); mutable.mutY(pos.getY() - min.getY());
mutable.mutZ(pos.getZ() - min.getZ()); mutable.mutZ(pos.getZ() - min.getZ());
MutableVector3 tmp = new MutableVector3(transform.apply(mutable.toVector3())); MutableVector3 tmp = new MutableVector3(transform.apply(mutable.toVector3()));
return min.add(tmp.toBlockPoint()); return min.add(tmp.roundHalfUp().toBlockPoint());
} }
@Override @Override

View File

@ -83,16 +83,31 @@ public abstract class Vector3 {
return YzxOrderComparator.YZX_ORDER; return YzxOrderComparator.YZX_ORDER;
} }
/**
* Gets the x coordinate rounded, accounting for negative coordinates
*
* @return the x coordinate
*/
public int getBlockX() { public int getBlockX() {
return (int) MathUtils.roundHalfUp(getX()); return MathMan.roundInt(getX());
} }
/**
* Gets the y coordinate rounded, accounting for negative coordinates
*
* @return the y coordinate
*/
public int getBlockY() { public int getBlockY() {
return (int) MathUtils.roundHalfUp(getY()); return MathMan.roundInt(getY());
} }
/**
* Gets the z coordinate rounded, accounting for negative coordinates
*
* @return the z coordinate
*/
public int getBlockZ() { public int getBlockZ() {
return (int) MathUtils.roundHalfUp(getZ()); return MathMan.roundInt(getZ());
} }
public MutableVector3 setComponents(Vector3 other) { public MutableVector3 setComponents(Vector3 other) {
@ -487,6 +502,15 @@ public abstract class Vector3 {
return Vector3.at(Math.floor(getX() + 0.5), Math.floor(getY() + 0.5), Math.floor(getZ() + 0.5)); return Vector3.at(Math.floor(getX() + 0.5), Math.floor(getY() + 0.5), Math.floor(getZ() + 0.5));
} }
/**
* Rounds all components using {@link MathUtils#roundHalfUp(double)}
*
* @return a new vector
*/
public Vector3 roundHalfUp() {
return Vector3.at(MathUtils.roundHalfUp(getX()), MathUtils.roundHalfUp(getY()), MathUtils.roundHalfUp(getZ()));
}
/** /**
* Returns a vector with the absolute values of the components of * Returns a vector with the absolute values of the components of
* this vector. * this vector.
@ -595,8 +619,7 @@ public abstract class Vector3 {
* @return a new {@code BlockVector} * @return a new {@code BlockVector}
*/ */
public static BlockVector3 toBlockPoint(double x, double y, double z) { public static BlockVector3 toBlockPoint(double x, double y, double z) {
return BlockVector3.at(MathUtils.roundHalfUp(x), MathUtils.roundHalfUp(y), MathUtils.roundHalfUp(z)); return BlockVector3.at(x, y, z);
//return BlockVector3.at(x, y, z);
} }
/** /**

View File

@ -19,7 +19,6 @@
package com.sk89q.worldedit.util; package com.sk89q.worldedit.util;
import com.boydti.fawe.util.MathMan;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.Vector3;
@ -80,8 +79,7 @@ public enum Direction {
} }
Direction(Vector3 vector, int flags, int left, int right) { Direction(Vector3 vector, int flags, int left, int right) {
this.blockPoint = BlockVector3.at(MathMan.roundInt(Math.signum(vector.getX())), this.blockPoint = BlockVector3.at(Math.signum(vector.getX()), Math.signum(vector.getY()), Math.signum(vector.getZ()));
MathMan.roundInt(Math.signum(vector.getY())), MathMan.roundInt(Math.signum(vector.getZ())));
this.direction = vector.normalize(); this.direction = vector.normalize();
this.flags = flags; this.flags = flags;
this.left = left; this.left = left;