如题,求dalao帮助
最笨的办法: 用for循环一个一个判断
1.获取一条线上所有Location
复制代码
2.判断所有位置是否均为空气
复制代码
- public List<Location> getLinePoints(Location start, Location end, int amount) {
- List<Location> points = new ArrayList();
- double k = start.getX();
- double j = start.getY();
- double n = start.getZ();
- double l = end.getX() - k;
- double h = end.getY() - j;
- double w = end.getZ() - n;
- double f1 = l / amount;
- double f2 = h / amount;
- double f3 = w / amount;
- for (int i = 0; i < amount; i++) {
- points.add(new Location(start.getWorld(), k + f1 * i, j + f2 * i, n + f3 * i));
- }
- return points;
- }
2.判断所有位置是否均为空气
- public boolean check(Location start, Location end, int amount) {
- final List<Location> location = getLinePoints(start, end, amount);
- for (Location l : location) {
- if (l.getBlock().getType() != Material.AIR) {
- return false;
- }
- }
- return true;
- }
rayTrace, 对比结果坐标
本帖最后由 davidmaamoaix 于 2019-2-14 16:19 编辑
不用遍历,直接RayTrace
不用遍历,直接RayTrace
本帖最后由 davidmaamoaix 于 2019-2-14 18:11 编辑
RayTrace通俗来讲就是从一个点出发画一条线,并检测这条线是否碰到任何方块。比如楼主想判断方块A与方块B之间是否有方块:
复制代码
- 更灵活(稍微改下可以判断实体)
- 代码简洁
RayTrace通俗来讲就是从一个点出发画一条线,并检测这条线是否碰到任何方块。比如楼主想判断方块A与方块B之间是否有方块:
判断的方式为从方块A出发向方块B画一条线,可以理解为从方块A向方块B射出一道光。假如方块A和方块B之间没有任何东西阻挡,那么这道光就会射到方块B上。
所以我们只用判断这道光是否射到了方块B上;假如射到了方块B上,则两个方块之间没有其他方块;假如没有射到了方块B上,则有其他方块。
代码实现起来比较简单,如下:
- // 假如两点之间有方块则返回true。
- // 两点之间没有方块则返回false。
- public static boolean doesBlockExistsBetween(World world, BlockPos a, BlockPos b) {
-
- // 从方块A射出一道光。
- RayTraceResult rayTraceResult = world.rayTraceBlocks(new Vec3d(a), new Vec3d(b));
-
- // 检测“光”是否被射到了方块B上。
- boolean rayOnBlockB = rayTraceResult.getBlockPos().equals(b);
-
- // 返回(注意感叹号,返回的值为“光线射到方块B”的相反值)。
- // 如果光被射到了方块B上(则两点之间没有方块)则返回false。
- // 如果光没有被射到了方块B上(则两点之间有方块)则返回true。
- return !rayOnBlockB;
- }
RayTrace相对于直接遍历的优点有:
- 速度快(距离越大越明显)
- 精确度高- 更灵活(稍微改下可以判断实体)
- 代码简洁
davidmaamoaix 发表于 2019-2-14 17:50
RayTrace通俗来讲就是从一个点出发画一条线,并检测这条线是否碰到任何方块。比如楼主想判断方块A与方块B之 ...
时隔5个月之后再来回复
这里的World,BlockPos,Vec3d,RayTraceResult是否为nms包里的类
我并没有在nms包和bukkit api里找到RayTraceResult类
而且World里只有rayTrace方法,并且返回值是一个类型为MovingObjectPosition的对象
并且里面除了Object类继承下来的方法之外就只有a()方法,返回值永远和参数里的a一模一样
本人用的spigot-1.8作为api,请dalao解答下上面的问题,谢谢了