如题,最好能直接给出代码BukkitAPI 版本是 1.16.4
Player#getLocation,然后沿y轴遍历查看是否是树叶(仍不能判断是否是树)
似乎没有更好的方法了
似乎没有更好的方法了
先沿y轴查看附近有没有木头
然后z轴往上叠加都是木头
然后在这个木头附近是不是有树叶
这是检测附近有没有树
然后z轴往上叠加都是木头
然后在这个木头附近是不是有树叶
这是检测附近有没有树
疾风暗影 发表于 2020-11-26 15:14
Player#getLocation,然后沿y轴遍历查看是否是树叶(仍不能判断是否是树)
似乎没有更好的方法了 ...
之前就是这么写的,但不太好
疾风暗影 发表于 2020-11-26 15:14
Player#getLocation,然后沿y轴遍历查看是否是树叶(仍不能判断是否是树)
似乎没有更好的方法了 ...
https://bukkit.windit.net/javado ... ctureGrowEvent.html
这个可以手动记录树
(甚至还包括了方块,https://bukkit.windit.net/javado ... nt.html#getBlocks--)
但是不能检测有没有被砍,配合你的更好
William_Shi 发表于 2020-11-26 19:02
https://bukkit.windit.net/javadoc/org/bukkit/event/world/StructureGrowEvent.html
这个可以手动记录 ...
- fun LivingEntity.isUnderTree(): Boolean {
- val maxDistanceBetweenLogAndLeaves = 5
- val treeLeavesNumberAtLeast = 6
- val treeLogUpTo = 1
- val treeLogDownTo = 1
- val highestBlock = world.getHighestBlockAt(location)
- if (highestBlock.y <= location.y) return false
- if (!highestBlock.type.name.endsWith("LEAVES")) return false
- val blockList = highestBlock.location.get3DBlocksAround(maxDistanceBetweenLogAndLeaves)
- if (!blockList.stream().anyMatch { it.type.name.endsWith("LOG") }) return false
- if (blockList.filter { it.type.name.endsWith("LEAVES") }.count() < treeLeavesNumberAtLeast) return false
- val log = blockList.find { it.type.name.endsWith("LOG") }!!
- if (!log.location.getYBlocks(treeLogUpTo, treeLogDownTo).all { it.type.name.endsWith("LEAVES") || it.type == log.type }) return false
- return true
- }
- fun Location.get3DBlocksAround(radius: Int): List<Block> {
- val blockList = mutableListOf<Block>()
- val max = clone().add(radius.toDouble(), radius.toDouble(), radius.toDouble())
- val min = clone().subtract(radius.toDouble(), radius.toDouble(), radius.toDouble())
- for (loop_x in min.x.toInt()..max.x.toInt()) {
- for (loop_y in min.y.toInt()..max.y.toInt()) {
- for (loop_z in min.z.toInt()..max.z.toInt()) {
- val block = Location(world, loop_x.toDouble(), loop_y.toDouble(), loop_z.toDouble()).block
- if (!block.type.name.endsWith("AIR"))
- blockList.add(block)
- }
- }
- }
- return blockList
- }
- fun Location.getYBlocks(up: Int, down: Int): List<Block> {
- val blockList = mutableListOf<Block>()
- for (loop_y in (-down)..up) {
- val block = clone().add(0.0, loop_y.toDouble(), 0.0).block
- if (!block.type.name.endsWith("AIR"))
- blockList.add(block)
- }
- return blockList
- }
根据坛友的代码简单写了一个,判断起来应该没问题。就是小树和密集的树判断可能有问题
贺兰兰 发表于 2020-11-27 13:31
根据坛友的代码简单写了一个,判断起来应该没问题。就是小树和密集的树判断可能有问题 ...
- if (org.bukkit.Tag.LEAVES.isTagged(location.getBlock().getType())) {
- Location add = location.clone().add(0, 1, 0);
- if (Tag.LOGS.isTagged(add.getBlock().getType())) {
- }
- }
海螺螺 发表于 2020-11-27 15:06
啊这,还可以这样
本帖最后由 贺兰兰 于 2020-11-28 13:36 编辑
这个Tag是用来判断Material是那个Tag,还是说放块是否是原生的方块呢
这个Tag是用来判断Material是那个Tag,还是说放块是否是原生的方块呢
本帖最后由 洞穴夜莺 于 2020-11-28 19:26 编辑
tag用来判断是否是某一类方块
LEAVES是原版的一个标签,含有各种类型的树叶方块
https://wiki.biligame.com/mc/%E6%A0%87%E7%AD%BE
下面是一段我自己写的Java代码,未经调试,仅供参考
复制代码
贺兰兰 发表于 2020-11-28 13:16
这个Tag是用来判断Material是那个Tag,还是说放块是否是原生的方块呢
tag用来判断是否是某一类方块
LEAVES是原版的一个标签,含有各种类型的树叶方块
https://wiki.biligame.com/mc/%E6%A0%87%E7%AD%BE
下面是一段我自己写的Java代码,未经调试,仅供参考
- private final int[][] directions = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
- private final int[][] logdirections = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {0, 0}};
- private boolean isUnderTree(Location loc, HashSet<Location> searched){
- if(searched.contains(loc))
- return false;
- searched.add(loc.clone());//添加标记,防止重复搜索
- if(loc.getY() >= 256)
- return false;
- BlockData current = loc.getBlock().getBlockData();
- if(Tag.LOGS.isTagged(current.getMaterial())){//如果头顶上是树干
- for(int[] offset : directions) {//找一找有没有树叶
- BlockData data = loc.clone().add(offset[0], offset[1], offset[2]).getBlock().getBlockData();
- if (data instanceof Leaves && !((Leaves) data).isPersistent())
- return true;
- }
- for(int[] offset : logdirections){//处理歪脖子树的情况
- if(isUnderTree(loc.add(offset[0], 1, offset[1]), searched))
- return true;
- }
- }else if(current instanceof Leaves && !((Leaves) current).isPersistent()){
- return true;
- }
- return false;
- }
- public boolean isUnderTree(Location loc){
- while(!loc.getBlock().getType().isSolid() && loc.getY() < 256)//稍微修改了一下,这个东西放这里好一点
- loc.add(0, 1, 0);
- return isUnderTree(loc, new HashSet<>());
- }
洞穴夜莺 发表于 2020-11-28 13:58
tag用来判断是否是某一类方块
LEAVES是原版的一个标签,含有各种类型的树叶方块
https://wiki.biligame.co ...
“//如果头顶上是树干”头顶上怎么会有树干



贺兰兰 发表于 2020-11-28 18:13
“//如果头顶上是树干”头顶上怎么会有树干 ...
金合欢木。可能斜向生长。