Fixed misuse of kill() and close() when deleting entities (#1490)

This commit is contained in:
Dylan K. Taylor 2017-11-04 19:30:48 +00:00 committed by GitHub
parent e84ab8fec2
commit eab7b93483
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 27 additions and 13 deletions

View File

@ -1445,7 +1445,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$this->server->broadcastPacket($entity->getViewers(), $pk); $this->server->broadcastPacket($entity->getViewers(), $pk);
$this->inventory->addItem(clone $item); $this->inventory->addItem(clone $item);
$entity->kill(); $entity->flagForDespawn();
}elseif($entity instanceof DroppedItem){ }elseif($entity instanceof DroppedItem){
if($entity->getPickupDelay() <= 0){ if($entity->getPickupDelay() <= 0){
$item = $entity->getItem(); $item = $entity->getItem();
@ -1475,7 +1475,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$this->server->broadcastPacket($entity->getViewers(), $pk); $this->server->broadcastPacket($entity->getViewers(), $pk);
$this->inventory->addItem(clone $item); $this->inventory->addItem(clone $item);
$entity->kill(); $entity->flagForDespawn();
} }
} }
} }

View File

@ -471,6 +471,8 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
/** @var bool */ /** @var bool */
protected $closed = false; protected $closed = false;
/** @var bool */
private $needsDespawn = false;
/** @var TimingsHandler */ /** @var TimingsHandler */
protected $timings; protected $timings;
@ -1280,15 +1282,20 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
$this->lastUpdate = $currentTick; $this->lastUpdate = $currentTick;
if($this->needsDespawn){
$this->close();
return false;
}
if(!$this->isAlive()){ if(!$this->isAlive()){
$this->deadTicks += $tickDiff; $this->deadTicks += $tickDiff;
if($this->deadTicks >= $this->maxDeadTicks){ if($this->deadTicks >= $this->maxDeadTicks){
$this->despawnFromAll(); $this->despawnFromAll();
if(!$this->isPlayer){ 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". * Returns whether the entity has been "closed".
* @return bool * @return bool

View File

@ -104,7 +104,7 @@ class FallingSand extends Entity{
} }
if($this->onGround or $blockTarget !== null){ if($this->onGround or $blockTarget !== null){
$this->kill(); $this->flagForDespawn();
$block = $this->level->getBlock($pos); $block = $this->level->getBlock($pos);
if($block->getId() > 0 and $block->isTransparent() and !$block->canBeReplaced()){ if($block->getId() > 0 and $block->isTransparent() and !$block->canBeReplaced()){

View File

@ -118,7 +118,7 @@ class Item extends Entity{
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->age = 0; $this->age = 0;
}else{ }else{
$this->kill(); $this->flagForDespawn();
$hasUpdate = true; $hasUpdate = true;
} }
} }

View File

@ -91,7 +91,7 @@ class PrimedTNT extends Entity implements Explosive{
$this->fuse -= $tickDiff; $this->fuse -= $tickDiff;
if($this->fuse <= 0){ if($this->fuse <= 0){
$this->kill(); $this->flagForDespawn();
$this->explode(); $this->explode();
} }
} }

View File

@ -72,7 +72,7 @@ class Arrow extends Projectile{
} }
if($this->age > 1200){ if($this->age > 1200){
$this->close(); $this->flagForDespawn();
$hasUpdate = true; $hasUpdate = true;
} }

View File

@ -102,7 +102,7 @@ abstract class Projectile extends Entity{
} }
} }
$this->close(); $this->flagForDespawn();
} }
public function saveNBT(){ public function saveNBT(){

View File

@ -40,7 +40,7 @@ abstract class Throwable extends Projectile{
if($this->age > 1200 or $this->isCollided){ if($this->age > 1200 or $this->isCollided){
//TODO: hit particles //TODO: hit particles
$this->kill(); $this->flagForDespawn();
$hasUpdate = true; $hasUpdate = true;
} }

View File

@ -75,7 +75,7 @@ class Bow extends Tool{
$entity = $ev->getProjectile(); //This might have been changed by plugins $entity = $ev->getProjectile(); //This might have been changed by plugins
if($ev->isCancelled()){ if($ev->isCancelled()){
$entity->kill(); $entity->flagForDespawn();
$player->getInventory()->sendContents($player); $player->getInventory()->sendContents($player);
}else{ }else{
$entity->setMotion($entity->getMotion()->multiply($ev->getForce())); $entity->setMotion($entity->getMotion()->multiply($ev->getForce()));
@ -87,7 +87,7 @@ class Bow extends Tool{
if($entity instanceof Projectile){ if($entity instanceof Projectile){
$player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($entity)); $player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($entity));
if($projectileEv->isCancelled()){ if($projectileEv->isCancelled()){
$ev->getProjectile()->kill(); $ev->getProjectile()->flagForDespawn();
}else{ }else{
$ev->getProjectile()->spawnToAll(); $ev->getProjectile()->spawnToAll();
$player->level->addSound(new LaunchSound($player), $player->getViewers()); $player->level->addSound(new LaunchSound($player), $player->getViewers());

View File

@ -49,7 +49,7 @@ abstract class ProjectileItem extends Item{
if($projectile instanceof Projectile){ if($projectile instanceof Projectile){
$player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($projectile)); $player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($projectile));
if($projectileEv->isCancelled()){ if($projectileEv->isCancelled()){
$projectile->kill(); $projectile->flagForDespawn();
}else{ }else{
$projectile->spawnToAll(); $projectile->spawnToAll();
$player->getLevel()->addSound(new LaunchSound($player), $player->getViewers()); $player->getLevel()->addSound(new LaunchSound($player), $player->getViewers());