summaryrefslogtreecommitdiff
path: root/common.lua
diff options
context:
space:
mode:
Diffstat (limited to 'common.lua')
-rwxr-xr-xcommon.lua144
1 files changed, 144 insertions, 0 deletions
diff --git a/common.lua b/common.lua
new file mode 100755
index 0000000..6a92198
--- /dev/null
+++ b/common.lua
@@ -0,0 +1,144 @@
+----------------------
+-- Vector functions --
+----------------------
+
+function vector.cross(a, b)
+ return {
+ x = a.y * b.z - a.z * b.y,
+ y = a.z * b.x - a.x * b.z,
+ z = a.x * b.y - a.y * b.x
+ }
+end
+
+function vector.dot(a, b)
+ return a.x * b.x + a.y * b.y + a.z * b.z
+end
+
+-----------------------
+-- Facedir functions --
+-----------------------
+
+function minetest.facedir_to_top_dir(facedir)
+ return ({[0] = {x = 0, y = 1, z = 0},
+ {x = 0, y = 0, z = 1},
+ {x = 0, y = 0, z = -1},
+ {x = 1, y = 0, z = 0},
+ {x = -1, y = 0, z = 0},
+ {x = 0, y = -1, z = 0}})
+ [math.floor(facedir / 4)]
+end
+
+function minetest.facedir_to_right_dir(facedir)
+ return vector.cross(
+ minetest.facedir_to_top_dir(facedir),
+ minetest.facedir_to_dir(facedir)
+ )
+end
+
+directions = {}
+function directions.side_to_dir(side)
+ return ({[0] = vector.new(),
+ vector.new( 0, 1, 0),
+ vector.new( 0, -1, 0),
+ vector.new( 1, 0, 0),
+ vector.new(-1, 0, 0),
+ vector.new( 0, 0, 1),
+ vector.new( 0, 0, -1)
+ })[side]
+end
+
+function directions.dir_to_side(dir)
+ local c = vector.dot(dir, vector.new(1, 2, 3)) + 4
+ return ({6, 2, 4, 0, 3, 1, 5})[c]
+end
+
+----------------------
+-- String functions --
+----------------------
+
+--[[function string.split(str, sep)
+ local fields = {}
+ local index = 1
+ local expr = "([^"..sep.."])+"
+ string.gsub(str, expr, function(substring)
+ fields[index] = substring
+ index = index + 1
+ end)
+ return fields
+end]]
+
+function string.startswith(str, substr)
+ return str:sub(1, substr:len()) == substr
+end
+
+---------------------
+-- Table functions --
+---------------------
+
+function table.contains(tbl, element)
+ for _, elt in pairs(tbl) do
+ if elt == element then
+ return true
+ end
+ end
+ return false
+end
+
+function table.extend(tbl, tbl2)
+ local index = #tbl + 1
+ for _, elt in ipairs(tbl2) do
+ tbl[index] = elt
+ index = index + 1
+ end
+end
+
+function table.recursive_replace(tbl, pattern, replace_with)
+ if type(tbl) == "table" then
+ local tbl2 = {}
+ for key, value in pairs(tbl) do
+ tbl2[key] = table.recursive_replace(value, pattern, replace_with)
+ end
+ return tbl2
+ elseif type(tbl) == "string" then
+ return tbl:gsub(pattern, replace_with)
+ else
+ return tbl
+ end
+end
+
+------------------------
+-- Formspec functions --
+------------------------
+
+fs_helpers = {}
+function fs_helpers.on_receive_fields(pos, fields)
+ local meta = minetest.get_meta(pos)
+ for field, value in pairs(fields) do
+ if field:startswith("fs_helpers_cycling:") then
+ local l = field:split(":")
+ local new_value = tonumber(l[2])
+ local meta_name = l[3]
+ meta:set_int(meta_name, new_value)
+ end
+ end
+end
+
+function fs_helpers.cycling_button(meta, base, meta_name, values)
+ local current_value = meta:get_int(meta_name)
+ local new_value = (current_value + 1) % (#values)
+ local text = values[current_value + 1]
+ local field = "fs_helpers_cycling:"..new_value..":"..meta_name
+ return base..";"..field..";"..text.."]"
+end
+
+---------
+-- Env --
+---------
+
+function minetest.load_position(pos)
+ if minetest.get_node_or_nil(pos) then
+ return
+ end
+ local vm = minetest.get_voxel_manip()
+ vm:read_from_map(pos, pos)
+end \ No newline at end of file