getChunk($x, $z, false); if(!($chunk instanceof Chunk)){ throw new ChunkException("Invalid Chunk sent"); } $tiles = ""; if(count($chunk->getTiles()) > 0){ $nbt = new NBT(NBT::LITTLE_ENDIAN); $list = []; foreach($chunk->getTiles() as $tile){ if($tile instanceof Spawnable){ $list[] = $tile->getSpawnCompound(); } } $nbt->setData($list); $tiles = $nbt->write(); } $ordered = $chunk->getBlockIdArray() . $chunk->getBlockDataArray() . $chunk->getBlockSkyLightArray() . $chunk->getBlockLightArray() . pack("C*", ...$chunk->getHeightMapArray()) . pack("N*", ...$chunk->getBiomeColorArray()) . $tiles; $this->getLevel()->chunkRequestCallback($x, $z, $ordered, FullChunkDataPacket::ORDER_LAYERED); return null; } /** * @param $x * @param $z * * @return RegionLoader */ protected function getRegion($x, $z){ return isset($this->regions[$index = Level::chunkHash($x, $z)]) ? $this->regions[$index] : null; } /** * @param int $chunkX * @param int $chunkZ * @param bool $create * * @return Chunk */ public function getChunk($chunkX, $chunkZ, $create = false){ return parent::getChunk($chunkX, $chunkZ, $create); } public function setChunk($chunkX, $chunkZ, FullChunk $chunk){ if(!($chunk instanceof Chunk)){ throw new ChunkException("Invalid Chunk class"); } $chunk->setProvider($this); self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ); $this->loadRegion($regionX, $regionZ); $chunk->setX($chunkX); $chunk->setZ($chunkZ); $this->chunks[Level::chunkHash($chunkX, $chunkZ)] = $chunk; } public function getEmptyChunk($chunkX, $chunkZ){ return Chunk::getEmptyChunk($chunkX, $chunkZ, $this); } public static function createChunkSection($Y){ return new ChunkSection(new Compound("", [ "Y" => new Byte("Y", $Y), "Blocks" => new ByteArray("Blocks", str_repeat("\x00", 4096)), "Data" => new ByteArray("Data", str_repeat("\x00", 2048)), "SkyLight" => new ByteArray("SkyLight", str_repeat("\xff", 2048)), "BlockLight" => new ByteArray("BlockLight", str_repeat("\x00", 2048)) ])); } public function isChunkGenerated($chunkX, $chunkZ){ if(($region = $this->getRegion($chunkX >> 5, $chunkZ >> 5)) !== null){ return $region->chunkExists($chunkX - $region->getX() * 32, $chunkZ - $region->getZ() * 32) and $this->getChunk($chunkX - $region->getX() * 32, $chunkZ - $region->getZ() * 32, true)->isGenerated(); } return false; } protected function loadRegion($x, $z){ if(isset($this->regions[$index = Level::chunkHash($x, $z)])){ return true; } $this->regions[$index] = new RegionLoader($this, $x, $z); return true; } }