If the box's only purpose in "life" is to get picked up, the code could consist of simply a while loop that wait(1)'s until vec_dist(my.x,player.x) < 150 or so, and then it sets havebox = 1 and ent_remove's itself.
Another function, perhaps the player function, would have some code in its loop that always keeps an invisible and passable copy of the box attached to the player, and makes the box visible if(havebox == 1)
This also means that if you wanted other things to respond to the box being picked up, all you would have to do is add an if(havebox == 1) to their function.