diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 736a06f84..82f7d204d 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -2186,7 +2186,7 @@ class Server{ private function tickProcessor(){ while($this->isRunning){ $this->tick(); - usleep((int) max(1, ($this->nextTick - microtime(true)) * 1000000)); + usleep((int) max(1, ($this->nextTick - microtime(true)) * 1000000 - 2000)); } } @@ -2369,7 +2369,7 @@ class Server{ */ private function tick(){ $tickTime = microtime(true); - if($tickTime < $this->nextTick){ + if(($tickTime - $this->nextTick) < -0.025){ //Allow half a tick of diff return false; } diff --git a/src/pocketmine/event/HandlerList.php b/src/pocketmine/event/HandlerList.php index cc4d680fe..3d66a3461 100644 --- a/src/pocketmine/event/HandlerList.php +++ b/src/pocketmine/event/HandlerList.php @@ -151,7 +151,7 @@ class HandlerList{ * @return RegisteredListener[] */ public function getRegisteredListeners($plugin = null){ - if($plugin instanceof Plugin){ + if($plugin !== null){ $listeners = []; foreach($this->getRegisteredListeners(null) as $hash => $listener){ if($listener->getPlugin() === $plugin){ diff --git a/src/pocketmine/level/format/FullChunk.php b/src/pocketmine/level/format/FullChunk.php index 548d8235e..f1406bda9 100644 --- a/src/pocketmine/level/format/FullChunk.php +++ b/src/pocketmine/level/format/FullChunk.php @@ -176,6 +176,8 @@ interface FullChunk{ */ public function setHeightMap($x, $z, $value); + public function recalculateHeightMap(); + /** * @param int $x 0-15 * @param int $z 0-15 diff --git a/src/pocketmine/level/format/generic/BaseFullChunk.php b/src/pocketmine/level/format/generic/BaseFullChunk.php index 1dff0be2f..bcd0bdfbe 100644 --- a/src/pocketmine/level/format/generic/BaseFullChunk.php +++ b/src/pocketmine/level/format/generic/BaseFullChunk.php @@ -151,12 +151,6 @@ abstract class BaseFullChunk implements FullChunk{ $this->getProvider()->getLevel()->timings->syncChunkLoadTileEntitiesTimer->stopTiming(); - for($z = 0; $z < 16; ++$z){ - for($x = 0; $x < 16; ++$x){ - $this->setHeightMap($x, $z, $this->getHighestBlockAt($x, $z)); - } - } - $this->NBTentities = null; $this->NBTtiles = null; $this->hasChanged = false; @@ -228,10 +222,27 @@ abstract class BaseFullChunk implements FullChunk{ $this->heightMap[($z << 4) + $x] = $value; } - public function getHighestBlockAt($x, $z){ + public function recalculateHeightMap(){ + for($z = 0; $z < 16; ++$z){ + for($x = 0; $x < 16; ++$x){ + $this->setHeightMap($x, $z, $this->getHighestBlockAt($x, $z, false)); + } + } + } + + public function getHighestBlockAt($x, $z, $cache = true){ + if($cache){ + $h = $this->getHeightMap($x, $z); + + if($h !== 0 and $h !== 127){ + return $h; + } + } + $column = $this->getBlockIdColumn($x, $z); for($y = 127; $y >= 0; --$y){ if($column{$y} !== "\x00"){ + $this->setHeightMap($x, $z, $y); return $y; } } diff --git a/src/pocketmine/level/format/mcregion/RegionLoader.php b/src/pocketmine/level/format/mcregion/RegionLoader.php index 10a6eb008..80599ccaa 100644 --- a/src/pocketmine/level/format/mcregion/RegionLoader.php +++ b/src/pocketmine/level/format/mcregion/RegionLoader.php @@ -169,7 +169,7 @@ class RegionLoader{ $full = $half . $half; $nbt->Blocks = new ByteArray("Blocks", $full); $nbt->Data = new ByteArray("Data", $half); - $nbt->SkyLight = new ByteArray("SkyLight", $half); + $nbt->SkyLight = new ByteArray("SkyLight", str_repeat("\xff", 16384)); $nbt->BlockLight = new ByteArray("BlockLight", $half); $nbt->Entities = new Enum("Entities", []); diff --git a/src/pocketmine/level/generator/PopulationTask.php b/src/pocketmine/level/generator/PopulationTask.php index 825260790..a484f9862 100644 --- a/src/pocketmine/level/generator/PopulationTask.php +++ b/src/pocketmine/level/generator/PopulationTask.php @@ -106,6 +106,7 @@ class PopulationTask extends AsyncTask{ $generator->populateChunk($chunk->getX(), $chunk->getZ()); $chunk = $manager->getChunk($chunk->getX(), $chunk->getZ()); + $chunk->recalculateHeightMap(); $chunk->setPopulated(true); $this->chunk = $chunk->toFastBinary(); diff --git a/src/pocketmine/level/generator/normal/Normal.php b/src/pocketmine/level/generator/normal/Normal.php index b61f7f6d0..804d1d95d 100644 --- a/src/pocketmine/level/generator/normal/Normal.php +++ b/src/pocketmine/level/generator/normal/Normal.php @@ -251,7 +251,7 @@ class Normal extends Generator{ if($noiseValue >= 0){ $chunk->setBlockId($x, $y, $z, Block::STONE); - }else{ + }/*else{ if($y <= $this->waterHeight){ $chunk->setBlockId($x, $y, $z, Block::STILL_WATER); $lightValue = 15 - ($this->waterHeight - $y) * 2; @@ -261,7 +261,7 @@ class Normal extends Generator{ }else{ $chunk->setBlockSkyLight($x, $y, $z, 15); } - } + }*/ } } }