From eab7b934833f275b9f61d0682ea0438f11fb9922 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 4 Nov 2017 19:30:48 +0000 Subject: [PATCH] Fixed misuse of kill() and close() when deleting entities (#1490) --- src/pocketmine/Player.php | 4 ++-- src/pocketmine/entity/Entity.php | 18 ++++++++++++++++-- src/pocketmine/entity/FallingSand.php | 2 +- src/pocketmine/entity/Item.php | 2 +- src/pocketmine/entity/PrimedTNT.php | 2 +- src/pocketmine/entity/projectile/Arrow.php | 2 +- .../entity/projectile/Projectile.php | 2 +- src/pocketmine/entity/projectile/Throwable.php | 2 +- src/pocketmine/item/Bow.php | 4 ++-- src/pocketmine/item/ProjectileItem.php | 2 +- 10 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index f6334009d..947506f86 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1445,7 +1445,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->server->broadcastPacket($entity->getViewers(), $pk); $this->inventory->addItem(clone $item); - $entity->kill(); + $entity->flagForDespawn(); }elseif($entity instanceof DroppedItem){ if($entity->getPickupDelay() <= 0){ $item = $entity->getItem(); @@ -1475,7 +1475,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->server->broadcastPacket($entity->getViewers(), $pk); $this->inventory->addItem(clone $item); - $entity->kill(); + $entity->flagForDespawn(); } } } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index d7fa05195..f9631603f 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -471,6 +471,8 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ /** @var bool */ protected $closed = false; + /** @var bool */ + private $needsDespawn = false; /** @var TimingsHandler */ protected $timings; @@ -1280,15 +1282,20 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ $this->lastUpdate = $currentTick; + if($this->needsDespawn){ + $this->close(); + return false; + } + if(!$this->isAlive()){ $this->deadTicks += $tickDiff; if($this->deadTicks >= $this->maxDeadTicks){ $this->despawnFromAll(); if(!$this->isPlayer){ - $this->close(); + $this->flagForDespawn(); } } - return $this->deadTicks < $this->maxDeadTicks; + return true; } @@ -1930,6 +1937,13 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ } } + /** + * Flags the entity to be removed from the world on the next tick. + */ + public function flagForDespawn() : void{ + $this->needsDespawn = true; + } + /** * Returns whether the entity has been "closed". * @return bool diff --git a/src/pocketmine/entity/FallingSand.php b/src/pocketmine/entity/FallingSand.php index 99838f81d..2f72ee76c 100644 --- a/src/pocketmine/entity/FallingSand.php +++ b/src/pocketmine/entity/FallingSand.php @@ -104,7 +104,7 @@ class FallingSand extends Entity{ } if($this->onGround or $blockTarget !== null){ - $this->kill(); + $this->flagForDespawn(); $block = $this->level->getBlock($pos); if($block->getId() > 0 and $block->isTransparent() and !$block->canBeReplaced()){ diff --git a/src/pocketmine/entity/Item.php b/src/pocketmine/entity/Item.php index 9f772ba63..181fb922d 100644 --- a/src/pocketmine/entity/Item.php +++ b/src/pocketmine/entity/Item.php @@ -118,7 +118,7 @@ class Item extends Entity{ if($ev->isCancelled()){ $this->age = 0; }else{ - $this->kill(); + $this->flagForDespawn(); $hasUpdate = true; } } diff --git a/src/pocketmine/entity/PrimedTNT.php b/src/pocketmine/entity/PrimedTNT.php index 43ffc141d..71d1023ad 100644 --- a/src/pocketmine/entity/PrimedTNT.php +++ b/src/pocketmine/entity/PrimedTNT.php @@ -91,7 +91,7 @@ class PrimedTNT extends Entity implements Explosive{ $this->fuse -= $tickDiff; if($this->fuse <= 0){ - $this->kill(); + $this->flagForDespawn(); $this->explode(); } } diff --git a/src/pocketmine/entity/projectile/Arrow.php b/src/pocketmine/entity/projectile/Arrow.php index 80c262943..a9f806f82 100644 --- a/src/pocketmine/entity/projectile/Arrow.php +++ b/src/pocketmine/entity/projectile/Arrow.php @@ -72,7 +72,7 @@ class Arrow extends Projectile{ } if($this->age > 1200){ - $this->close(); + $this->flagForDespawn(); $hasUpdate = true; } diff --git a/src/pocketmine/entity/projectile/Projectile.php b/src/pocketmine/entity/projectile/Projectile.php index 0d9946777..70e1bf9a2 100644 --- a/src/pocketmine/entity/projectile/Projectile.php +++ b/src/pocketmine/entity/projectile/Projectile.php @@ -102,7 +102,7 @@ abstract class Projectile extends Entity{ } } - $this->close(); + $this->flagForDespawn(); } public function saveNBT(){ diff --git a/src/pocketmine/entity/projectile/Throwable.php b/src/pocketmine/entity/projectile/Throwable.php index 10738623c..039012077 100644 --- a/src/pocketmine/entity/projectile/Throwable.php +++ b/src/pocketmine/entity/projectile/Throwable.php @@ -40,7 +40,7 @@ abstract class Throwable extends Projectile{ if($this->age > 1200 or $this->isCollided){ //TODO: hit particles - $this->kill(); + $this->flagForDespawn(); $hasUpdate = true; } diff --git a/src/pocketmine/item/Bow.php b/src/pocketmine/item/Bow.php index e18d17846..aeb0e1b00 100644 --- a/src/pocketmine/item/Bow.php +++ b/src/pocketmine/item/Bow.php @@ -75,7 +75,7 @@ class Bow extends Tool{ $entity = $ev->getProjectile(); //This might have been changed by plugins if($ev->isCancelled()){ - $entity->kill(); + $entity->flagForDespawn(); $player->getInventory()->sendContents($player); }else{ $entity->setMotion($entity->getMotion()->multiply($ev->getForce())); @@ -87,7 +87,7 @@ class Bow extends Tool{ if($entity instanceof Projectile){ $player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($entity)); if($projectileEv->isCancelled()){ - $ev->getProjectile()->kill(); + $ev->getProjectile()->flagForDespawn(); }else{ $ev->getProjectile()->spawnToAll(); $player->level->addSound(new LaunchSound($player), $player->getViewers()); diff --git a/src/pocketmine/item/ProjectileItem.php b/src/pocketmine/item/ProjectileItem.php index 70c31140d..bc2385781 100644 --- a/src/pocketmine/item/ProjectileItem.php +++ b/src/pocketmine/item/ProjectileItem.php @@ -49,7 +49,7 @@ abstract class ProjectileItem extends Item{ if($projectile instanceof Projectile){ $player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($projectile)); if($projectileEv->isCancelled()){ - $projectile->kill(); + $projectile->flagForDespawn(); }else{ $projectile->spawnToAll(); $player->getLevel()->addSound(new LaunchSound($player), $player->getViewers());