bool checkForJumpPositions(Vector3 dir, out Vector3 out_minAngleDir) { Vec3Int jumpCoords = vxe.ToGrid(transform.position); bool canJump = false; float maxdotprod = float.MinValue; Vector3 minAngleDir = Vector3.zero; for (int i = -JUMP_RANGE; i <= JUMP_RANGE; i++) { for (int j = -JUMP_RANGE; j <= JUMP_RANGE; j++) { for (int k = MAX_JUMP_HEIGHT; k >= 1; k--) { Vec3Int vcoords = jumpCoords + new Vec3Int(i, k, j); Voxel vx = vxe.grid.getVoxel(vcoords); if (vx.isOccupied() && vxe.voxelHasSurface(vx, VF.VX_TOP_SHOWN)) { Vector3 wrldcoords = vxe.FromGridUnTrunc(vcoords.ToVec3() + new Vector3(0.5f, 1.0f, 0.5f)); Vector3 vdir = Vector3.ProjectOnPlane((wrldcoords - transform.position), Vector3.up).normalized; float dotprod = Vector3.Dot(dir, vdir); if (dotprod > 0) { canJump = true; if (dotprod > maxdotprod) { maxdotprod = dotprod; minAngleDir = vdir; jumpPosition = wrldcoords; } } } } } } out_minAngleDir = minAngleDir; return(canJump); }