Example map for an n-level elevator with moving glass doors
in this example, the elevator has four levels, but can be extended to unlimited levels.
The elevator is build as func_train as well as the doors.
It travels to the desired stations path_corner, which are set as the trains next pathcorner via changetargets. The trick here is, the path_corners are not linked as you would normally do. Instead the func_trains next target is set to the desired path_corner by a changetarget.
The evelevators inner doors travel with the cabin on seperate path_corners. On arrival on the desired station, the doors next pathcorner are changed to the opening positions path corners. Each level has a call button, which target is relinked to two multimanagers depending on the cabin is already in position or not.
When the cabin reaches the desired path_corner the fire on pass will trigger a multimanager, to relink and open the doors.
The inner doors consist of two different func_train brush entities, since the glass needs render mode set to texture.
The elevators outer doors are simple func_door and triggered by multimanager on arrival of the cabin or by pressing the call button.
The visible buttons are no buttons, they are func_wall to indicate the elevator is active or not. The real buttons are invisible brush func_button, covered by aaatrigger texture in front of them. The elevator sign is a func_wall and starts its animation when the elevator is moving.
Finally, not to screw up the sequence by pressing multiple buttons while the cabin is moving, the buttons are locked by a multisource as master as long the elevator as well as his doors is active.
It can be used in multiplayer games as well, since all actions can be initiated regardless of the last stop position.
Update: now with control room
Also, this reminds me of an essay I've watched recently about the many ways elevators are used in video games, it's a good watch.