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;
}