From 7a36d80384f819562ddfe5297d3917c1e51e449a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Mar 2017 13:30:53 +0000 Subject: [PATCH 1/4] Fixed broken block-break timer logic causing creative players to be unable to remove fire after breaking blocks This also causes some annoying issues with instabreak (false positives). Shoghi dude, this did _not_ fix those issues, only hid them and replaced them with different ones. --- src/pocketmine/level/Level.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index d68896812..6bdaed1a3 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1574,7 +1574,7 @@ class Level implements ChunkManager, Metadatable{ return false; } - $player->lastBreak = microtime(true); + $player->lastBreak = PHP_INT_MAX; $drops = $ev->getDrops(); From 1da870b29886a30116e011bb6835dd2ee68d20a6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Mar 2017 13:56:36 +0000 Subject: [PATCH 2/4] Measure block break times in ticks instead of floating-point real-time --- src/pocketmine/level/Level.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 6bdaed1a3..d8a456455 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1554,10 +1554,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::SWIFTNESS)){ @@ -1568,9 +1568,9 @@ 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; } From 217f66e18038504a4ca99a7f43a4ca3e99904b1b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Mar 2017 12:14:54 +0100 Subject: [PATCH 3/4] Removed redundant method override leftover from 0.15 --- src/pocketmine/entity/Human.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/pocketmine/entity/Human.php b/src/pocketmine/entity/Human.php index e5c86b4b7..cd0cffcc1 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){ From 2079e2fd88c62bc385e0c3821f337ea2d084c884 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 28 Mar 2017 12:23:49 +0100 Subject: [PATCH 4/4] Fixed entity visibility Player object memory leak, close #416 --- src/pocketmine/Player.php | 3 +++ src/pocketmine/entity/Entity.php | 10 ++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 85c4dc8fd..f2d20d329 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -3100,6 +3100,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 91f9443aa..618452bc3 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -708,11 +708,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()]); } }