With the ducking, that may be because you are using InKey$() which only alows you to be pressing one key at a time. Try using scancodes.
Also, if you have in your loop
Y# = Get ground height(1,X#,Z#) + 30
then, after it you have
if inkey$()="z" then Y# = Y# - 30
Well, it's not going to work is it?
You are setting the value of Y# at the start, then, changing that value to Y# = Y# - 30 just at the end, then, next loop, it goes back to the original value.
Try changing it so that when "z" is pressed, it sets a variable, then use that variable to set the ground height.
ie
`I changed the line Y# = Get ground height(1,X#,Z#) to this:
If crouch = 1
Y# = Get ground height(1,X#,Z#) - 30
Else
Y# = Get ground height(1,X#,Z#)
EndIf
`This is where you set the value of 'crouch'
If InKey$() = "z" And crouch = 0 Then crouch = 1
If InKey$() = "x" And crouch = 1 Then crouch = 0
That will allow you to do the crouching effect you are after.
Quote: "Do I need a phantom invisible object floating in front of me"
That's the way it's ussually done... And in that manner, you can get collisions, jumping, and everything, by moving the object, and posisionig the camera where the object is.
For Jumping, there are so many different ways of doing it... You just have to figure one out for yourself really ( best way to learn ) If you can't, however, have a look in the codebase.
Quote: "shooting more than one bullet at a time "
Search the forums for "Machine Gun" or somethign along those lines, and have a look at the thread started by Northen_Fist cos I did a good example of multiple fire in there.
Hope I Helped...

Team EOD :: Programmer/Logical Engineer/All-Round Nice Guy