Thanks everyone, I'm pleased you like it.
This is just awesome, the coolest thing i've ever seen on samp

Some suggestions:
A 20 ms timer is a lot of work for the server. Let's say that a object is 16 byte (x+y+z+ID), in 1 second it is fired 50 times so it is a 800 byte load for every ball.
With 15+1 balls.... 12,8 kb/s for every player for the server.
It's a LOT!
So try to do this:
1)Update only the balls that need update (the ones that are moving)
2)I think that you can use a 50 ms timer
3)Let more the client move the objects, cause i think it can predict movements by itself

Well, the data is not being sent to every player, is it? If yes, then this is a problem... I didn't even thought of this matter, it's a good point though.
1. I just optimalised a script a bit to calculate only neccessary datas
2. I tried 50ms timer, it works fine, but it rarely happens one cue ball goes through another one. It is good solution for the server, anyway, the experience from that game is lower.
3. Please how you exactly mean client move? When a client will move an object, server may not get its position then, so if I understand well what you have written, it can't be done.
It seems there is no better solution than that timer though. I've tried OnObjectMoved, but looks like it's being called even more often, when I move objects to 0.2points distance and recalculate then collisions in that callback. I think callback would be better solution, but for unknown reason, it simply freezes the server when it has to calculate 15+1 balls (upon first turn naturally all 16 balls collisions are being processed). So I'm a way confused.