Skip to content

Commit 3cb087c

Browse files
committed
restructure NbtSerializer/NbtDeserializer, increased minimum PHP version to 8.0
1 parent 65eabcf commit 3cb087c

39 files changed

+729
-643
lines changed

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
],
1717
"require": {
1818
"pocketmine/binaryutils": "^0.2.1",
19-
"php": "^7.4 || ^8.0",
19+
"php": ">=8.0",
2020
"php-64bit": "*",
2121
"ext-zlib": "*",
2222
"ext-json": "*"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
use Aternos\Nbt\MachineByteOrder;
6+
use Aternos\Nbt\NbtFormat;
7+
use pocketmine\utils\Binary;
8+
9+
class BedrockEditionNbtDeserializer extends NbtDeserializer
10+
{
11+
/**
12+
* @inheritDoc
13+
*/
14+
public function getFormat(): int
15+
{
16+
return NbtFormat::BEDROCK_EDITION;
17+
}
18+
19+
/**
20+
* @inheritDoc
21+
*/
22+
public function readLengthPrefix(): DeserializerIntReadResult
23+
{
24+
$raw = $this->getReader()->read(4);
25+
return new DeserializerIntReadResult(Binary::signInt(Binary::readLInt($raw)), $raw);
26+
}
27+
28+
/**
29+
* @inheritDoc
30+
*/
31+
public function readStringLengthPrefix(): DeserializerIntReadResult
32+
{
33+
$raw = $this->getReader()->read(2);
34+
return new DeserializerIntReadResult(Binary::readLShort($raw), $raw);
35+
}
36+
37+
/**
38+
* @inheritDoc
39+
*/
40+
public function readByte(): DeserializerIntReadResult
41+
{
42+
$raw = $this->getReader()->read(1);
43+
return new DeserializerIntReadResult(Binary::readSignedByte($raw), $raw);
44+
}
45+
46+
/**
47+
* @inheritDoc
48+
*/
49+
public function readShort(): DeserializerIntReadResult
50+
{
51+
$raw = $this->getReader()->read(2);
52+
return new DeserializerIntReadResult(Binary::readSignedLShort($raw), $raw);
53+
}
54+
55+
/**
56+
* @inheritDoc
57+
*/
58+
public function readInt(): DeserializerIntReadResult
59+
{
60+
$raw = $this->getReader()->read(4);
61+
return new DeserializerIntReadResult(Binary::signInt(Binary::readLInt($raw)), $raw);
62+
}
63+
64+
/**
65+
* @inheritDoc
66+
*/
67+
public function readLong(): DeserializerIntReadResult
68+
{
69+
$raw = $this->getReader()->read(8);
70+
$value = @unpack("q", MachineByteOrder::isBigEndian() ? strrev($raw) : $raw)[1] ?? 0;;
71+
return new DeserializerIntReadResult($value, $raw);
72+
}
73+
74+
/**
75+
* @inheritDoc
76+
*/
77+
public function readFloat(): DeserializerFloatReadResult
78+
{
79+
$raw = $this->getReader()->read(4);
80+
return new DeserializerFloatReadResult(Binary::readLFloat($raw), $raw);
81+
}
82+
83+
/**
84+
* @inheritDoc
85+
*/
86+
public function readDouble(): DeserializerFloatReadResult
87+
{
88+
$raw = $this->getReader()->read(8);
89+
return new DeserializerFloatReadResult(Binary::readLDouble($raw), $raw);
90+
}
91+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
use Aternos\Nbt\NbtFormat;
6+
use pocketmine\utils\Binary;
7+
8+
class BedrockEditionNetworkNbtDeserializer extends BedrockEditionNbtDeserializer
9+
{
10+
/**
11+
* @inheritDoc
12+
*/
13+
public function getFormat(): int
14+
{
15+
return NbtFormat::BEDROCK_EDITION_NETWORK;
16+
}
17+
18+
/**
19+
* @inheritDoc
20+
*/
21+
public function readLengthPrefix(): DeserializerIntReadResult
22+
{
23+
$reader = $this->getReader();
24+
$raw = $reader->read(5);
25+
$offset = 0;
26+
$value = Binary::readVarInt($raw, $offset);
27+
$reader->returnData(substr($raw, $offset));
28+
return new DeserializerIntReadResult($value, substr($raw, 0, $offset));
29+
}
30+
31+
/**
32+
* @inheritDoc
33+
*/
34+
public function readStringLengthPrefix(): DeserializerIntReadResult
35+
{
36+
$reader = $this->getReader();
37+
$raw = $reader->read(5);
38+
$offset = 0;
39+
$value = Binary::readUnsignedVarInt($raw, $offset);
40+
$reader->returnData(substr($raw, $offset));
41+
return new DeserializerIntReadResult($value, substr($raw, 0, $offset));
42+
}
43+
44+
/**
45+
* @inheritDoc
46+
*/
47+
public function readInt(): DeserializerIntReadResult
48+
{
49+
$reader = $this->getReader();
50+
$raw = $reader->read(5);
51+
$offset = 0;
52+
$value = Binary::readVarInt($raw, $offset);
53+
$reader->returnData(substr($raw, $offset));
54+
return new DeserializerIntReadResult($value, substr($raw, 0, $offset));
55+
}
56+
57+
/**
58+
* @inheritDoc
59+
*/
60+
public function readLong(): DeserializerIntReadResult
61+
{
62+
$reader = $this->getReader();
63+
$raw = $reader->read(10);
64+
$offset = 0;
65+
$value = Binary::readVarLong($raw, $offset);
66+
$reader->returnData(substr($raw, $offset));
67+
return new DeserializerIntReadResult($value, substr($raw, 0, $offset));
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
class DeserializerFloatReadResult extends DeserializerReadResult
6+
{
7+
public function __construct(protected float $value, string $rawData)
8+
{
9+
parent::__construct($rawData);
10+
}
11+
12+
/**
13+
* @return float
14+
*/
15+
public function getValue(): float
16+
{
17+
return $this->value;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
class DeserializerIntReadResult extends DeserializerReadResult
6+
{
7+
public function __construct(protected int $value, string $rawData)
8+
{
9+
parent::__construct($rawData);
10+
}
11+
12+
/**
13+
* @return int
14+
*/
15+
public function getValue(): int
16+
{
17+
return $this->value;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
abstract class DeserializerReadResult
6+
{
7+
public function __construct(protected string $rawData)
8+
{
9+
}
10+
11+
/**
12+
* @return string
13+
*/
14+
public function getRawData(): string
15+
{
16+
return $this->rawData;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
use Aternos\Nbt\MachineByteOrder;
6+
use Aternos\Nbt\NbtFormat;
7+
use pocketmine\utils\Binary;
8+
9+
class JavaEditionNbtDeserializer extends NbtDeserializer
10+
{
11+
/**
12+
* @inheritDoc
13+
*/
14+
public function getFormat(): int
15+
{
16+
return NbtFormat::JAVA_EDITION;
17+
}
18+
19+
/**
20+
* @inheritDoc
21+
*/
22+
public function readLengthPrefix(): DeserializerIntReadResult
23+
{
24+
$raw = $this->getReader()->read(4);
25+
return new DeserializerIntReadResult(Binary::signInt(Binary::readInt($raw)), $raw);
26+
}
27+
28+
/**
29+
* @inheritDoc
30+
*/
31+
public function readStringLengthPrefix(): DeserializerIntReadResult
32+
{
33+
$raw = $this->getReader()->read(2);
34+
return new DeserializerIntReadResult(Binary::readShort($raw), $raw);
35+
}
36+
37+
/**
38+
* @inheritDoc
39+
*/
40+
public function readByte(): DeserializerIntReadResult
41+
{
42+
$raw = $this->getReader()->read(1);
43+
return new DeserializerIntReadResult(Binary::readSignedByte($raw), $raw);
44+
}
45+
46+
/**
47+
* @inheritDoc
48+
*/
49+
public function readShort(): DeserializerIntReadResult
50+
{
51+
$raw = $this->getReader()->read(2);
52+
return new DeserializerIntReadResult(Binary::readSignedShort($raw), $raw);
53+
}
54+
55+
/**
56+
* @inheritDoc
57+
*/
58+
public function readInt(): DeserializerIntReadResult
59+
{
60+
$raw = $this->getReader()->read(4);
61+
return new DeserializerIntReadResult(Binary::signInt(Binary::readInt($raw)), $raw);
62+
}
63+
64+
/**
65+
* @inheritDoc
66+
*/
67+
public function readLong(): DeserializerIntReadResult
68+
{
69+
$raw = $this->getReader()->read(8);
70+
$value = @unpack("q", MachineByteOrder::isLittleEndian() ? strrev($raw) : $raw)[1] ?? 0;
71+
return new DeserializerIntReadResult($value, $raw);
72+
}
73+
74+
/**
75+
* @inheritDoc
76+
*/
77+
public function readFloat(): DeserializerFloatReadResult
78+
{
79+
$raw = $this->getReader()->read(4);
80+
return new DeserializerFloatReadResult(Binary::readFloat($raw), $raw);
81+
}
82+
83+
/**
84+
* @inheritDoc
85+
*/
86+
public function readDouble(): DeserializerFloatReadResult
87+
{
88+
$raw = $this->getReader()->read(8);
89+
return new DeserializerFloatReadResult(Binary::readDouble($raw), $raw);
90+
}
91+
}

src/Deserializer/NbtDeserializer.php

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
namespace Aternos\Nbt\Deserializer;
4+
5+
use Aternos\Nbt\IO\Reader\Reader;
6+
7+
abstract class NbtDeserializer
8+
{
9+
public function __construct(protected Reader $reader)
10+
{
11+
}
12+
13+
/**
14+
* Read an NBT length prefix (TAG_List, TAG_Byte_Array, TAG_Int_Array, and TAG_Long_Array)
15+
*
16+
* @return DeserializerIntReadResult
17+
*/
18+
abstract public function readLengthPrefix(): DeserializerIntReadResult;
19+
20+
/**
21+
* Read an NBT string length prefix
22+
*
23+
* @return DeserializerIntReadResult
24+
*/
25+
abstract public function readStringLengthPrefix(): DeserializerIntReadResult;
26+
27+
/**
28+
* @return DeserializerIntReadResult
29+
*/
30+
abstract public function readByte(): DeserializerIntReadResult;
31+
32+
/**
33+
* @return DeserializerIntReadResult
34+
*/
35+
abstract public function readShort(): DeserializerIntReadResult;
36+
37+
/**
38+
* @return DeserializerIntReadResult
39+
*/
40+
abstract public function readInt(): DeserializerIntReadResult;
41+
42+
/**
43+
* @return DeserializerIntReadResult
44+
*/
45+
abstract public function readLong(): DeserializerIntReadResult;
46+
47+
/**
48+
* @return DeserializerFloatReadResult
49+
*/
50+
abstract public function readFloat(): DeserializerFloatReadResult;
51+
52+
/**
53+
* @return DeserializerFloatReadResult
54+
*/
55+
abstract public function readDouble(): DeserializerFloatReadResult;
56+
57+
/**
58+
* @return int
59+
*/
60+
abstract public function getFormat(): int;
61+
62+
/**
63+
* @return Reader
64+
*/
65+
public function getReader(): Reader
66+
{
67+
return $this->reader;
68+
}
69+
}

0 commit comments

Comments
 (0)