I took a quick look in your GMK and it was solved easily.
First thing I noticed is that your Convert_2d script is not the original. So now wonder it misbehaves.... replace it with this, the correct one:
// Convert_2d(x,y,xfrom,yfrom,zfrom,view)
// The script returns the 3d x and y coordinates at z = 0
screenx = 2*argument0/view_wview[argument5]-1;
screeny = 1-2*argument1/view_hview[argument5];
mX = dX + uX*screeny + vX*screenx;
mY = dY + uY*screeny + vY*screenx;
mZ = dZ + uZ*screeny + vZ*screenx;
if mZ != 0
begin
x_3d = argument2 - argument4 * mX / mZ;
y_3d = argument3 - argument4 * mY / mZ;
end;
else
begin
x_3d = argument2 - argument4 * mX;
y_3d = argument3 - argument4 * mY;
end;Secondly, no wonder it's not accurate, you're having your game world's surface at z = 32, while the 2d-to-3d calculates the 3d position at z = 0, genius!

What you need to do is translate the conversion scripts to be 32 z-units higher. Pretty easy, just replace the conversion bit in the step event with this:
Convert_Prepare(xfrom,yfrom,zfrom-32,xto,yto,zto-32,xup,yup,zup,angle,view_wview/view_hview)
Convert_2d(mouse_x,mouse_y,xfrom,yfrom,zfrom-32,0);
global.mx = x_3d;
global.my = y_3d;
Thirdly, don't you think it's kind of pointless to do a 3d-to-2d to find out where the cursor position on the screen is? It's just mouse_x mouse_y!
Lastly, I would suggest you use scripts next time in the GMK. You can't have multiple code windows open with loose pieces of code, which is slowing down your oversight and development progress.
Good luck