mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-05 09:26:06 +00:00
Updated PocketMine-NBT dependency
This commit is contained in:
@ -43,14 +43,14 @@ abstract class BaseLevelProvider implements LevelProvider{
|
||||
mkdir($this->path, 0777, true);
|
||||
}
|
||||
$nbt = new BigEndianNBTStream();
|
||||
$nbt->readCompressed(file_get_contents($this->getPath() . "level.dat"));
|
||||
$levelData = $nbt->getData()->getCompoundTag("Data");
|
||||
if($levelData !== null){
|
||||
$this->levelData = $levelData;
|
||||
}else{
|
||||
$levelData = $nbt->readCompressed(file_get_contents($this->getPath() . "level.dat"));
|
||||
|
||||
if(!($levelData instanceof CompoundTag) or !$levelData->hasTag("Data", CompoundTag::class)){
|
||||
throw new LevelException("Invalid level.dat");
|
||||
}
|
||||
|
||||
$this->levelData = $levelData->getCompoundTag("Data");
|
||||
|
||||
if(!$this->levelData->hasTag("generatorName", StringTag::class)){
|
||||
$this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT"), true);
|
||||
}
|
||||
@ -107,10 +107,9 @@ abstract class BaseLevelProvider implements LevelProvider{
|
||||
|
||||
public function saveLevelData(){
|
||||
$nbt = new BigEndianNBTStream();
|
||||
$nbt->setData(new CompoundTag("", [
|
||||
$buffer = $nbt->writeCompressed(new CompoundTag("", [
|
||||
$this->levelData
|
||||
]));
|
||||
$buffer = $nbt->writeCompressed();
|
||||
file_put_contents($this->getPath() . "level.dat", $buffer);
|
||||
}
|
||||
|
||||
|
@ -95,8 +95,7 @@ class LevelDB extends BaseLevelProvider{
|
||||
mkdir($this->path, 0777, true);
|
||||
}
|
||||
$nbt = new LittleEndianNBTStream();
|
||||
$nbt->read(substr(file_get_contents($this->getPath() . "level.dat"), 8));
|
||||
$levelData = $nbt->getData();
|
||||
$levelData = $nbt->read(substr(file_get_contents($this->getPath() . "level.dat"), 8));
|
||||
if($levelData instanceof CompoundTag){
|
||||
$this->levelData = $levelData;
|
||||
}else{
|
||||
@ -210,8 +209,7 @@ class LevelDB extends BaseLevelProvider{
|
||||
]);
|
||||
|
||||
$nbt = new LittleEndianNBTStream();
|
||||
$nbt->setData($levelData);
|
||||
$buffer = $nbt->write();
|
||||
$buffer = $nbt->write($levelData);
|
||||
file_put_contents($path . "level.dat", Binary::writeLInt(self::CURRENT_STORAGE_VERSION) . Binary::writeLInt(strlen($buffer)) . $buffer);
|
||||
|
||||
|
||||
@ -240,8 +238,7 @@ class LevelDB extends BaseLevelProvider{
|
||||
$this->levelData->setInt("StorageVersion", self::CURRENT_STORAGE_VERSION);
|
||||
|
||||
$nbt = new LittleEndianNBTStream();
|
||||
$nbt->setData($this->levelData);
|
||||
$buffer = $nbt->write();
|
||||
$buffer = $nbt->write($this->levelData);
|
||||
file_put_contents($this->getPath() . "level.dat", Binary::writeLInt(self::CURRENT_STORAGE_VERSION) . Binary::writeLInt(strlen($buffer)) . $buffer);
|
||||
}
|
||||
|
||||
@ -371,8 +368,7 @@ class LevelDB extends BaseLevelProvider{
|
||||
/** @var CompoundTag[] $entities */
|
||||
$entities = [];
|
||||
if(($entityData = $this->db->get($index . self::TAG_ENTITY)) !== false and strlen($entityData) > 0){
|
||||
$nbt->read($entityData, true);
|
||||
$entities = $nbt->getData();
|
||||
$entities = $nbt->read($entityData, true);
|
||||
if(!is_array($entities)){
|
||||
$entities = [$entities];
|
||||
}
|
||||
@ -387,8 +383,7 @@ class LevelDB extends BaseLevelProvider{
|
||||
|
||||
$tiles = [];
|
||||
if(($tileData = $this->db->get($index . self::TAG_BLOCK_ENTITY)) !== false and strlen($tileData) > 0){
|
||||
$nbt->read($tileData, true);
|
||||
$tiles = $nbt->getData();
|
||||
$tiles = $nbt->read($tileData, true);
|
||||
if(!is_array($tiles)){
|
||||
$tiles = [$tiles];
|
||||
}
|
||||
@ -506,8 +501,7 @@ class LevelDB extends BaseLevelProvider{
|
||||
private function writeTags(array $targets, string $index){
|
||||
if(!empty($targets)){
|
||||
$nbt = new LittleEndianNBTStream();
|
||||
$nbt->setData($targets);
|
||||
$this->db->put($index, $nbt->write());
|
||||
$this->db->put($index, $nbt->write($targets));
|
||||
}else{
|
||||
$this->db->delete($index);
|
||||
}
|
||||
|
@ -85,10 +85,7 @@ class Anvil extends McRegion{
|
||||
//TODO: TileTicks
|
||||
|
||||
$writer = new BigEndianNBTStream();
|
||||
$nbt->setName("Level");
|
||||
$writer->setData(new CompoundTag("", [$nbt]));
|
||||
|
||||
return $writer->writeCompressed(ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);
|
||||
return $writer->writeCompressed(new CompoundTag("", [$nbt]), ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);
|
||||
}
|
||||
|
||||
protected function serializeSubChunk(SubChunk $subChunk) : CompoundTag{
|
||||
@ -103,14 +100,13 @@ class Anvil extends McRegion{
|
||||
public function nbtDeserialize(string $data){
|
||||
$nbt = new BigEndianNBTStream();
|
||||
try{
|
||||
$nbt->readCompressed($data);
|
||||
|
||||
$chunk = $nbt->getData()->getCompoundTag("Level");
|
||||
|
||||
if($chunk === null){
|
||||
$chunk = $nbt->readCompressed($data);
|
||||
if(!($chunk instanceof CompoundTag) or !$chunk->hasTag("Level")){
|
||||
throw new ChunkException("Invalid NBT format");
|
||||
}
|
||||
|
||||
$chunk = $chunk->getCompoundTag("Level");
|
||||
|
||||
$subChunks = [];
|
||||
$subChunksTag = $chunk->getListTag("Sections") ?? [];
|
||||
foreach($subChunksTag as $subChunk){
|
||||
|
@ -101,10 +101,7 @@ class McRegion extends BaseLevelProvider{
|
||||
$nbt->setTag(new ListTag("TileEntities", $tiles, NBT::TAG_Compound));
|
||||
|
||||
$writer = new BigEndianNBTStream();
|
||||
$nbt->setName("Level");
|
||||
$writer->setData(new CompoundTag("", [$nbt]));
|
||||
|
||||
return $writer->writeCompressed(ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);
|
||||
return $writer->writeCompressed(new CompoundTag("", [$nbt]), ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,14 +112,13 @@ class McRegion extends BaseLevelProvider{
|
||||
public function nbtDeserialize(string $data){
|
||||
$nbt = new BigEndianNBTStream();
|
||||
try{
|
||||
$nbt->readCompressed($data);
|
||||
|
||||
$chunk = $nbt->getData()->getCompoundTag("Level");
|
||||
|
||||
if($chunk === null){
|
||||
throw new ChunkException("Invalid NBT format, 'Level' key not found");
|
||||
$chunk = $nbt->readCompressed($data);
|
||||
if(!($chunk instanceof CompoundTag) or !$chunk->hasTag("Level")){
|
||||
throw new ChunkException("Invalid NBT format");
|
||||
}
|
||||
|
||||
$chunk = $chunk->getCompoundTag("Level");
|
||||
|
||||
$subChunks = [];
|
||||
$fullIds = $chunk->hasTag("Blocks", ByteArrayTag::class) ? $chunk->getByteArray("Blocks") : str_repeat("\x00", 32768);
|
||||
$fullData = $chunk->hasTag("Data", ByteArrayTag::class) ? $chunk->getByteArray("Data") : str_repeat("\x00", 16384);
|
||||
@ -257,10 +253,9 @@ class McRegion extends BaseLevelProvider{
|
||||
new CompoundTag("GameRules", [])
|
||||
]);
|
||||
$nbt = new BigEndianNBTStream();
|
||||
$nbt->setData(new CompoundTag("", [
|
||||
$buffer = $nbt->writeCompressed(new CompoundTag("", [
|
||||
$levelData
|
||||
]));
|
||||
$buffer = $nbt->writeCompressed();
|
||||
file_put_contents($path . "level.dat", $buffer);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user