diff --git a/src/pocketmine/level/format/io/region/RegionGarbageMap.php b/src/pocketmine/level/format/io/region/RegionGarbageMap.php index 6202007c8..d07652933 100644 --- a/src/pocketmine/level/format/io/region/RegionGarbageMap.php +++ b/src/pocketmine/level/format/io/region/RegionGarbageMap.php @@ -69,11 +69,14 @@ final class RegionGarbageMap{ /** @var RegionLocationTableEntry|null $prevEntry */ $prevEntry = null; foreach($usedMap as $firstSector => $entry){ - $expectedStart = ($prevEntry !== null ? $prevEntry->getLastSector() + 1 : RegionLoader::FIRST_SECTOR); - $actualStart = $entry->getFirstSector(); - if($expectedStart < $actualStart){ + $prevEndPlusOne = ($prevEntry !== null ? $prevEntry->getLastSector() + 1 : RegionLoader::FIRST_SECTOR); + $currentStart = $entry->getFirstSector(); + if($prevEndPlusOne < $currentStart){ //found a gap in the table - $garbageMap[$expectedStart] = new RegionLocationTableEntry($expectedStart, $actualStart - $expectedStart, 0); + $garbageMap[$prevEndPlusOne] = new RegionLocationTableEntry($prevEndPlusOne, $currentStart - $prevEndPlusOne, 0); + }elseif($prevEndPlusOne > $currentStart){ + //current entry starts inside the previous. This would be a bug since RegionLoader should prevent this + throw new AssumptionFailedError("Overlapping entries detected"); } $prevEntry = $entry; }