^hey, I'm about that old too! xD
Anyways, I don't think that line-line intersection is the way to go, but instead to use simple dead reckoning.
So, you have your player's direction vector (X), your player's velocity (v1), your player's position (XPos), your AI's direction vector (Y), your AI's position vector (YPos), and your bullets velocity (v2).
v1 and v2 are scalars, X, P, and Y are vectors.
So, we're using simple dead reckoning, which basically means that we're going to assume that, in t amount of time, the player's position will be:
NewPlayerPos=t*v1*X+P
if you're not familiar with vector math, that means that:
NewPlayerPos.x=t*v1*X.x+P.x
NewPlayerPos.y=t*v1*X.y+P.y
NewPlayerPos.z=t*v1*X.z+P.z
[without the z vector if you're working in 2d]
To explain what's going on here, multiplying time by velocity (t*v1) gives us distance. Multiplying a unit vector (length 1) by a distance, gives us a vector with a length t*v1, and then we add that to our position.
So, in a given amount of time:
NewPlayerPos=t*v1*X+XPos
The problem is that the bullet is also moving.
NewBulletPos=t*v2*Y+YPos
(the bullet is fired from position ypos in direction Y, at speed v2, travelling for t time)
Now, since NewPlayerPos=NewBulletPos when the two things collide, we say:
t*v1*X+XPos=t*v2*Y+YPos
Now... we need to solve for X (the direction in which the bullet was fired), and we need to get rid of t - it's just an intermediate variable. The problem is that solving for X is not as simple as it might sound.
we can use multiplication and addition to simplify the equation to this:
t*v1*X-t*v2*Y=Ypos-Xpos
but (v1*X-v2*Y) is a vector quantity. We can't just take out the t and divide by a vector. Since Y is what we want to solve for, we can do this:
t*v2*Y=t*v1*X-Ypos+Xpos
Now, we need to get rid of t, and most other ways of solving for t give us t as a function of Y, but we need to solve for both! What I did was to take the length of both sides. If you weren't aware, the length of a vector <a,b,c> is sqrt(a^2+b^2+c^2). We're also going to square both sides to get rid of the square root.
t^2*v2^2*(Y.x^2+Y.y^2+Y.z^2)=...
(I didn't find the length of the right side of the equation yet, for reasons i'll explain)
Now, we already stated that Y has direction only, meaning it has a length of one! That means that the left side of our equation simplifies to
t^2*v2^2=...
Now the right side of the equation... It's a big term. The vector on the right side is the length squared of t*v1*X-Ypos+Xpos. thats:
[t*v1*X.x-Ypos.x+Xpos.x]
[t*v1*X.y-Ypos.y+Xpos.y]
[t*v1*X.z-Ypos.z+Xpos.z]
We have to square that and add it all up, which will be a pain in the arse. We can simplify it a bit, and create another vector.
Q=Xpos-Ypos
So... ugh, here we go:
t^2*v2^2=(t*v1*X.x+Q.x)^2+(t*v1*X.y+Q.y)^2+(t*v1*X.z+Q.z)^2
=t^2*v1^2*X.x^2 + 2*t*v1*X.x*Q.x + Q.x^2
+t^2*v1^2*X.y^2 + 2*t*v1*X.y*Q.y + Q.y^2
+t^2*v1^2*X.z^2 + 2*t*v1*X.z*Q.z + Q.z^2
well, if we look closely enough, we can simplify that a bit:
t^2*v2^2*(X.x^2+X.y^2+X.z^2)
+ 2*t*v1*(X.x*Q.x+X.y*Q.y+X.z*Q.z)
+ Q.x^2+Q.y^2+Q.z^2
Now, X is also a unit vector, so that coefficient of t^2*v1^2 is equal to one, and it disappears!
Also, we can use some shorthand notation. First of all, the length of a vector V is symbolized as ||V||, so that last term is ||Q||^2. The second term, you'll find a massive pain if you haven't already studied dot product. Basically, in vector math, the dot product of two vectors is as follows dot(<a1,a2,a3>,<b1,b2,b3>

=a1*b1+a2*b2+a3*b3. It can also be represented as A.B. So, our equation is now:
t^2*v2^2=t^2*v1^2 + 2*t*v1*X.Q + ||Q||^2
So,
t^2*(v2^2-v1^2)-t*(2*v1*X.Q)-||Q||^2=0
look familiar? It's a quadratic equation!
We can finally solve for t!
t=(2*v1*X.Q +- sqrt(4*v1^2*(X.Q)^2+4*(v2^2-v1^2)*||Q||^4))/(2*(v2^2-v1^2))
which we can simplify a little:
t=(v1*X.Q +- sqrt(v1^2*(X.Q)^2+(v2^2-v1^2)*||Q||^4))/(v2^2-v1^2)
okay, so we have TWO values for t. I'm not sure which to use. You could probably prove that one value of t is always positive and the other is always negative, and then discard the negative value (One solution going back in time, one solution going forward in time), but I don't want to do anything with that giant equation except plug numbers in. My advice: Calculate both values of t, choose the lowest nonnegative one.
Now, of course, solving the vector equation is trivial!
t*v1*X+XPos=t*v2*Y+YPos
Y=(t*v1*X+XPos-YPos)/(t*v2)
and voila. Shoot your bullet in the direction of y.
in summation:
Q=Xpos-Ypos
t=(v1*X.Q +- sqrt(v1^2*(X.Q)^2+(v2^2-v1^2)*||Q||^4))/(v2^2-v1^2)
Y=(t*v1*X+Q)/(t*v2)
and y is your answer.
code would look painful:
//code for that would look like
global retvectorx as float
global retvectory as float
global retvectorz as float
function calculateShootDirection(bulletvel as float, targetvel as float, BulletPosx as float, BulletPosy as float, BulletPosz as float, PlayerPosx as float, PlayerPosy as float, PlayerPosz as float, PlayerDirx as float, PlayerDiry as float, PlayerDirz as float)
Qx as float
Qy as float
Qz as float
t1 as float
t2 as float
PlayerDirDotQ as float
QLengthSq as float
v1 as float
v2 as float
v1sq as float
v2sq as float
v2sqminusv1sq as float
Qx=PlayerPosX-BulletPosX
Qy=PlayerPosY-BulletPosY
Qz=PlayerPosZ-BulletPosZ
XdotQ=Qx*PlayerDirx+Qy*PlayerDiry+Qz*PlayerDirz
QLengthSq=Qx*Qx+Qy*Qy+Qz*Qz
v1=targetvel
v2=bulletvel
v1sq=v1*v1
v2sq=v2*v2
v2sqminusv1sq=v2sq-v1sq
quadterm1#=v1*XdotQ
quadterm2#=sqrt(v1sq*XdotQ*XdotQ+v2sqminusv1sq*QLengthSq*QLengthSq)
quadterm3#=v2sqminusv1sq
t1=(quadterm1#+quadterm2#)/quadterm3#
t2=(quadterm1#-quadterm2#)/quadterm3#
if(t1<0) then t=t1
if(t2<0) then t=t2
//Y=(t*v1*X+Q)/(t*v2)
retvectorx=(t*v1*PlayerDirx+Qx)/(t*v2)
retvectory=(t*v1*PlayerDiry+Qy)/(t*v2)
retvectorz=(t*v1*PlayerDirz+Qz)/(t*v2)
endfunction
[edit]
and if I made a mistake: God help us all.
[edit2]
and the massive post is mostly just because I'm explaining every step I make. If you were already familiar with dot products and direction vectors and vector equations I might not have, but oh well.
It's also worth noting that, because you can have a vector with any number of dimensions (<4,5,1,6,3,5,4> is a valid vector), the above solution works in 1d, 2d, 3d, 4d, 5d, etc. Just increase/decrease the number of arguments, and the calculations of dot product and length.

Why does blue text appear every time you are near?