pocketmine\entity\Creature::ifjump PHP Метод

ifjump() публичный Метод

public ifjump ( Level $level, Vector3 $v3, boolean $hate = false, boolean $reason = false ) : boolean | float | string
$level pocketmine\level\Level
$v3 pocketmine\math\Vector3
$hate boolean
$reason boolean
Результат boolean | float | string 判断某坐标是否可以行走 并给出原因
    public function ifjump(Level $level, Vector3 $v3, $hate = false, $reason = false)
    {
        //boybook Y轴算法核心函数
        $x = floor($v3->getX());
        $y = floor($v3->getY());
        $z = floor($v3->getZ());
        //echo ($y." ");
        if ($this->whatBlock($level, new Vector3($x, $y, $z)) == "air") {
            //echo "前方空气 ";
            if ($this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "block" or new Vector3($x, $y - 1, $z) == "climb") {
                //方块
                //echo "考虑向前 ";
                if ($this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "block" or $this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "half" or $this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "high") {
                    //上方一格被堵住了
                    //echo "上方卡住 \n";
                    if ($reason) {
                        return 'up!';
                    }
                    return false;
                    //上方卡住
                } else {
                    //echo "GO向前走 \n";
                    if ($reason) {
                        return 'GO';
                    }
                    return $y;
                    //向前走
                }
            } elseif ($this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "water") {
                //水
                //echo "下水游泳 \n";
                if ($reason) {
                    return 'swim';
                }
                return $y - 1;
                //降低一格向前走(下水游泳)
            } elseif ($this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "half") {
                //半砖
                //echo "下到半砖 \n";
                if ($reason) {
                    return 'half';
                }
                return $y - 0.5;
                //向下跳0.5格
            } elseif ($this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "lava") {
                //岩浆
                //echo "前方岩浆 \n";
                if ($reason) {
                    return 'lava';
                }
                return false;
                //前方岩浆
            } elseif ($this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "air") {
                //空气
                //echo "考虑向下跳 ";
                if ($this->whatBlock($level, new Vector3($x, $y - 2, $z)) == "block") {
                    //echo "GO向下跳 \n";
                    if ($reason) {
                        return 'down';
                    }
                    return $y - 1;
                    //向下跳
                } else {
                    //前方悬崖
                    //echo "前方悬崖 \n";
                    if ($reason) {
                        return 'fall';
                    }
                    if ($hate === false) {
                        return false;
                    } else {
                        return $y - 1;
                        //向下跳
                    }
                }
            }
        } elseif ($this->whatBlock($level, new Vector3($x, $y, $z)) == "water") {
            //水
            //echo "正在水中";
            if ($this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "water") {
                //上面还是水
                //echo "向上游 \n";
                if ($reason) {
                    return 'inwater';
                }
                return $y + 1;
                //向上游,防溺水
            } elseif ($this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "block" or $this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "half") {
                //上方一格被堵住了
                if ($this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "block" or $this->whatBlock($level, new Vector3($x, $y - 1, $z)) == "half") {
                    //下方一格被也堵住了
                    //echo "上下都被卡住 \n";
                    if ($reason) {
                        return 'up!_down!';
                    }
                    return false;
                    //上下都被卡住
                } else {
                    //echo "向下游 \n";
                    if ($reason) {
                        return 'up!';
                    }
                    return $y - 1;
                    //向下游,防卡住
                }
            } else {
                //echo "游泳ing... \n";
                if ($reason) {
                    return 'swim...';
                }
                return $y;
                //向前游
            }
        } elseif ($this->whatBlock($level, new Vector3($x, $y, $z)) == "half") {
            //半砖
            //echo "前方半砖 \n";
            if ($this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "block" or $this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "half" or $this->whatBlock($level, new Vector3($x, $y + 1, $z)) == "high") {
                //上方一格被堵住了
                //return false;  //上方卡住
            } else {
                if ($reason) {
                    return 'halfGO';
                }
                return $y + 0.5;
            }
        } elseif ($this->whatBlock($level, new Vector3($x, $y, $z)) == "lava") {
            //岩浆
            //echo "前方岩浆 \n";
            if ($reason) {
                return 'lava';
            }
            return false;
        } elseif ($this->whatBlock($level, new Vector3($x, $y, $z)) == "high") {
            //1.5格高方块
            //echo "前方栅栏 \n";
            if ($reason) {
                return 'high';
            }
            return false;
        } elseif ($this->whatBlock($level, new Vector3($x, $y, $z)) == "climb") {
            //梯子
            //echo "前方梯子 \n";
            //return $y;
            if ($reason) {
                return 'climb';
            }
            if ($hate) {
                return $y + 0.7;
            } else {
                return $y + 0.5;
            }
        } else {
            //考虑向上
            //echo "考虑向上 ";
            if ($this->whatBlock($level, new Vector3($x, $y + 1, $z)) != "air") {
                //前方是面墙
                //echo "前方是墙 \n";
                if ($reason) {
                    return 'wall';
                }
                return false;
            } else {
                if ($this->whatBlock($level, new Vector3($x, $y + 2, $z)) == "block" or $this->whatBlock($level, new Vector3($x, $y + 2, $z)) == "half" or $this->whatBlock($level, new Vector3($x, $y + 2, $z)) == "high") {
                    //上方两格被堵住了
                    //echo "2格处被堵 \n";
                    if ($reason) {
                        return 'up2!';
                    }
                    return false;
                } else {
                    //echo "GO向上跳 \n";
                    if ($reason) {
                        return 'upGO';
                    }
                    return $y + 1;
                    //向上跳
                }
            }
        }
        return false;
    }