diff --git a/src/entity/ExperienceManager.php b/src/entity/ExperienceManager.php index f79fdd95f..c91f9ffee 100644 --- a/src/entity/ExperienceManager.php +++ b/src/entity/ExperienceManager.php @@ -49,6 +49,9 @@ class ExperienceManager{ /** @var int */ private $totalXp = 0; + /** @var bool */ + private $canAttractXpOrbs = true; + /** @var int */ private $xpCooldown = 0; @@ -294,4 +297,12 @@ class ExperienceManager{ $this->xpCooldown = max(0, $this->xpCooldown - $tickDiff); } } + + public function canAttractXpOrbs() : bool{ + return $this->canAttractXpOrbs; + } + + public function setCanAttractXpOrbs(bool $v = true) : void{ + $this->canAttractXpOrbs = $v; + } } diff --git a/src/entity/object/ExperienceOrb.php b/src/entity/object/ExperienceOrb.php index 8011a6a47..ef26ffb0e 100644 --- a/src/entity/object/ExperienceOrb.php +++ b/src/entity/object/ExperienceOrb.php @@ -166,7 +166,7 @@ class ExperienceOrb extends Entity{ } $currentTarget = $this->getTargetPlayer(); - if($currentTarget !== null and (!$currentTarget->isAlive() or $currentTarget->location->distanceSquared($this->location) > self::MAX_TARGET_DISTANCE ** 2)){ + if($currentTarget !== null and (!$currentTarget->isAlive() or !$currentTarget->getXpManager()->canAttractXpOrbs() or $currentTarget->location->distanceSquared($this->location) > self::MAX_TARGET_DISTANCE ** 2)){ $currentTarget = null; } @@ -174,7 +174,7 @@ class ExperienceOrb extends Entity{ if($currentTarget === null){ $newTarget = $this->getWorld()->getNearestEntity($this->location, self::MAX_TARGET_DISTANCE, Human::class); - if($newTarget instanceof Human and !($newTarget instanceof Player and $newTarget->isSpectator())){ + if($newTarget instanceof Human and !($newTarget instanceof Player and $newTarget->isSpectator()) and $newTarget->getXpManager()->canAttractXpOrbs()){ $currentTarget = $newTarget; } }