mirror of
https://github.com/HybridDog/vector_extras.git
synced 2024-11-29 19:03:51 +01:00
184 lines
4.3 KiB
Lua
184 lines
4.3 KiB
Lua
|
vector.meta = vector.meta or {}
|
||
|
vector.meta.nodes = {}
|
||
|
|
||
|
vector.meta.nodes_file = {
|
||
|
load = function()
|
||
|
local nodesfile = io.open(minetest.get_worldpath()..'/vector_nodes.txt', "r")
|
||
|
if nodesfile then
|
||
|
local contents = nodesfile:read('*all')
|
||
|
io.close(nodesfile)
|
||
|
if contents ~= nil then
|
||
|
local lines = string.split(contents, "\n")
|
||
|
for _,entry in ipairs(lines) do
|
||
|
local name, px, py, pz, meta = unpack(string.split(entry, "°"))
|
||
|
vector.meta.set_node({x=px, y=py, z=pz}, name, meta)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end,
|
||
|
save = function() --WRITE CHANGES TO FILE
|
||
|
local output = ''
|
||
|
for x,ys in pairs(vector.meta.nodes) do
|
||
|
for y,zs in pairs(ys) do
|
||
|
for z,names in pairs(zs) do
|
||
|
for name,meta in pairs(names) do
|
||
|
output = name.."°"..x.."°"..y.."°"..z.."°"..dump(meta).."\n"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
local f = io.open(minetest.get_worldpath()..'/vector_nodes.txt', "w")
|
||
|
f:write(output)
|
||
|
io.close(f)
|
||
|
end
|
||
|
}
|
||
|
|
||
|
local function table_empty(tab) --looks if it's an empty table
|
||
|
if next(tab) == nil then
|
||
|
return true
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function vector.meta.nodes_info() --returns an info string of the node table
|
||
|
local tmp = "[vector] "..dump(vector.meta.nodes).."\n[vector]:\n"
|
||
|
for x,a in pairs(vector.meta.nodes) do
|
||
|
for y,b in pairs(a) do
|
||
|
for z,c in pairs(b) do
|
||
|
for name,meta in pairs(c) do
|
||
|
tmp = tmp..">\t"..name.." "..x.." "..y.." "..z.." "..dump(meta).."\n"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return tmp
|
||
|
end
|
||
|
|
||
|
function vector.meta.clean_node_table() --replaces {} with nil
|
||
|
local again = true
|
||
|
while again do
|
||
|
again = false
|
||
|
for x,ys in pairs(vector.meta.nodes) do
|
||
|
if table_empty(ys) then
|
||
|
vector.meta.nodes[x] = nil
|
||
|
again = true
|
||
|
else
|
||
|
for y,zs in pairs(ys) do
|
||
|
if table_empty(zs) then
|
||
|
vector.meta.nodes[x][y] = nil
|
||
|
again = true
|
||
|
else
|
||
|
for z,names in pairs(zs) do
|
||
|
if table_empty(names) then
|
||
|
vector.meta.nodes[x][y][z] = nil
|
||
|
again = true
|
||
|
else
|
||
|
for name,meta in pairs(names) do
|
||
|
if table_empty(meta)
|
||
|
or meta == "" then
|
||
|
vector.meta.nodes[x][y][z][name] = nil
|
||
|
again = true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function vector.meta.complete_node_table(pos, name) --neccesary because tab[1] wouldn't work if tab is not a table
|
||
|
local tmp = vector.meta.nodes[pos.x]
|
||
|
if not tmp then
|
||
|
vector.meta.nodes[pos.x] = {}
|
||
|
end
|
||
|
local tmp = vector.meta.nodes[pos.x][pos.y]
|
||
|
if not tmp then
|
||
|
vector.meta.nodes[pos.x][pos.y] = {}
|
||
|
end
|
||
|
local tmp = vector.meta.nodes[pos.x][pos.y][pos.z]
|
||
|
if not tmp then
|
||
|
vector.meta.nodes[pos.x][pos.y][pos.z] = {}
|
||
|
end
|
||
|
local tmp = vector.meta.nodes[pos.x][pos.y][pos.z][name]
|
||
|
if not tmp then
|
||
|
vector.meta.nodes[pos.x][pos.y][pos.z][name] = {}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function vector.meta.get_node(pos, name)
|
||
|
if not pos then
|
||
|
return false
|
||
|
end
|
||
|
local tmp = vector.meta.nodes[pos.x]
|
||
|
if not tmp
|
||
|
or table_empty(tmp) then
|
||
|
return false
|
||
|
end
|
||
|
local tmp = vector.meta.nodes[pos.x][pos.y]
|
||
|
if not tmp
|
||
|
or table_empty(tmp) then
|
||
|
return false
|
||
|
end
|
||
|
local tmp = vector.meta.nodes[pos.x][pos.y][pos.z]
|
||
|
if not tmp
|
||
|
or table_empty(tmp) then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- if name isn't mentioned, just look if there's a node
|
||
|
if not name then
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
local tmp = vector.meta.nodes[pos.x][pos.y][pos.z][name]
|
||
|
if not tmp
|
||
|
or table_empty(tmp) then
|
||
|
return false
|
||
|
end
|
||
|
return tmp
|
||
|
end
|
||
|
|
||
|
function vector.meta.remove_node(pos)
|
||
|
if not pos then
|
||
|
return false
|
||
|
end
|
||
|
if vector.meta.get_node(pos) then
|
||
|
vector.meta.nodes[pos.x][pos.y][pos.z] = nil
|
||
|
local xarr = vector.meta.nodes[pos.x]
|
||
|
if table_empty(xarr[pos.y]) then
|
||
|
vector.meta.nodes[pos.x][pos.y] = nil
|
||
|
end
|
||
|
if table_empty(xarr) then
|
||
|
vector.meta.nodes[pos.x] = nil
|
||
|
end
|
||
|
else
|
||
|
print("[vector_extras] Warning: The node at "..vector.pos_to_string(pos).." wasn't stored in vector.meta.nodes.")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function vector.meta.set_node(pos, name, meta)
|
||
|
if not (name or pos) then
|
||
|
return false
|
||
|
end
|
||
|
vector.meta.complete_node_table(pos, name)
|
||
|
meta = meta or true
|
||
|
vector.meta.nodes[pos.x][pos.y][pos.z][name] = meta
|
||
|
end
|
||
|
|
||
|
minetest.register_chatcommand('cleanvectormetatable',{
|
||
|
description = 'Tidy up it.',
|
||
|
params = "",
|
||
|
privs = {},
|
||
|
func = function(name)
|
||
|
vector.meta.clean_node_table()
|
||
|
local tmp = vector.meta.nodes_info()
|
||
|
minetest.chat_send_player(name, tmp)
|
||
|
print("[vector_extras] "..tmp)
|
||
|
end
|
||
|
})
|
||
|
|
||
|
vector.meta.nodes_file.load()
|