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::LITTLE_ENDIAN){ $this->offset = 0; $this->endianness = $endianness & 0x01; } public function read($buffer){ $this->offset = 0; $this->buffer = $buffer; $this->data = $this->readTag(); $this->buffer = b""; } public function write(){ $this->offset = 0; if($this->data instanceof NBTTag_Compound){ $this->writeTag($this->data); return $this->buffer; }else{ return false; } } public function readTag(){ switch($this->getByte()){ 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; case NBTTag::TAG_End: //No named tag default: $tag = new NBTTag_End; break; } 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 __get($name){ return $this->data instanceof NBTTag_Compound ? $this->data->{$name} : false; } public function __set($name, $value){ if($this->data instanceof NBTTag_Compound){ $this->data->{$name} = $value; } } public function __isset($name){ return $this->data instanceof NBTTag_Compound ? isset($this->data->{$name}) : false; } public function __unset($name){ if($this->data instanceof NBTTag_Compound){ unset($this->data->{$name}); } } public function getData(){ return $this->data; } public function setData(NBTTag_Compound $data){ $this->data = $data; } }