mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-22 16:51:42 +00:00
Fixed misuse of kill() and close() when deleting entities (#1490)
This commit is contained in:
parent
e84ab8fec2
commit
eab7b93483
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()){
|
||||
|
@ -118,7 +118,7 @@ class Item extends Entity{
|
||||
if($ev->isCancelled()){
|
||||
$this->age = 0;
|
||||
}else{
|
||||
$this->kill();
|
||||
$this->flagForDespawn();
|
||||
$hasUpdate = true;
|
||||
}
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ class PrimedTNT extends Entity implements Explosive{
|
||||
$this->fuse -= $tickDiff;
|
||||
|
||||
if($this->fuse <= 0){
|
||||
$this->kill();
|
||||
$this->flagForDespawn();
|
||||
$this->explode();
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ class Arrow extends Projectile{
|
||||
}
|
||||
|
||||
if($this->age > 1200){
|
||||
$this->close();
|
||||
$this->flagForDespawn();
|
||||
$hasUpdate = true;
|
||||
}
|
||||
|
||||
|
@ -102,7 +102,7 @@ abstract class Projectile extends Entity{
|
||||
}
|
||||
}
|
||||
|
||||
$this->close();
|
||||
$this->flagForDespawn();
|
||||
}
|
||||
|
||||
public function saveNBT(){
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user