Horses cannot be done properly with the current scripting tools, and I'm no good at importing assets into the engine, which will be necessary since their models and animations are long gone. Ask me again in a year.
This stuff is tricky enough as it is, people. Here's the theory behind the hoverboard, which happens every frame:
The player controls are disabled, otherwise you will hear footsteps when moving.
The player's gravity and fall damage is disabled. Essentially the player is now a floating 3D model that cannot be moved by anything but this script.
A creature (radroach) is placed at the player. The roach's model is disabled to get rid of its appearance and sound. It is invisible, invulnerable, silent, has no AI and cannot be targeted in VATS.
The player's horizontal position is set to be equal to the roach's at all times. The script moves the roach, and the player follows.
The player's height is interpolated towards a certain value above the roach's height. This offset is modified by a small value following a sine curve, as in "height = sin x" where x wraps around from 0 to 360, to simulate the hover "bob".
If the player's height is very close to that of the roach it means we've hit the ground, and the player is thrown of the hoverboard if you fail a ST and AG check.
The roach(not the player) has a speed vector of X, Y and Z. The X and Y, horizontal coordinates, are modified every round by the direction the player is looking, combined with the player's up/down angle. The roach is then moved by these values.
This means if you look straight up or down you will slowly stop. If you look straight ahead in a direction you will accelerate to max speed in that direction. Think of how the Runner moves in Borderlands, and imagine if it were hovering instead of driving.
Another creature (radscorpion) is positioned 8 times in a rough circle around the player, with its height slightly above that of the radroach:
1 8 2 7 X 3 6 4 5X = roach and player
It starts at 1, then continues until it hits 8. The scorpion's size is set to be tiny and its alpha is almost 0, so the player won't notice it.
For each positioning, the radroach is angled towards the scorpion's current location.
If the roach can see the scorpion, nothing happens.
If the roach cannot see the scorpion, it means the scorpion is inside or behind something, like a tree, rock, wall, etc. This is stored in a variable.
At the end of the frame, the roach's speed vector is modified upwards and away from the positions where the roach could not see the scorpion.
If the player's speed is very high and the player is told to move in the opposite direction several times by this procedure, the player will fall.
For example, take the position chart above. The player (actually the roach) zooms forwards (direction 1), and goes close by a rock to the left. This causes the scorpion check to fail at position 8 and 7.
The speed vector is then modified in the opposite directions (3 and 4), resulting in somewhere around direction 2, as well as upwards. This causes the roach (and the player) to move slightly up and to the right and then resume travel forwards.
If the player moves into the rock head-on however, the scorpion is blocked at position 1 and maybe 2 and 8. This means the modifications to the speed vector are large enough to trigger the fall-check, and the player will faceplant into the rock.
Another example, we're zooming out from a cliff into thin air. While the player's gravity is disabled, the roach is still affected by it, and falls down.
Since the player's height is interpolated towards a certain value above that of the roach, the player will start to drop as well.
When the roach hits the ground the player has a speed vector downwards. If the drop was small, this vector will be small enough for the player to resume his height. If the drop was large, the player crashes into the ground and falls off the board.
At least, that's the theory. I haven't built any of this yet, and i'd be amazed if everything went as planned. Let's hope it does!