
From what I can tell with jd-gui, it seems the following blocks are considered "ground":
minecraft:bedrock
minecraft:clay // edit: corrected with help from https://raw.githubusercontent.com/KevyP ... fields.csv
minecraft:dirt
minecraft:grass
minecraft:gravel
minecraft:obsidian
minecraft:sand // including red sand
minecraft:farmland
// edit: I notice hardened clay aka terracotta is missing from the list, although this is not surprising, given that it was added in Minecraft 1.6.1, and Millenaire was started well before then.
"ceiling" blocks (I haven't entirely figured out how these are handled differently from "ground" blocks):
minecraft:stone // which includes andesite, diorite, and granite, whether polished or not.
minecraft:sandstone // including red sandstone
"fluid" blocks:
minecraft:water
minecraft:flowing_water
minecraft:lava
minecraft:flowing_lava
// modded fluid blocks could easily be detected as well, since they nearly always extend net.minecraftforge.fluids.BlockFluidBase
"artificial" blocks (having one of these as the top solid block prevents a new building from being added there, not sure if covering with an unknown block such as sandy dirt changes that):
minecraft:water
minecraft:flowing_water // um, aren't these redundant with the fluid blocks?
minecraft:ice // edit: corrected
minecraft:flowing_lava
minecraft:lava
minecraft:planks
minecraft:cobblestone
minecraft:brick_block
minecraft:chest
minecraft:glass
millenaire:earth_deco // dirt wall
millenaire:stone_deco // mud brick, cooked brick, gold ornament
millenaire:wood_deco // timber frames, thatch
// seems to me that also treating any block that returns true to the hasTileEntity method as artificial would be good - that would automatically cover furnaces, hoppers, droppers, dispensers, and most mod-added chests and machines.