Vertical thrusters are good but also suck. It depends on how you use them. Like I said I use mine at an angle mainly to flare my ship as i re-enter the atmosphere at full throttle to give me some upwards thrust as I try to throttle forward without hitting the stall angle. I have used vertical thrusters in the alpha to try VTOL with cargo haulers (think the shuttle in Star ship troopers) but medium containers instead of marines. So I can explain it as best I can below, and while implementing the actions are simple, they can quickly get complicated.
So the codex has the api for what to call, but dosen't really explain how to implement this in the LUA scripts. I recommend watching some videos or going to LUA.org but here is a brief overview
Click on your pilot seat -> Advanced -> Edit LUA
You are going to be interested mainly in the "UNIT" and "SYSTEM" slots; here you will see a Start() and Stop() function and you can another filter called Tick().
Now in programming "Update" is called every frame and is frame rate dependent unless they system has a "fixed update" which is usually a set interval (UNITY uses this for physics calculations) DU uses tick but in a diffrent way. In LUA you will have "Update" (as stated above) "Flush" this is used in the physics calculations in DU for and is called automatically. and "TICK" this can be used as a timer to do a single event every time N has complected its duration. This TICK is done in UNIT slot, and I could for example have it fire a weapon, or hit my brakes every 30 seconds. You get the idea.
Now System is where actions are managed (key board input, and casing does count) actionStart(action) would trigger when I press a key Down, actionStop when a key is released. The last is neat its actionLoop, which does the event while the key is held down, like an update function; this would be used for movement like applying brakes.
Now for any engines you put in the vertical or slanted orientation, you will have to make a custom group (this just makes it easier to identify and control)
Once done you could make it so when you enter the flight seat you could run "activate()" this would start the engines at full power letting you take off from the ground quickly.
Or you could "setThrust(thrust)" this sets the engine thrust between 0 and maxThrust in Newtons.
What i did was use "toggle()" and a combination of "getDistanceToObstabcle()" which reterns a value in meters of the first object detected in the direction of thrust (I uses this to know when I'm near my construct landing platform, and when that value is equal to or less than 50, it throttles back the thrust of the engine to lower me to the platform without me having to hold Alt+C)
and the other thing I do is do a call to the Core unit. "getConstructWorldPos()" it returns a vector 3 (x, y, z) position and "getAltitude()" which returns your height above sea level in meters, with respect to the closest planet (other wise in space it returns a null or 0 value) "g()" returrns you local gravitaiton acceleration in m/s^2 and "getVelocity()" returns your constructs liniear velocity in m/s
So you want to let your engines in the vertical pos when your construct is over n-speed and h-height. in my case i chose a speed of 600 m/s and a height of 1800 meters above sea level. here is where they would toggle off, adding in my actual code would be kind of tedious and confusing, so I will post an example and a link to an alpha video about scripting.
but if i wanted to write out what my constructs velocity is i would do something like:
local VariableName = method
by defualt it would looking like this:
local constructVelocity = vec3(core.getWorldVelocity())
if you watch this video this is an example of how you can do in-game progam:
and this is a post about LUA programing in general.