pocketmine\entity\XPOrb::onUpdate PHP Метод

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

public onUpdate ( $currentTick )
    public function onUpdate($currentTick)
    {
        if ($this->closed) {
            return false;
        }
        $tickDiff = $currentTick - $this->lastUpdate;
        $this->lastUpdate = $currentTick;
        $this->timings->startTiming();
        $hasUpdate = $this->entityBaseTick($tickDiff);
        $this->age++;
        if ($this->age > 1200) {
            $this->kill();
            $this->close();
            $hasUpdate = true;
        }
        $minDistance = PHP_INT_MAX;
        $target = null;
        foreach ($this->getViewers() as $p) {
            if (!$p->isSpectator() and $p->isAlive()) {
                if (($dist = $p->distance($this)) < $minDistance and $dist < $this->range) {
                    $target = $p;
                    $minDistance = $dist;
                }
            }
        }
        if ($target !== null) {
            $moveSpeed = 0.7;
            $motX = ($target->getX() - $this->x) / 8;
            $motY = ($target->getY() + $target->getEyeHeight() - $this->y) / 8;
            $motZ = ($target->getZ() - $this->z) / 8;
            $motSqrt = sqrt($motX * $motX + $motY * $motY + $motZ * $motZ);
            $motC = 1 - $motSqrt;
            if ($motC > 0) {
                $motC *= $motC;
                $this->motionX = $motX / $motSqrt * $motC * $moveSpeed;
                $this->motionY = $motY / $motSqrt * $motC * $moveSpeed;
                $this->motionZ = $motZ / $motSqrt * $motC * $moveSpeed;
            }
            $this->motionY -= $this->gravity;
            if ($this->checkObstruction($this->x, $this->y, $this->z)) {
                $hasUpdate = true;
            }
            if ($this->isInsideOfSolid()) {
                $this->setPosition($target);
            }
            if ($minDistance <= 1.3) {
                if ($this->getLevel()->getServer()->expEnabled and $target->canPickupXp()) {
                    $this->getLevel()->getServer()->getPluginManager()->callEvent($ev = new PlayerPickupExpOrbEvent($target, $this->getExperience()));
                    if (!$ev->isCancelled()) {
                        $this->kill();
                        $this->close();
                        if ($this->getExperience() > 0) {
                            $this->level->addSound(new ExpPickupSound($target, mt_rand(0, 1000)));
                            $target->addXp($this->getExperience());
                            $target->resetXpCooldown();
                        }
                    }
                }
            }
        }
        $this->move($this->motionX, $this->motionY, $this->motionZ);
        $this->updateMovement();
        $this->timings->stopTiming();
        return $hasUpdate or !$this->onGround or abs($this->motionX) > 1.0E-5 or abs($this->motionY) > 1.0E-5 or abs($this->motionZ) > 1.0E-5;
    }