public function __construct($level, Compound $nbt = null) { if ($nbt === null) { $this->provider = $level; $this->nbt = new Compound("Level", []); return; } $this->nbt = $nbt; if (isset($this->nbt->Entities) and $this->nbt->Entities instanceof Enum) { $this->nbt->Entities->setTagType(NBT::TAG_Compound); } else { $this->nbt->Entities = new Enum("Entities", []); $this->nbt->Entities->setTagType(NBT::TAG_Compound); } if (isset($this->nbt->TileEntities) and $this->nbt->TileEntities instanceof Enum) { $this->nbt->TileEntities->setTagType(NBT::TAG_Compound); } else { $this->nbt->TileEntities = new Enum("TileEntities", []); $this->nbt->TileEntities->setTagType(NBT::TAG_Compound); } if (isset($this->nbt->TileTicks) and $this->nbt->TileTicks instanceof Enum) { $this->nbt->TileTicks->setTagType(NBT::TAG_Compound); } else { $this->nbt->TileTicks = new Enum("TileTicks", []); $this->nbt->TileTicks->setTagType(NBT::TAG_Compound); } if (!isset($this->nbt->BiomeColors) or !$this->nbt->BiomeColors instanceof IntArray) { $this->nbt->BiomeColors = new IntArray("BiomeColors", array_fill(0, 256, 0)); } if (!isset($this->nbt->HeightMap) or !$this->nbt->HeightMap instanceof IntArray) { $this->nbt->HeightMap = new IntArray("HeightMap", array_fill(0, 256, 0)); } if (!isset($this->nbt->Blocks)) { $this->nbt->Blocks = new ByteArray("Blocks", str_repeat("", 32768)); } if (!isset($this->nbt->Data)) { $this->nbt->Data = new ByteArray("Data", $half = str_repeat("", 16384)); $this->nbt->SkyLight = new ByteArray("SkyLight", $half); $this->nbt->BlockLight = new ByteArray("BlockLight", $half); } $extraData = []; if (!isset($this->nbt->ExtraData) or !$this->nbt->ExtraData instanceof ByteArray) { $this->nbt->ExtraData = new ByteArray("ExtraData", Binary::writeInt(0)); } else { $stream = new BinaryStream($this->nbt->ExtraData->getValue()); $count = $stream->getInt(); for ($i = 0; $i < $count; ++$i) { $key = $stream->getInt(); $extraData[$key] = $stream->getShort(false); } } parent::__construct($level, $this->nbt["xPos"], $this->nbt["zPos"], $this->nbt->Blocks->getValue(), $this->nbt->Data->getValue(), $this->nbt->SkyLight->getValue(), $this->nbt->BlockLight->getValue(), $this->nbt->BiomeColors->getValue(), $this->nbt->HeightMap->getValue(), $this->nbt->Entities->getValue(), $this->nbt->TileEntities->getValue()); unset($this->nbt->Blocks); unset($this->nbt->Data); unset($this->nbt->SkyLight); unset($this->nbt->BlockLight); unset($this->nbt->BiomeColors); unset($this->nbt->HeightMap); unset($this->nbt->Biomes); }
public function __construct($level, Compound $nbt = \null) { if ($nbt === \null) { $this->provider = $level; $this->nbt = new Compound("Level", []); return; } $this->nbt = $nbt; if (!isset($this->nbt->Entities) or !$this->nbt->Entities instanceof Enum) { $this->nbt->Entities = new Enum("Entities", []); $this->nbt->Entities->setTagType(NBT::TAG_Compound); } if (!isset($this->nbt->TileEntities) or !$this->nbt->TileEntities instanceof Enum) { $this->nbt->TileEntities = new Enum("TileEntities", []); $this->nbt->TileEntities->setTagType(NBT::TAG_Compound); } if (!isset($this->nbt->TileTicks) or !$this->nbt->TileTicks instanceof Enum) { $this->nbt->TileTicks = new Enum("TileTicks", []); $this->nbt->TileTicks->setTagType(NBT::TAG_Compound); } if (!isset($this->nbt->Sections) or !$this->nbt->Sections instanceof Enum) { $this->nbt->Sections = new Enum("Sections", []); $this->nbt->Sections->setTagType(NBT::TAG_Compound); } if (!isset($this->nbt->BiomeColors) or !$this->nbt->BiomeColors instanceof IntArray) { $this->nbt->BiomeColors = new IntArray("BiomeColors", \array_fill(0, 256, 0)); } if (!isset($this->nbt->HeightMap) or !$this->nbt->HeightMap instanceof IntArray) { $this->nbt->HeightMap = new IntArray("HeightMap", \array_fill(0, 256, 0)); } $sections = []; foreach ($this->nbt->Sections as $section) { if ($section instanceof Compound) { $y = (int) $section["Y"]; if ($y < 8) { $sections[$y] = new ChunkSection($section); } } } for ($y = 0; $y < 8; ++$y) { if (!isset($sections[$y])) { $sections[$y] = new EmptyChunkSection($y); } } $extraData = []; if (!isset($this->nbt->ExtraData) or !$this->nbt->ExtraData instanceof ByteArray) { $this->nbt->ExtraData = new ByteArray("ExtraData", \pack("N", 0)); } else { $stream = new BinaryStream($this->nbt->ExtraData->getValue()); $count = $stream->getInt(); for ($i = 0; $i < $count; ++$i) { $key = $stream->getInt(); $extraData[$key] = $stream->getShort(\false); } } parent::__construct($level, (int) $this->nbt["xPos"], (int) $this->nbt["zPos"], $sections, $this->nbt->BiomeColors->getValue(), $this->nbt->HeightMap->getValue(), $this->nbt->Entities->getValue(), $this->nbt->TileEntities->getValue(), $extraData); if (isset($this->nbt->Biomes)) { $this->checkOldBiomes($this->nbt->Biomes->getValue()); unset($this->nbt->Biomes); } unset($this->nbt->Sections, $this->nbt->ExtraData); }
/** * @param string $data * @param LevelProvider $provider * * @return Chunk */ public static function fromBinary($data, LevelProvider $provider = \null) { try { $chunkX = \unpack("V", \substr($data, 0, 4))[1]; $chunkZ = \unpack("V", \substr($data, 4, 4))[1]; $chunkData = \substr($data, 8, -1); $flags = \ord(\substr($data, -1)); $entities = \null; $tiles = \null; $extraData = []; if ($provider instanceof LevelDB) { $nbt = new NBT(NBT::LITTLE_ENDIAN); $entityData = $provider->getDatabase()->get(\substr($data, 0, 8) . LevelDB::ENTRY_ENTITIES); if ($entityData !== \false and \strlen($entityData) > 0) { $nbt->read($entityData, \true); $entities = $nbt->getData(); if (!\is_array($entities)) { $entities = [$entities]; } } $tileData = $provider->getDatabase()->get(\substr($data, 0, 8) . LevelDB::ENTRY_TILES); if ($tileData !== \false and \strlen($tileData) > 0) { $nbt->read($tileData, \true); $tiles = $nbt->getData(); if (!\is_array($tiles)) { $tiles = [$tiles]; } } $tileData = $provider->getDatabase()->get(\substr($data, 0, 8) . LevelDB::ENTRY_EXTRA_DATA); if ($tileData !== \false and \strlen($tileData) > 0) { $stream = new BinaryStream($tileData); $count = $stream->getInt(); for ($i = 0; $i < $count; ++$i) { $key = $stream->getInt(); $value = $stream->getShort(\false); $extraData[$key] = $value; } } } $chunk = new Chunk($provider instanceof LevelProvider ? $provider : LevelDB::class, $chunkX, $chunkZ, $chunkData, $entities, $tiles); if ($flags & 0x1) { $chunk->setGenerated(); } if ($flags & 0x2) { $chunk->setPopulated(); } if ($flags & 0x4) { $chunk->setLightPopulated(); } return $chunk; } catch (\Exception $e) { return \null; } }