+skycraft.schems = {}
+
+function skycraft.get_schem(schemname)
+ return skycraft.schems[schemname].data
+end
+
+function skycraft.get_schem_raw(schemname)
+ return skycraft.schems[schemname].raw
+end
+
+function skycraft.load_schem(schemname)
+ local schem = {}
+ local file = io.open(skycraft.modpath .. "/schems/" .. schemname .. ".we", "r")
+ schem.raw = file:read()
+ file:seek("set")
+ local _, _, contents = file:read("*number", 1, "*all")
+ file:close()
+ schem.data = minetest.deserialize(contents)
+ skycraft.schems[schemname] = schem
+end
+
+function skycraft.check_schem(pos, schemname)
+ local schem = skycraft.get_schem(schemname)
+ for _, n in pairs(schem) do
+ if minetest.get_node(vector.add(pos, n)).name ~= n.name then
+ return false
+ end
+ end
+ return true
+end
+
+function skycraft.remove_schem(pos, schemname)
+ local schem = skycraft.get_schem(schemname)
+ for _, n in pairs(schem) do
+ minetest.remove_node(vector.add(pos, n))
+ end
+end
+
+function skycraft.add_schem(pos, schemname)
+ local schem_raw = skycraft.get_schem_raw(schemname)
+ worldedit.deserialize(pos, schem_raw)
+end