If you plan on creating bases through script, setPosATL and getPosATL will be your friends. Other commands like getPos or getPosASL will return the position relative to any objects that are underneath / to the terrain. I wrote a base building helper script and through multiple tests, I have found that getPosATL is the absolute best way to get position for objects that are over land.
Description
Sets the position of an object relative to the terrain.
Syntax
object setPosATL pos
Parameters:
object: Objectpos: PositionATL
Returns: Nothing
Examples
Example 1
player setPosATL [getPosATL player select 0, (getPosATL player select 1) - 10, getPosATL player select 2];
See also
getPosATL · getPos · getPosASL · setPos · setPosASL
Community notes
As of Verson 2.10, if you use setPosX commands on a remote unit within a vehicle, the unit will remain in the vehicle. In order to avoid this, remoteExec the command to the remote client.
if !(isNull objectParent _unit) then {
[_unit, [0,0,0]] remoteExec ["setPosATL", _unit];
};