Sync NBT dependency

This commit is contained in:
Dylan K. Taylor 2019-01-07 22:26:22 +00:00
parent 9c16caf27b
commit 2924303169
12 changed files with 69 additions and 73 deletions

30
composer.lock generated
View File

@ -233,16 +233,16 @@
},
{
"name": "particle/validator",
"version": "v2.3.3",
"version": "v2.3.4",
"source": {
"type": "git",
"url": "https://github.com/particle-php/Validator.git",
"reference": "becaa89160fe220ebd9e9cd10addc62cf2adf3f0"
"reference": "657c7543e51938dd9d114750e49d695129527a7a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/particle-php/Validator/zipball/becaa89160fe220ebd9e9cd10addc62cf2adf3f0",
"reference": "becaa89160fe220ebd9e9cd10addc62cf2adf3f0",
"url": "https://api.github.com/repos/particle-php/Validator/zipball/657c7543e51938dd9d114750e49d695129527a7a",
"reference": "657c7543e51938dd9d114750e49d695129527a7a",
"shasum": ""
},
"require": {
@ -291,20 +291,20 @@
"validation",
"validator"
],
"time": "2018-09-12T08:03:23+00:00"
"time": "2019-01-07T13:39:13+00:00"
},
{
"name": "pocketmine/binaryutils",
"version": "0.1.5",
"version": "0.1.6",
"source": {
"type": "git",
"url": "https://github.com/pmmp/BinaryUtils.git",
"reference": "03361b0d78ef2b400a99e96406aa594a5bc1c4ed"
"reference": "53cbb5a958130a6c6b5a4c511e623f4d401c1476"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/BinaryUtils/zipball/03361b0d78ef2b400a99e96406aa594a5bc1c4ed",
"reference": "03361b0d78ef2b400a99e96406aa594a5bc1c4ed",
"url": "https://api.github.com/repos/pmmp/BinaryUtils/zipball/53cbb5a958130a6c6b5a4c511e623f4d401c1476",
"reference": "53cbb5a958130a6c6b5a4c511e623f4d401c1476",
"shasum": ""
},
"require": {
@ -322,10 +322,10 @@
],
"description": "Classes and methods for conveniently handling binary data",
"support": {
"source": "https://github.com/pmmp/BinaryUtils/tree/0.1.5",
"source": "https://github.com/pmmp/BinaryUtils/tree/0.1.6",
"issues": "https://github.com/pmmp/BinaryUtils/issues"
},
"time": "2019-01-04T13:32:11+00:00"
"time": "2019-01-06T15:20:40+00:00"
},
{
"name": "pocketmine/math",
@ -372,12 +372,12 @@
"source": {
"type": "git",
"url": "https://github.com/pmmp/NBT.git",
"reference": "863b2e509485baffd4897cd6fa8e98e7e7e5ae14"
"reference": "ead8577bf3ff0eb8dd3c19c40a67a9ee6d06783a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pmmp/NBT/zipball/863b2e509485baffd4897cd6fa8e98e7e7e5ae14",
"reference": "863b2e509485baffd4897cd6fa8e98e7e7e5ae14",
"url": "https://api.github.com/repos/pmmp/NBT/zipball/ead8577bf3ff0eb8dd3c19c40a67a9ee6d06783a",
"reference": "ead8577bf3ff0eb8dd3c19c40a67a9ee6d06783a",
"shasum": ""
},
"require": {
@ -405,7 +405,7 @@
"source": "https://github.com/pmmp/NBT/tree/master",
"issues": "https://github.com/pmmp/NBT/issues"
},
"time": "2019-01-04T15:32:10+00:00"
"time": "2019-01-07T21:01:32+00:00"
},
{
"name": "pocketmine/raklib",

View File

@ -94,7 +94,7 @@ use pocketmine\nbt\tag\DoubleTag;
use pocketmine\nbt\tag\ListTag;
use pocketmine\network\mcpe\CompressBatchPromise;
use pocketmine\network\mcpe\NetworkCipher;
use pocketmine\network\mcpe\NetworkLittleEndianNBTStream;
use pocketmine\network\mcpe\NetworkNbtSerializer;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\network\mcpe\ProcessLoginTask;
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
@ -2465,7 +2465,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$t = $this->level->getTile($pos);
if($t instanceof Spawnable){
$nbt = new NetworkLittleEndianNBTStream();
$nbt = new NetworkNbtSerializer();
$compound = $nbt->read($packet->namedtag);
if(!$t->updateCompoundTag($compound, $this)){
$t->spawnTo($this);

View File

@ -61,7 +61,7 @@ use pocketmine\level\LevelException;
use pocketmine\metadata\EntityMetadataStore;
use pocketmine\metadata\LevelMetadataStore;
use pocketmine\metadata\PlayerMetadataStore;
use pocketmine\nbt\BigEndianNBTStream;
use pocketmine\nbt\BigEndianNbtSerializer;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
@ -812,7 +812,7 @@ class Server{
if($this->shouldSavePlayerData()){
if(file_exists($path . "$name.dat")){
try{
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
return $nbt->readCompressed(file_get_contents($path . "$name.dat"));
}catch(\Throwable $e){ //zlib decode error / corrupt data
rename($path . "$name.dat", $path . "$name.dat.bak");
@ -875,7 +875,7 @@ class Server{
$ev->call();
if(!$ev->isCancelled()){
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
try{
file_put_contents($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed($ev->getSaveData()));
}catch(\Throwable $e){

View File

@ -33,7 +33,7 @@ use pocketmine\entity\Entity;
use pocketmine\item\enchantment\Enchantment;
use pocketmine\item\enchantment\EnchantmentInstance;
use pocketmine\math\Vector3;
use pocketmine\nbt\LittleEndianNBTStream;
use pocketmine\nbt\LittleEndianNbtSerializer;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
@ -61,7 +61,7 @@ class Item implements ItemIds, \JsonSerializable{
public const TAG_DISPLAY_LORE = "Lore";
/** @var LittleEndianNBTStream */
/** @var LittleEndianNbtSerializer */
private static $cachedParser = null;
private static function parseCompoundTag(string $tag) : CompoundTag{
@ -70,7 +70,7 @@ class Item implements ItemIds, \JsonSerializable{
}
if(self::$cachedParser === null){
self::$cachedParser = new LittleEndianNBTStream();
self::$cachedParser = new LittleEndianNbtSerializer();
}
return self::$cachedParser->read($tag);
@ -78,7 +78,7 @@ class Item implements ItemIds, \JsonSerializable{
private static function writeCompoundTag(CompoundTag $tag) : string{
if(self::$cachedParser === null){
self::$cachedParser = new LittleEndianNBTStream();
self::$cachedParser = new LittleEndianNbtSerializer();
}
return self::$cachedParser->write($tag);

View File

@ -27,7 +27,7 @@ use pocketmine\level\format\io\exception\UnsupportedLevelFormatException;
use pocketmine\level\generator\Flat;
use pocketmine\level\generator\GeneratorManager;
use pocketmine\level\Level;
use pocketmine\nbt\LittleEndianNBTStream;
use pocketmine\nbt\LittleEndianNbtSerializer;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\FloatTag;
@ -97,13 +97,13 @@ class BedrockLevelData extends BaseNbtLevelData{
new StringTag("generatorOptions", $options["preset"] ?? "")
]);
$nbt = new LittleEndianNBTStream();
$nbt = new LittleEndianNbtSerializer();
$buffer = $nbt->write($levelData);
file_put_contents($path . "level.dat", Binary::writeLInt(self::CURRENT_STORAGE_VERSION) . Binary::writeLInt(strlen($buffer)) . $buffer);
}
protected function load() : ?CompoundTag{
$nbt = new LittleEndianNBTStream();
$nbt = new LittleEndianNbtSerializer();
$levelData = $nbt->read(substr(file_get_contents($this->dataPath), 8));
$version = $levelData->getInt("StorageVersion", INT32_MAX, true);
@ -148,7 +148,7 @@ class BedrockLevelData extends BaseNbtLevelData{
$this->compoundTag->setInt("NetworkVersion", ProtocolInfo::CURRENT_PROTOCOL);
$this->compoundTag->setInt("StorageVersion", self::CURRENT_STORAGE_VERSION);
$nbt = new LittleEndianNBTStream();
$nbt = new LittleEndianNbtSerializer();
$buffer = $nbt->write($this->compoundTag);
file_put_contents($this->dataPath, Binary::writeLInt(self::CURRENT_STORAGE_VERSION) . Binary::writeLInt(strlen($buffer)) . $buffer);
}

View File

@ -25,7 +25,7 @@ namespace pocketmine\level\format\io\data;
use pocketmine\level\generator\GeneratorManager;
use pocketmine\level\Level;
use pocketmine\nbt\BigEndianNBTStream;
use pocketmine\nbt\BigEndianNbtSerializer;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\FloatTag;
@ -61,7 +61,7 @@ class JavaLevelData extends BaseNbtLevelData{
new StringTag("LevelName", $name),
new CompoundTag("GameRules", [])
]);
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
$buffer = $nbt->writeCompressed(new CompoundTag("", [
$levelData
]));
@ -69,7 +69,7 @@ class JavaLevelData extends BaseNbtLevelData{
}
protected function load() : ?CompoundTag{
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
$levelData = $nbt->readCompressed(file_get_contents($this->dataPath));
if($levelData->hasTag("Data", CompoundTag::class)){
return $levelData->getCompoundTag("Data");
@ -90,7 +90,7 @@ class JavaLevelData extends BaseNbtLevelData{
}
public function save() : void{
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
$this->compoundTag->setName("Data");
$buffer = $nbt->writeCompressed(new CompoundTag("", [
$this->compoundTag

View File

@ -31,7 +31,7 @@ use pocketmine\level\format\io\exception\UnsupportedChunkFormatException;
use pocketmine\level\format\io\exception\UnsupportedLevelFormatException;
use pocketmine\level\format\io\LevelData;
use pocketmine\level\format\SubChunk;
use pocketmine\nbt\LittleEndianNBTStream;
use pocketmine\nbt\LittleEndianNbtSerializer;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\utils\Binary;
use pocketmine\utils\BinaryStream;
@ -239,7 +239,7 @@ class LevelDB extends BaseLevelProvider{
throw new UnsupportedChunkFormatException("don't know how to decode chunk format version $chunkVersion");
}
$nbt = new LittleEndianNBTStream();
$nbt = new LittleEndianNbtSerializer();
/** @var CompoundTag[] $entities */
$entities = [];
@ -332,7 +332,7 @@ class LevelDB extends BaseLevelProvider{
*/
private function writeTags(array $targets, string $index) : void{
if(!empty($targets)){
$nbt = new LittleEndianNBTStream();
$nbt = new LittleEndianNbtSerializer();
$this->db->put($index, $nbt->writeMultiple($targets));
}else{
$this->db->delete($index);

View File

@ -27,7 +27,7 @@ use pocketmine\level\format\Chunk;
use pocketmine\level\format\io\ChunkUtils;
use pocketmine\level\format\io\exception\CorruptedChunkException;
use pocketmine\level\format\SubChunk;
use pocketmine\nbt\BigEndianNBTStream;
use pocketmine\nbt\BigEndianNbtSerializer;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\IntArrayTag;
@ -89,14 +89,14 @@ trait LegacyAnvilChunkTrait{
//TODO: TileTicks
$writer = new BigEndianNBTStream();
$writer = new BigEndianNbtSerializer();
return $writer->writeCompressed(new CompoundTag("", [$nbt]), ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);
}
abstract protected function serializeSubChunk(SubChunk $subChunk) : CompoundTag;
protected function deserializeChunk(string $data) : Chunk{
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
$chunk = $nbt->readCompressed($data);
if(!$chunk->hasTag("Level")){
throw new CorruptedChunkException("'Level' key is missing from chunk NBT");

View File

@ -27,7 +27,7 @@ use pocketmine\level\format\Chunk;
use pocketmine\level\format\io\ChunkUtils;
use pocketmine\level\format\io\exception\CorruptedChunkException;
use pocketmine\level\format\SubChunk;
use pocketmine\nbt\BigEndianNBTStream;
use pocketmine\nbt\BigEndianNbtSerializer;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\ByteArrayTag;
use pocketmine\nbt\tag\CompoundTag;
@ -95,7 +95,7 @@ class McRegion extends RegionLevelProvider{
$nbt->setTag(new ListTag("TileEntities", $tiles, NBT::TAG_Compound));
$writer = new BigEndianNBTStream();
$writer = new BigEndianNbtSerializer();
return $writer->writeCompressed(new CompoundTag("", [$nbt]), ZLIB_ENCODING_DEFLATE, RegionLoader::$COMPRESSION_LEVEL);
}
@ -106,7 +106,7 @@ class McRegion extends RegionLevelProvider{
* @throws CorruptedChunkException
*/
protected function deserializeChunk(string $data) : Chunk{
$nbt = new BigEndianNBTStream();
$nbt = new BigEndianNbtSerializer();
$chunk = $nbt->readCompressed($data);
if(!$chunk->hasTag("Level")){
throw new CorruptedChunkException("'Level' key is missing from chunk NBT");

View File

@ -30,7 +30,7 @@ use pocketmine\entity\Entity;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\math\Vector3;
use pocketmine\nbt\LittleEndianNBTStream;
use pocketmine\nbt\LittleEndianNbtSerializer;
use pocketmine\network\mcpe\protocol\types\CommandOriginData;
use pocketmine\network\mcpe\protocol\types\EntityLink;
use pocketmine\utils\BinaryStream;
@ -39,7 +39,7 @@ use function count;
use function strlen;
class NetworkBinaryStream extends BinaryStream{
/** @var LittleEndianNBTStream */
/** @var LittleEndianNbtSerializer */
private static $itemNbtSerializer = null;
public function getString() : string{
@ -85,7 +85,7 @@ class NetworkBinaryStream extends BinaryStream{
$compound = null;
if($nbtLen > 0){
if(self::$itemNbtSerializer === null){
self::$itemNbtSerializer = new LittleEndianNBTStream();
self::$itemNbtSerializer = new LittleEndianNbtSerializer();
}
$compound = self::$itemNbtSerializer->read($this->get($nbtLen));
}
@ -119,7 +119,7 @@ class NetworkBinaryStream extends BinaryStream{
$nbtLen = 0;
if($item->hasNamedTag()){
if(self::$itemNbtSerializer === null){
self::$itemNbtSerializer = new LittleEndianNBTStream();
self::$itemNbtSerializer = new LittleEndianNbtSerializer();
}
$nbt = self::$itemNbtSerializer->write($item->getNamedTag());
$nbtLen = strlen($nbt);

View File

@ -23,59 +23,55 @@ declare(strict_types=1);
namespace pocketmine\network\mcpe;
use pocketmine\nbt\LittleEndianNBTStream;
use pocketmine\nbt\LittleEndianNbtSerializer;
use function count;
use function strlen;
#ifndef COMPILE
use pocketmine\utils\Binary;
#endif
#include <rules/NBT.h>
class NetworkNbtSerializer extends LittleEndianNbtSerializer{
class NetworkLittleEndianNBTStream extends LittleEndianNBTStream{
public function getInt() : int{
return Binary::readVarInt($this->buffer, $this->offset);
public function readInt() : int{
return $this->buffer->getVarInt();
}
public function putInt(int $v) : void{
$this->put(Binary::writeVarInt($v));
public function writeInt(int $v) : void{
$this->buffer->putVarInt($v);
}
public function getLong() : int{
return Binary::readVarLong($this->buffer, $this->offset);
public function readLong() : int{
return $this->buffer->getVarLong();
}
public function putLong(int $v) : void{
$this->put(Binary::writeVarLong($v));
public function writeLong(int $v) : void{
$this->buffer->putVarLong($v);
}
public function getString() : string{
return $this->get(Binary::readUnsignedVarInt($this->buffer, $this->offset));
public function readString() : string{
return $this->buffer->get($this->buffer->getUnsignedVarInt());
}
public function putString(string $v) : void{
public function writeString(string $v) : void{
$len = strlen($v);
if($len > 32767){
throw new \InvalidArgumentException("NBT strings cannot be longer than 32767 bytes, got $len bytes");
}
$this->put(Binary::writeUnsignedVarInt($len) . $v);
$this->buffer->putUnsignedVarInt($len);
$this->buffer->put($v);
}
public function getIntArray() : array{
$len = $this->getInt(); //varint
public function readIntArray() : array{
$len = $this->readInt(); //varint
$ret = [];
for($i = 0; $i < $len; ++$i){
$ret[] = $this->getInt(); //varint
$ret[] = $this->readInt(); //varint
}
return $ret;
}
public function putIntArray(array $array) : void{
$this->putInt(count($array)); //varint
public function writeIntArray(array $array) : void{
$this->writeInt(count($array)); //varint
foreach($array as $v){
$this->putInt($v); //varint
$this->writeInt($v); //varint
}
}
}

View File

@ -26,7 +26,7 @@ namespace pocketmine\tile;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\IntTag;
use pocketmine\nbt\tag\StringTag;
use pocketmine\network\mcpe\NetworkLittleEndianNBTStream;
use pocketmine\network\mcpe\NetworkNbtSerializer;
use pocketmine\network\mcpe\protocol\BlockEntityDataPacket;
use pocketmine\Player;
use function get_class;
@ -37,7 +37,7 @@ abstract class Spawnable extends Tile{
/** @var bool */
private $dirty = true; //default dirty, until it's been spawned appropriately on the level
/** @var NetworkLittleEndianNBTStream|null */
/** @var NetworkNbtSerializer|null */
private static $nbtWriter = null;
public function createSpawnPacket() : BlockEntityDataPacket{
@ -95,7 +95,7 @@ abstract class Spawnable extends Tile{
final public function getSerializedSpawnCompound() : string{
if($this->spawnCompoundCache === null){
if(self::$nbtWriter === null){
self::$nbtWriter = new NetworkLittleEndianNBTStream();
self::$nbtWriter = new NetworkNbtSerializer();
}
$this->spawnCompoundCache = self::$nbtWriter->write($this->getSpawnCompound());