轻光233
如题,求dalao帮助

RainIFunS
最笨的办法: 用for循环一个一个判断

Hanssc
1.获取一条线上所有Location
  1. public List<Location> getLinePoints(Location start, Location end, int amount) {
  2.         List<Location> points = new ArrayList();
  3.         double k = start.getX();
  4.         double j = start.getY();
  5.         double n = start.getZ();
  6.         double l = end.getX() - k;
  7.         double h = end.getY() - j;
  8.         double w = end.getZ() - n;
  9.         double f1 = l / amount;
  10.         double f2 = h / amount;
  11.         double f3 = w / amount;
  12.         for (int i = 0; i < amount; i++) {
  13.             points.add(new Location(start.getWorld(), k + f1 * i, j + f2 * i, n + f3 * i));
  14.         }
  15.         return points;
  16.     }
复制代码

2.判断所有位置是否均为空气
  1. public boolean check(Location start, Location end, int amount) {
  2.         final List<Location> location = getLinePoints(start, end, amount);
  3.         for (Location l : location) {
  4.             if (l.getBlock().getType() != Material.AIR) {
  5.                 return false;
  6.             }
  7.         }
  8.         return true;
  9.     }
复制代码

hnOsmium0001
rayTrace, 对比结果坐标

davidmaamoaix
本帖最后由 davidmaamoaix 于 2019-2-14 16:19 编辑

不用遍历,直接RayTrace

davidmaamoaix
本帖最后由 davidmaamoaix 于 2019-2-14 18:11 编辑

RayTrace通俗来讲就是从一个点出发画一条线,并检测这条线是否碰到任何方块。比如楼主想判断方块A与方块B之间是否有方块:


判断的方式为从方块A出发向方块B画一条线,可以理解为从方块A向方块B射出一道光。假如方块A和方块B之间没有任何东西阻挡,那么这道光就会射到方块B上。
所以我们只用判断这道光是否射到了方块B上;假如射到了方块B上,则两个方块之间没有其他方块;假如没有射到了方块B上,则有其他方块


代码实现起来比较简单,如下:
  1. // 假如两点之间有方块则返回true。
  2. // 两点之间没有方块则返回false。
  3. public static boolean doesBlockExistsBetween(World world, BlockPos a, BlockPos b) {
  4.         
  5.         // 从方块A射出一道光。
  6.         RayTraceResult rayTraceResult = world.rayTraceBlocks(new Vec3d(a), new Vec3d(b));
  7.         
  8.         // 检测“光”是否被射到了方块B上。
  9.         boolean rayOnBlockB = rayTraceResult.getBlockPos().equals(b);
  10.         
  11.         // 返回(注意感叹号,返回的值为“光线射到方块B”的相反值)。
  12.         // 如果光被射到了方块B上(则两点之间没有方块)则返回false。
  13.         // 如果光没有被射到了方块B上(则两点之间有方块)则返回true。
  14.         return !rayOnBlockB;
  15. }
复制代码

RayTrace相对于直接遍历的优点有:
- 速度快(距离越大越明显)
- 精确度高
- 更灵活(稍微改下可以判断实体)
- 代码简洁

轻光233
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解答下上面的问题,谢谢了

麻花awa
轻光233 发表于 2019-7-1 15:19
时隔5个月之后再来回复
这里的World,BlockPos,Vec3d,RayTraceResult是否为nms包里的类
我并没有在nms ...

我猜他说的应该是在forge中的实现。
不过spigot中应该也可以实现。
相关链接:https://hub.spigotmc.org/javadoc ... function.Predicate-

(来自一个正在电脑前写作业的吃瓜群众的回复)

轻光233
hemp 发表于 2019-7-1 16:07
我猜他说的应该是在forge中的实现。
不过spigot中应该也可以实现。
相关链接:https://hub.spigotmc.org/j ...

写作业可还行2333
but,我用的是1.8的api
World里并没有rayTrace方法,RayTraceResult类也没有找到
还有什么其他的方法吗qwq

下一页 最后一页