public function connect(Rail $rail, $force = false)
{
if (!$force) {
$connected = $this->canConnect($rail);
if (!is_array($connected)) {
return false;
}
/** @var Vector3 [] $connected */
$connected[] = $rail;
switch (count($connected)) {
case 1:
$v3 = $connected[0]->subtract($this);
$this->meta = $v3->y != 1 ? $v3->x == 0 ? 0 : 1 : ($v3->z == 0 ? $v3->x / -2 + 2.5 : $v3->z / 2 + 4.5);
break;
case 2:
$subtract = [];
foreach ($connected as $key => $value) {
$subtract[$key] = $value->subtract($this);
}
if (abs($subtract[0]->x) == abs($subtract[1]->z) and abs($subtract[1]->x) == abs($subtract[0]->z)) {
$v3 = $connected[0]->subtract($this)->add($connected[1]->subtract($this));
$this->meta = $v3->x == 1 ? $v3->z == 1 ? 6 : 9 : ($v3->z == 1 ? 7 : 8);
} elseif ($subtract[0]->y == 1 or $subtract[1]->y == 1) {
$v3 = $subtract[0]->y == 1 ? $subtract[0] : $subtract[1];
$this->meta = $v3->x == 0 ? $v3->x == -1 ? 4 : 5 : ($v3->x == 1 ? 2 : 3);
} else {
$this->meta = $subtract[0]->x == 0 ? 0 : 1;
}
break;
default:
break;
}
}
$this->level->setBlock($this, Block::get($this->id, $this->meta), true, true);
return true;
}