/** * Reads a metadata coded string * * @param $value * @param bool $types * * @return array */ public static function readMetadata($value, $types = false) { $stream = new BinaryStream(); $stream->setBuffer($value); $count = $stream->getUnsignedVarInt(); $data = []; for ($i = 0; $i < $count; ++$i) { $key = $stream->getUnsignedVarInt(); $type = $stream->getUnsignedVarInt(); $value = null; switch ($type) { case Entity::DATA_TYPE_BYTE: $value = $stream->getByte(); break; case Entity::DATA_TYPE_SHORT: $value = $stream->getLShort(true); //signed break; case Entity::DATA_TYPE_INT: $value = $stream->getVarInt(); break; case Entity::DATA_TYPE_FLOAT: $value = $stream->getLFloat(); break; case Entity::DATA_TYPE_STRING: $value = $stream->getString(); break; case Entity::DATA_TYPE_SLOT: //TODO: use objects directly $item = $stream->getSlot(); $value[0] = $item->getId(); $value[1] = $item->getCount(); $value[2] = $item->getDamage(); break; case Entity::DATA_TYPE_POS: $value = [0, 0, 0]; $stream->getBlockCoords($value[0], $value[1], $value[2]); break; case Entity::DATA_TYPE_LONG: $value = $stream->getVarInt(); //TODO: varint64 proper support break; case Entity::DATA_TYPE_VECTOR3F: $value = [0.0, 0.0, 0.0]; $stream->getVector3f($value[0], $value[1], $value[2]); break; default: $value = []; } if ($types === true) { $data[$key] = [$value, $type]; } else { $data[$key] = $value; } } return $data; }