From 4d7c953572752f7035f0e12422e759abc7c6f64e Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sun, 10 Aug 2014 13:09:34 +0200 Subject: [PATCH] Possible fix for 'Invalid Chunk given' crash --- src/pocketmine/level/format/anvil/RegionLoader.php | 13 ++++++++++--- .../level/format/mcregion/RegionLoader.php | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/pocketmine/level/format/anvil/RegionLoader.php b/src/pocketmine/level/format/anvil/RegionLoader.php index f1c93fc84..061b0da09 100644 --- a/src/pocketmine/level/format/anvil/RegionLoader.php +++ b/src/pocketmine/level/format/anvil/RegionLoader.php @@ -55,7 +55,7 @@ class RegionLoader extends \pocketmine\level\format\mcregion\RegionLoader{ } } - public function readChunk($x, $z, $generate = true){ + public function readChunk($x, $z, $generate = true, $forward = false){ $index = self::getChunkOffset($x, $z); if($index < 0 or $index >= 4096){ //Regenerate chunk due to corruption @@ -97,8 +97,15 @@ class RegionLoader extends \pocketmine\level\format\mcregion\RegionLoader{ } $chunk = Chunk::fromBinary(fread($this->filePointer, $length - 1), $this->levelProvider); - - return $chunk instanceof Chunk ? $chunk : false; + if($chunk instanceof Chunk){ + return $chunk; + }elseif($forward === false){ + trigger_error("Corrupted chunk detected", E_USER_WARNING); + $this->generateChunk($x, $z); + return $this->readChunk($x, $z, $generate, true); + }else{ + return null; + } } public function generateChunk($x, $z){ diff --git a/src/pocketmine/level/format/mcregion/RegionLoader.php b/src/pocketmine/level/format/mcregion/RegionLoader.php index 0dcb92e86..da1757ab9 100644 --- a/src/pocketmine/level/format/mcregion/RegionLoader.php +++ b/src/pocketmine/level/format/mcregion/RegionLoader.php @@ -79,7 +79,7 @@ class RegionLoader{ return !($this->locationTable[$index][0] === 0 or $this->locationTable[$index][1] === 0); } - public function readChunk($x, $z, $generate = true){ + public function readChunk($x, $z, $generate = true, $forward = false){ $index = self::getChunkOffset($x, $z); if($index < 0 or $index >= 4096){ //Regenerate chunk due to corruption @@ -121,8 +121,15 @@ class RegionLoader{ } $chunk = Chunk::fromBinary(fread($this->filePointer, $length - 1), $this->levelProvider); - - return $chunk instanceof Chunk ? $chunk : false; + if($chunk instanceof Chunk){ + return $chunk; + }elseif($forward === false){ + trigger_error("Corrupted chunk detected", E_USER_WARNING); + $this->generateChunk($x, $z); + return $this->readChunk($x, $z, $generate, true); + }else{ + return null; + } } public function chunkExists($x, $z){