diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 82c143f27..371a7d787 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -3487,6 +3487,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade foreach($this->usedChunks as $index => $d){ Level::getXZ($index, $chunkX, $chunkZ); $this->level->unregisterChunkLoader($this, $chunkX, $chunkZ); + foreach($this->level->getChunkEntities($chunkX, $chunkZ) as $entity){ + $entity->despawnFrom($this, false); + } unset($this->usedChunks[$index]); } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 20de4cd3b..833b5b604 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -704,11 +704,13 @@ abstract class Entity extends Location implements Metadatable{ /** * @param Player $player */ - public function despawnFrom(Player $player){ + public function despawnFrom(Player $player, bool $send = true){ if(isset($this->hasSpawned[$player->getLoaderId()])){ - $pk = new RemoveEntityPacket(); - $pk->eid = $this->id; - $player->dataPacket($pk); + if($send){ + $pk = new RemoveEntityPacket(); + $pk->eid = $this->id; + $player->dataPacket($pk); + } unset($this->hasSpawned[$player->getLoaderId()]); } } diff --git a/src/pocketmine/entity/Human.php b/src/pocketmine/entity/Human.php index ac56f66ad..e10245ab0 100644 --- a/src/pocketmine/entity/Human.php +++ b/src/pocketmine/entity/Human.php @@ -503,17 +503,6 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{ } } - public function despawnFrom(Player $player){ - if(isset($this->hasSpawned[$player->getLoaderId()])){ - - $pk = new RemoveEntityPacket(); - $pk->eid = $this->getId(); - - $player->dataPacket($pk); - unset($this->hasSpawned[$player->getLoaderId()]); - } - } - public function close(){ if(!$this->closed){ if(!($this instanceof Player) or $this->loggedIn){ diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 88c45b98c..7afb386b4 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1522,10 +1522,10 @@ class Level implements ChunkManager, Metadatable{ return false; } - $breakTime = $target->getBreakTime($item); + $breakTime = ceil($target->getBreakTime($item) * 20); - if($player->isCreative() and $breakTime > 0.15){ - $breakTime = 0.15; + if($player->isCreative() and $breakTime > 3){ + $breakTime = 3; } if($player->hasEffect(Effect::HASTE)){ @@ -1536,13 +1536,13 @@ class Level implements ChunkManager, Metadatable{ $breakTime *= 1 + (0.3 * ($player->getEffect(Effect::MINING_FATIGUE)->getAmplifier() + 1)); } - $breakTime -= 0.05; //1 tick compensation + $breakTime -= 1; //1 tick compensation - if(!$ev->getInstaBreak() and ($player->lastBreak + $breakTime) > microtime(true)){ + if(!$ev->getInstaBreak() and ((ceil($player->lastBreak * 20)) + $breakTime) > ceil(microtime(true) * 20)){ return false; } - $player->lastBreak = microtime(true); + $player->lastBreak = PHP_INT_MAX; $drops = $ev->getDrops();