you can't create an 100% custom effect, but you can play with current effects to simulate new styles, like this:
https://www.youtube.com/watch?v=PrEZZ9EPhMM
as you can see on the video, these effects are the same single effect but sent hundred times on different positions. I highly doesn't recommend try the same of this video, because if you send an effect for every tile in an area of 20tiles² this will cost 400 packets just to play an single effect. This last fire effect on the video also cover an 40tiles² area, which is 1600 tiles = 1600 packets (!!!!)
and that's not all, it's 1600 packets for
every player on the screen. If you have 10 players around, the server will send 1600 packets to each one of these players, and this will cost 16.000 packets. Just imagine how laggy this thing could be
of course if you send just a few 4~5 packets this won't cause too many lag and won't stress your server CPU/network. Still not recommended, but in this case that's ok. To make things simple, try use an single function that sends many packets 0c0 (graphical effect) based on custom args, like this:
FireEffect [effectType], [effectID], [color], [...]
Code:
[FUNCTION FireEffect]
FORCLIENTS 18
SENDPACKET 0c0 B<ARGV[0]> D<ARGV[1]> D<ARGV[2]> W<ARGV[3]> ...
SENDPACKET 0c0 B<ARGV[0]> D<ARGV[1]> D<ARGV[2]> W<ARGV[3]> ...
SENDPACKET 0c0 B<ARGV[0]> D<ARGV[1]> D<ARGV[2]> W<ARGV[3]> ...
ENDFOR
you will also need to follow these rules to build the packet 0c0
http://docs.polserver.com/packets/index.php?Packet=0xC0
packets are very sensitive and a single wrong byte can make your client freeze/crash, so you must use B (byte) / W (word) / D (dword) sizes correctly:
-BYTE = 1 byte
-WORD = 2 bytes
-DWORD = 4 bytes