It looks pretty good to me for a first JASS spell actually.
The "Pull" function can be optimized a bit though. Removing the BJ functions with their math equivalents will give a boost in speed, since JASS function calls are kind of slow. (And you're calling this function 33+ times per second...
Wait 0.10 seconds
Don't use waits for such things. They are inaccurate. Just remove them and create the units at different distances from the caster. (E.g. 60,80,100,120,140. The bullets will have 20 distance in between. But if you really want to spawn the bullets on intervals...
The above poster (Accname) makes a good point about your variable-usage. It is better if you use arrays.
The problem with that is though, you are already using arrays! And, judging by your code, 12 (16?) fields are used. One for each player.
Here's some real magic, let's say you could...
an arrayIndexOverflow happens when you use an invalid integer as an index. (E.g. the array is given size "10" in gui, making it 11 big (0~10), any number other than 0~10 will give this error.)
Check your arrays for their sizes.
Try making them bigger and see if any errors will then be thrown.
I could do some triggering, data editing and terraining.
Though, preferably, I would want to do triggering, as long as there will be a way for me to just type out the code instead of this slow GUI in there right now.
Isn't it possible to, by use of making your own cliffs with the height tool, as well as some clever pathing map editing, to get the same result?
The only problem that remains then is some fiddling with fog of war.
And seeing how you can just replace attack damage effects with these kinds of things, as well as add/remove weapons...
I guess it's easily possible to construct something awesome in the data editor with this.
You need to make an integer variable to be looped.
Variable: <the int var you made>
start: <the lowest int value that it has to use, 1 by default>
end: <the highest int value that it should use, 10 by default>
increment: <how much the variable is increased by each loop>