Yal's 3D Platform Engine by Yal (Rosina W.)
What is this?
It's a FPS engine featuring full 3D collisions! Well, almost. You can use any shape for your level buildblocks, but they have to either be rectangular slopes that align to the X-Y grid (unless you're good with trigonometry, which allows rotated rectangular slopes) or their vertical edges has to be flat (aka, for all Z values, the section between an xy-plane and the shape has to have the same shape). But that's not really important; you can make slopes and you can make blocks, cylinders and prisms. That should take care about more or less everything you need for a normal FPS or a Metroid Prime-like game.

The key idea is that when I check for collisions, I first check if the object "collides" with the other object along the z-axis. If so, I check for a collision in the XY-plane. Game Maker is infamous for slow collision checking, so by comparing Z values first I save processing power.

Also, the player can step up small hurldes, making landing on an edge a little nicer. This is also abused for the slope systems: slopes aren't really slopes. They're actually moving vertical platforms that move so that they're always at the player's feet height (they can't go higher or lower than where the slope ends, though) and when the player moves up a slope, he's actually moving up a stairway.

Obviously, this approach isn't very suitable for enemies walking on slopes, so if possible, just don't have your enemies walk on slopes and you'll save yourself some work.

ALSO; NOTE: z values are positive upwards. If you're used to platformer games in 2D where y values are positive downwards, you might get a smaller headache here.

May I use this for my game?
Sure! I'd be very happy if you credited me (Yal) for the engine groundwork, so you'd better do that somewhere visible.

Also note that even though all the objects provided in this engine will function at any Z value, there's no editor for that right now so you can only place them on z = 0. If you want loads of vertical levels, you could either make level creator objects that e.g. creates walls and stuff on top of each other (first create the instance, then set its new z value, and finally let it perform event_user(0) to adapt its top and bottom values to the new z coordinate) or just write your own darn level editor <_<