/** * Writes a coded metadata string * * @param array $data * * @return string */ public static function writeMetadata(array $data) { $stream = new BinaryStream(); $stream->putUnsignedVarInt(count($data)); foreach ($data as $key => $d) { $stream->putUnsignedVarInt($key); //data key $stream->putUnsignedVarInt($d[0]); //data type switch ($d[0]) { case Entity::DATA_TYPE_BYTE: $stream->putByte($d[1]); break; case Entity::DATA_TYPE_SHORT: $stream->putLShort($d[1]); //SIGNED short! break; case Entity::DATA_TYPE_INT: $stream->putVarInt($d[1]); break; case Entity::DATA_TYPE_FLOAT: $stream->putLFloat($d[1]); break; case Entity::DATA_TYPE_STRING: $stream->putString($d[1]); break; case Entity::DATA_TYPE_SLOT: //TODO: change this implementation (use objects) $stream->putSlot(Item::get($d[1][0], $d[1][2], $d[1][1])); //ID, damage, count break; case Entity::DATA_TYPE_POS: //TODO: change this implementation (use objects) $stream->putBlockCoords($d[1][0], $d[1][1], $d[1][2]); //x, y, z break; case Entity::DATA_TYPE_LONG: $stream->putVarInt($d[1]); //TODO: varint64 support break; case Entity::DATA_TYPE_VECTOR3F: //TODO: change this implementation (use objects) $stream->putVector3f($d[1][0], $d[1][1], $d[1][2]); //x, y, z } } return $stream->getBuffer(); }
private static function writeShapedRecipe(ShapedRecipe $recipe, BinaryStream $stream) { $stream->putVarInt($recipe->getWidth()); $stream->putVarInt($recipe->getHeight()); for ($z = 0; $z < $recipe->getWidth(); ++$z) { for ($x = 0; $x < $recipe->getHeight(); ++$x) { $stream->putSlot($recipe->getIngredient($x, $z)); } } $stream->putUnsignedVarInt(1); $stream->putSlot($recipe->getResult()); $stream->putUUID($recipe->getId()); return CraftingDataPacket::ENTRY_SHAPED; }