diff --git a/src/nbt/NBT.php b/src/nbt/NBT.php new file mode 100644 index 000000000..6ca8a12dd --- /dev/null +++ b/src/nbt/NBT.php @@ -0,0 +1,205 @@ +offset = strlen($this->buffer) - 1; + return ""; + } + if($len === true){ + return substr($this->buffer, $this->offset); + } + $this->offset += $len; + return substr($this->buffer, $this->offset - $len, $len); + } + + public function put($v){ + $this->buffer .= $v; + } + + public function feof(){ + return !isset($this->buffer{$this->offset}); + } + + public function __construct($endianness = NBT::BIG_ENDIAN){ + $this->offset = 0; + $this->endianness = $endianness & 0x01; + } + + public function read($buffer){ + $this->offset = 0; + $this->buffer = $buffer; + $this->readTag(); + } + + public function write(){ + $this->offset = 0; + if($this->data instanceof NBTTag_Compound){ + $this->writeTag($this->data); + return true; + }else{ + return false; + } + } + + protected function readTag(){ + switch($this->getByte()){ + case NBTTag::TAG_End: //No named tag + $tag = new NBTTag_End; + break; + case NBTTag::TAG_Byte: + $tag = new NBTTag_Byte($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Byte: + $tag = new NBTTag_Byte($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Short: + $tag = new NBTTag_Short($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Int: + $tag = new NBTTag_Int($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Long: + $tag = new NBTTag_Long($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Float: + $tag = new NBTTag_Float($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Double: + $tag = new NBTTag_Double($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Byte_Array: + $tag = new NBTTag_Byte_Array($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_String: + $tag = new NBTTag_String($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_List: + $tag = new NBTTag_List($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Compound: + $tag = new NBTTag_Compound($this->getString()); + $tag->read($this); + break; + case NBTTag::TAG_Int_Array: + $tag = new NBTTag_Int_Array($this->getString()); + $tag->read($this); + break; + + default: + return false; + } + return $tag; + } + + public function writeTag(NBTTag $tag){ + $this->putByte($tag->getType()); + if($tag instanceof NamedNBTTag and $tag->getName() !== false){ + $this->putString($tag->getName()); + } + $tag->write($this); + } + + public function getByte(){ + return Utils::readByte($this->get(1), true); + } + + public function putByte($v){ + $this->buffer .= Utils::writeByte($v); + } + + public function getShort(){ + return $this->endianness === self::BIG_ENDIAN ? Utils::readShort($this->get(2)) : Utils::readLShort($this->get(2)); + } + + public function putShort($v){ + $this->buffer .= $this->endianness === self::BIG_ENDIAN ? Utils::writeShort($v) : Utils::writeLShort($v); + } + + public function getInt(){ + return $this->endianness === self::BIG_ENDIAN ? Utils::readInt($this->get(4)) : Utils::readLInt($this->get(4)); + } + + public function putInt($v){ + $this->buffer .= $this->endianness === self::BIG_ENDIAN ? Utils::writeInt($v) : Utils::writeLInt($v); + } + + public function getLong(){ + return $this->endianness === self::BIG_ENDIAN ? Utils::readLong($this->get(8)) : Utils::readLLong($this->get(8)); + } + + public function putLong($v){ + $this->buffer .= $this->endianness === self::BIG_ENDIAN ? Utils::writeLong($v) : Utils::writeLLong($v); + } + + public function getFloat(){ + return $this->endianness === self::BIG_ENDIAN ? Utils::readFloat($this->get(4)) : Utils::readLFloat($this->get(4)); + } + + public function putFloat($v){ + $this->buffer .= $this->endianness === self::BIG_ENDIAN ? Utils::writeFloat($v) : Utils::writeLFloat($v); + } + + public function getDouble(){ + return $this->endianness === self::BIG_ENDIAN ? Utils::readDouble($this->get(8)) : Utils::readLDouble($this->get(8)); + } + + public function putDouble($v){ + $this->buffer .= $this->endianness === self::BIG_ENDIAN ? Utils::writeDouble($v) : Utils::writeLDouble($v); + } + + public function getString(){ + return $this->get($this->getShort()); + } + + public function putString($v){ + $this->putShort(strlen($v)); + $this->buffer .= $v; + } + + public function getData(){ + return $this->data; + } + + public function setData(NBTTag_Compound $data){ + $this->data = $data; + } + +} diff --git a/src/nbt/NBTTag.php b/src/nbt/NBTTag.php new file mode 100644 index 000000000..55acec543 --- /dev/null +++ b/src/nbt/NBTTag.php @@ -0,0 +1,55 @@ +value; + } + + public abstract function getType(); + + public function setValue($value){ + $this->value = $value; + } + + abstract public function write(NBT $nbt); + + abstract public function read(NBT $nbt); + + public final function __toString(){ + return $this->value; + } +} diff --git a/src/nbt/NamedNBTTag.php b/src/nbt/NamedNBTTag.php new file mode 100644 index 000000000..7f8c5d805 --- /dev/null +++ b/src/nbt/NamedNBTTag.php @@ -0,0 +1,40 @@ +name = $name; + } + + public function getName(){ + return $this->name; + } + + public function setName($name){ + $this->name = $name; + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Byte.php b/src/nbt/tags/TAG_Byte.php new file mode 100644 index 000000000..3e9624832 --- /dev/null +++ b/src/nbt/tags/TAG_Byte.php @@ -0,0 +1,35 @@ +value = $nbt->getByte(); + } + + public function write(NBT $nbt){ + $nbt->putByte($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Byte_Array.php b/src/nbt/tags/TAG_Byte_Array.php new file mode 100644 index 000000000..77266ea0a --- /dev/null +++ b/src/nbt/tags/TAG_Byte_Array.php @@ -0,0 +1,36 @@ +value = $nbt->get($this->getInt()); + } + + public function write(NBT $nbt){ + $nbt->putInt(strlen($this->value)); + $nbt->put($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Compound.php b/src/nbt/tags/TAG_Compound.php new file mode 100644 index 000000000..01a4e22e3 --- /dev/null +++ b/src/nbt/tags/TAG_Compound.php @@ -0,0 +1,45 @@ +value = array(); + do{ + $tag = $nbt->readTag(); + if($tag instanceof NamedNBTTag){ + $this->value[$tag->getName()] = $tag; + }else{ + $this->value[] = $tag; + } + }while(!($tag instanceof NBTTag_End) and !$nbt->feof()); + } + + public function write(NBT $nbt){ + foreach($this->value as $tag){ + $nbt->writeTag($tag); + } + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Double.php b/src/nbt/tags/TAG_Double.php new file mode 100644 index 000000000..6b1437e33 --- /dev/null +++ b/src/nbt/tags/TAG_Double.php @@ -0,0 +1,35 @@ +value = $nbt->getDouble(); + } + + public function write(NBT $nbt){ + $nbt->putDouble($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_End.php b/src/nbt/tags/TAG_End.php new file mode 100644 index 000000000..d917566d3 --- /dev/null +++ b/src/nbt/tags/TAG_End.php @@ -0,0 +1,35 @@ +value = $nbt->getFloat(); + } + + public function write(NBT $nbt){ + $nbt->putFloat($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Int.php b/src/nbt/tags/TAG_Int.php new file mode 100644 index 000000000..3f766bd36 --- /dev/null +++ b/src/nbt/tags/TAG_Int.php @@ -0,0 +1,35 @@ +value = $nbt->getInt(); + } + + public function write(NBT $nbt){ + $nbt->putInt($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Int_Array.php b/src/nbt/tags/TAG_Int_Array.php new file mode 100644 index 000000000..821496351 --- /dev/null +++ b/src/nbt/tags/TAG_Int_Array.php @@ -0,0 +1,42 @@ +value = array(); + $size = $nbt->getInt(); + for($i = 0; $i < $size and !$nbt->feof(); ++$i){ + $this->value[] = $nbt->getInt(); + } + } + + public function write(NBT $nbt){ + $nbt->putInt(count($this->value)); + foreach($this->value as $v){ + $nbt->putInt($v); + } + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_List.php b/src/nbt/tags/TAG_List.php new file mode 100644 index 000000000..54dfecf57 --- /dev/null +++ b/src/nbt/tags/TAG_List.php @@ -0,0 +1,108 @@ +value = array(); + $tagId = $nbt->getByte(); + $this->value[-1] = $tagId; + $size = $nbt->getInt(); + for($i = 0; $i < $size and !$nbt->feof(); ++$i){ + switch($tagId){ + case NBTTag::TAG_Byte: + $tag = new NBTTag_Byte(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Byte: + $tag = new NBTTag_Byte(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Short: + $tag = new NBTTag_Short(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Int: + $tag = new NBTTag_Int(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Long: + $tag = new NBTTag_Long(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Float: + $tag = new NBTTag_Float(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Double: + $tag = new NBTTag_Double(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Byte_Array: + $tag = new NBTTag_Byte_Array(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_String: + $tag = new NBTTag_String(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_List: + $tag = new NBTTag_List(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Compound: + $tag = new NBTTag_Compound(false); + $tag->read($this); + $this->value[] = $tag; + break; + case NBTTag::TAG_Int_Array: + $tag = new NBTTag_Int_Array(false); + $tag->read($this); + $this->value[] = $tag; + break; + } + } + } + + public function write(NBT $nbt){ + $nbt->putByte($this->value[-1]); + $nbt->putInt(count($this->value) - 1); + foreach($this->value as $tag){ + if($tag instanceof NBTTag){ + $nbt->writeTag($tag); + } + } + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Long.php b/src/nbt/tags/TAG_Long.php new file mode 100644 index 000000000..9c4cf740b --- /dev/null +++ b/src/nbt/tags/TAG_Long.php @@ -0,0 +1,35 @@ +value = $nbt->getLong(); + } + + public function write(NBT $nbt){ + $nbt->putLong($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_Short.php b/src/nbt/tags/TAG_Short.php new file mode 100644 index 000000000..994a4f63a --- /dev/null +++ b/src/nbt/tags/TAG_Short.php @@ -0,0 +1,35 @@ +value = $nbt->getShort(); + } + + public function write(NBT $nbt){ + $nbt->putShort($this->value); + } +} \ No newline at end of file diff --git a/src/nbt/tags/TAG_String.php b/src/nbt/tags/TAG_String.php new file mode 100644 index 000000000..0950ebb3a --- /dev/null +++ b/src/nbt/tags/TAG_String.php @@ -0,0 +1,36 @@ +value = $nbt->get($this->getShort()); + } + + public function write(NBT $nbt){ + $nbt->putShort(strlen($this->value)); + $nbt->put($this->value); + } +} \ No newline at end of file