I understand, thank you Xeraphus, I think I can continue with my project
i never actually answered your question, i just answered why it happens
you can get the item (not through candybot) through the player event called onMoveItem.
onMoveItem has fromCylinder and toCylinder arguments which both hold values of (you guessed it) the last cylinder userdata the item was at, and the cylinder userdata of the item being thrown into.
i also forgot to say cylinder z positions are the index of which the item is (indexing starts at 0 rather than 1)
so if i have a brown backpack inventory, and i move a blue backpack inside of it from index 0 in my backpack (the first slot) into a red backpack with index 3 (the fourth slot), fromCylinder and toCylinder will be the same cylinder because i'm still technically moving it from the brown backpack (from cylinder) to the brown backpack (to cylinder)
fromCylinder position in the above case would be: (X: 65535, Y: 64, Z: 0)
toCylinder position would be: (X: 65535, Y: 64, Z: 3)
moving the blue backpack back to the original brown backpack would then be different cylinders, since fromCylinder would be the red backpack (the backpack i moved the blue backpack inside to), and toCylinder would be the brown backpack.
the positions would be:
fromCylinder: (X: 65535, Y: 65, Z: 0)
toCylinder: (X: 65535, Y: 64, Z: max backpack size) (moving to new cylinder z position is the number of max items held + 1)