NetworkItemStackDescriptor
Field NameField Notes
Id Send fixed Id of 0 for invalid item
User Data Buffer The ItemInstanceUserData binary blob encoded as a String, so it's unsigned varint length prefixed. Get all your nbt+property bytes, calculate the length, write that length, THEN write the data.