forked from minetest-mods/MoreMesecons
7cf99da1a5
Data associated to a LuaBlock is redundantly stored in both its metadata and in the mod storage so that it is not possible to hack a LuaBlock by changing its metadata or copying it using WorldEdit. This commit changes how it is done: * Store full code instead of storing MD5 checksum, which avoids bug caused by serializing non-ASCII strings using minetest.serialize, * Also store owner, * Use `minetest.hash_node_position` instead of deprecated vector_extras set_data_to_pos etc, * Remove mod storage data associated with the LuaBlock when destroying it, * Create helper functions for manipulating the mod storage in moremesecons_utils, I will soon update other parts of MoreMesecons as well to use them. This commit breaks backwards compatibility: previously created LuaBlocks will have to be reset by opening the formspec and pressing the `Submit` button. This commit also fixes an unrelated bug: code in the formspec was not correctly escaped using minetest.formspec_escape.
105 lines
2.7 KiB
Lua
105 lines
2.7 KiB
Lua
moremesecons = {}
|
|
|
|
function moremesecons.setting(modname, settingname, default, min)
|
|
local setting = "moremesecons_" .. modname .. "." .. settingname
|
|
|
|
if type(default) == "boolean" then
|
|
local ret = minetest.settings:get_bool(setting)
|
|
if ret == nil then
|
|
ret = default
|
|
end
|
|
return ret
|
|
elseif type(default) == "string" then
|
|
return minetest.settings:get(setting) or default
|
|
elseif type(default) == "number" then
|
|
local ret = tonumber(minetest.settings:get(setting)) or default
|
|
if not ret then
|
|
minetest.log("warning", "[moremesecons_"..modname.."]: setting '"..setting.."' must be a number. Set to default value ("..tostring(default)..").")
|
|
ret = default
|
|
elseif ret ~= ret then -- NaN
|
|
minetest.log("warning", "[moremesecons_"..modname.."]: setting '"..setting.."' is NaN. Set to default value ("..tostring(default)..").")
|
|
ret = default
|
|
end
|
|
if min and ret < min then
|
|
minetest.log("warning", "[moremesecons_"..modname.."]: setting '"..setting.."' is under minimum value "..tostring(min)..". Set to minimum value ("..tostring(min)..").")
|
|
ret = min
|
|
end
|
|
return ret
|
|
end
|
|
end
|
|
|
|
-- Storage helpers
|
|
|
|
function moremesecons.get_storage_data(storage, name)
|
|
return {
|
|
tab = minetest.deserialize(storage:get_string(name)) or {},
|
|
name = name,
|
|
storage = storage
|
|
}
|
|
end
|
|
|
|
function moremesecons.set_data_to_pos(sto, pos, data)
|
|
sto.tab[minetest.hash_node_position(pos)] = data
|
|
sto.storage:set_string(sto.name, minetest.serialize(sto.tab))
|
|
end
|
|
|
|
function moremesecons.get_data_from_pos(sto, pos)
|
|
return sto.tab[minetest.hash_node_position(pos)]
|
|
end
|
|
|
|
function moremesecons.remove_data_from_pos(sto, pos)
|
|
sto.tab[minetest.hash_node_position(pos)] = nil
|
|
sto.storage:set_string(sto.name, minetest.serialize(sto.tab))
|
|
end
|
|
|
|
-- Vector helpers
|
|
-- All the following functions are from the vector_extras mod (https://github.com/HybridDog/vector_extras).
|
|
-- If you enable that mod, its functions will be used instead of the ones defined below
|
|
|
|
if not vector.get_data_from_pos then
|
|
function vector.get_data_from_pos(tab, z,y,x)
|
|
local data = tab[z]
|
|
if data then
|
|
data = data[y]
|
|
if data then
|
|
return data[x]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if not vector.set_data_to_pos then
|
|
function vector.set_data_to_pos(tab, z,y,x, data)
|
|
if tab[z] then
|
|
if tab[z][y] then
|
|
tab[z][y][x] = data
|
|
return
|
|
end
|
|
tab[z][y] = {[x] = data}
|
|
return
|
|
end
|
|
tab[z] = {[y] = {[x] = data}}
|
|
end
|
|
end
|
|
|
|
if not vector.remove_data_from_pos then
|
|
function vector.remove_data_from_pos(tab, z,y,x)
|
|
if vector.get_data_from_pos(tab, z,y,x) == nil then
|
|
return
|
|
end
|
|
tab[z][y][x] = nil
|
|
if not next(tab[z][y]) then
|
|
tab[z][y] = nil
|
|
end
|
|
if not next(tab[z]) then
|
|
tab[z] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
if not vector.unpack then
|
|
function vector.unpack(pos)
|
|
return pos.z, pos.y, pos.x
|
|
end
|
|
end
|