From c7d58db7eb5d68b07622e3820c99a39a0978fea3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 8 Sep 2018 14:23:06 +0100 Subject: [PATCH] Cleanup Entity age handling, fixed arrows despawning too quickly after long flight --- src/pocketmine/entity/Entity.php | 3 --- .../entity/object/ExperienceOrb.php | 4 ++++ src/pocketmine/entity/object/ItemEntity.php | 15 ++++++------ src/pocketmine/entity/projectile/Arrow.php | 24 ++++++++++++++++--- .../entity/projectile/EnderPearl.php | 2 -- .../entity/projectile/ExperienceBottle.php | 2 -- .../entity/projectile/Projectile.php | 3 --- .../entity/projectile/SplashPotion.php | 2 -- .../entity/projectile/Throwable.php | 19 +++++---------- 9 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 125a766c9..8ff5fa994 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -408,8 +408,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ public $boundingBox; /** @var bool */ public $onGround; - /** @var int */ - protected $age = 0; /** @var float */ public $eyeHeight = null; @@ -1027,7 +1025,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ } } - $this->age += $tickDiff; $this->ticksLived += $tickDiff; return $hasUpdate; diff --git a/src/pocketmine/entity/object/ExperienceOrb.php b/src/pocketmine/entity/object/ExperienceOrb.php index 729f9509c..a9b2d643c 100644 --- a/src/pocketmine/entity/object/ExperienceOrb.php +++ b/src/pocketmine/entity/object/ExperienceOrb.php @@ -88,6 +88,9 @@ class ExperienceOrb extends Entity{ public $gravity = 0.04; public $drag = 0.02; + /** @var int */ + protected $age = 0; + /** * @var int * Ticker used for determining interval in which to look for new target players. @@ -159,6 +162,7 @@ class ExperienceOrb extends Entity{ public function entityBaseTick(int $tickDiff = 1) : bool{ $hasUpdate = parent::entityBaseTick($tickDiff); + $this->age += $tickDiff; if($this->age > 6000){ $this->flagForDespawn(); return true; diff --git a/src/pocketmine/entity/object/ItemEntity.php b/src/pocketmine/entity/object/ItemEntity.php index d8b136563..f41b73813 100644 --- a/src/pocketmine/entity/object/ItemEntity.php +++ b/src/pocketmine/entity/object/ItemEntity.php @@ -53,6 +53,9 @@ class ItemEntity extends Entity{ public $canCollide = false; + /** @var int */ + protected $age = 0; + protected function initEntity() : void{ parent::initEntity(); @@ -82,14 +85,13 @@ class ItemEntity extends Entity{ $hasUpdate = parent::entityBaseTick($tickDiff); - if(!$this->isFlaggedForDespawn()){ - if($this->pickupDelay > 0 and $this->pickupDelay < 32767){ //Infinite delay - $this->pickupDelay -= $tickDiff; - if($this->pickupDelay < 0){ - $this->pickupDelay = 0; - } + if(!$this->isFlaggedForDespawn() and $this->pickupDelay > -1 and $this->pickupDelay < 32767){ //Infinite delay + $this->pickupDelay -= $tickDiff; + if($this->pickupDelay < 0){ + $this->pickupDelay = 0; } + $this->age += $tickDiff; if($this->age > 6000){ $this->server->getPluginManager()->callEvent($ev = new ItemDespawnEvent($this)); if($ev->isCancelled()){ @@ -99,7 +101,6 @@ class ItemEntity extends Entity{ $hasUpdate = true; } } - } return $hasUpdate; diff --git a/src/pocketmine/entity/projectile/Arrow.php b/src/pocketmine/entity/projectile/Arrow.php index 9bfab053b..e97016021 100644 --- a/src/pocketmine/entity/projectile/Arrow.php +++ b/src/pocketmine/entity/projectile/Arrow.php @@ -48,11 +48,24 @@ class Arrow extends Projectile{ protected $damage = 2; + /** @var int */ + protected $collideTicks = 0; + public function __construct(Level $level, CompoundTag $nbt, ?Entity $shootingEntity = null, bool $critical = false){ parent::__construct($level, $nbt, $shootingEntity); $this->setCritical($critical); } + protected function initEntity() : void{ + parent::initEntity(); + $this->collideTicks = $this->namedtag->getShort("life", $this->collideTicks); + } + + public function saveNBT() : void{ + parent::saveNBT(); + $this->namedtag->setShort("life", $this->collideTicks); + } + public function isCritical() : bool{ return $this->getGenericFlag(self::DATA_FLAG_CRITICAL); } @@ -77,9 +90,14 @@ class Arrow extends Projectile{ $hasUpdate = parent::entityBaseTick($tickDiff); - if($this->age > 1200){ - $this->flagForDespawn(); - $hasUpdate = true; + if($this->isCollided){ + $this->collideTicks += $tickDiff; + if($this->collideTicks > 1200){ + $this->flagForDespawn(); + $hasUpdate = true; + } + }else{ + $this->collideTicks = 0; } return $hasUpdate; diff --git a/src/pocketmine/entity/projectile/EnderPearl.php b/src/pocketmine/entity/projectile/EnderPearl.php index d2df081e1..2bbdfab5e 100644 --- a/src/pocketmine/entity/projectile/EnderPearl.php +++ b/src/pocketmine/entity/projectile/EnderPearl.php @@ -66,7 +66,5 @@ class EnderPearl extends Throwable{ $owner->attack(new EntityDamageEvent($owner, EntityDamageEvent::CAUSE_FALL, 5)); } - - $this->flagForDespawn(); } } diff --git a/src/pocketmine/entity/projectile/ExperienceBottle.php b/src/pocketmine/entity/projectile/ExperienceBottle.php index 8e9b5f3cc..604932066 100644 --- a/src/pocketmine/entity/projectile/ExperienceBottle.php +++ b/src/pocketmine/entity/projectile/ExperienceBottle.php @@ -42,7 +42,5 @@ class ExperienceBottle extends Throwable{ $this->level->broadcastLevelSoundEvent($this, LevelSoundEventPacket::SOUND_GLASS); $this->level->dropExperience($this, mt_rand(3, 11)); - - $this->flagForDespawn(); } } diff --git a/src/pocketmine/entity/projectile/Projectile.php b/src/pocketmine/entity/projectile/Projectile.php index 7cd579690..0e3df40cb 100644 --- a/src/pocketmine/entity/projectile/Projectile.php +++ b/src/pocketmine/entity/projectile/Projectile.php @@ -73,7 +73,6 @@ abstract class Projectile extends Entity{ $this->setMaxHealth(1); $this->setHealth(1); - $this->age = $this->namedtag->getShort("Age", $this->age); do{ $blockHit = null; @@ -123,8 +122,6 @@ abstract class Projectile extends Entity{ public function saveNBT() : void{ parent::saveNBT(); - $this->namedtag->setShort("Age", $this->age); - if($this->blockHit !== null){ $this->namedtag->setInt("tileX", $this->blockHit->x); $this->namedtag->setInt("tileY", $this->blockHit->y); diff --git a/src/pocketmine/entity/projectile/SplashPotion.php b/src/pocketmine/entity/projectile/SplashPotion.php index 01b28cd62..a0cf330d1 100644 --- a/src/pocketmine/entity/projectile/SplashPotion.php +++ b/src/pocketmine/entity/projectile/SplashPotion.php @@ -124,8 +124,6 @@ class SplashPotion extends Throwable{ } } } - - $this->flagForDespawn(); } /** diff --git a/src/pocketmine/entity/projectile/Throwable.php b/src/pocketmine/entity/projectile/Throwable.php index 9eef34780..42086aae4 100644 --- a/src/pocketmine/entity/projectile/Throwable.php +++ b/src/pocketmine/entity/projectile/Throwable.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace pocketmine\entity\projectile; +use pocketmine\block\Block; +use pocketmine\math\RayTraceResult; + abstract class Throwable extends Projectile{ public $width = 0.25; @@ -31,18 +34,8 @@ abstract class Throwable extends Projectile{ protected $gravity = 0.03; protected $drag = 0.01; - public function entityBaseTick(int $tickDiff = 1) : bool{ - if($this->closed){ - return false; - } - - $hasUpdate = parent::entityBaseTick($tickDiff); - - if($this->age > 1200 or $this->isCollided){ - $this->flagForDespawn(); - $hasUpdate = true; - } - - return $hasUpdate; + protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{ + parent::onHitBlock($blockHit, $hitResult); + $this->flagForDespawn(); } }