104 lines
2.2 KiB
Lua
104 lines
2.2 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2020 Joachim Stolberg
|
|
|
|
AGPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
Storage backend for node related data as node metadata
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local M = minetest.get_meta
|
|
|
|
local storage = techage.storage
|
|
|
|
-------------------------------------------------------------------
|
|
-- Marshaling
|
|
-------------------------------------------------------------------
|
|
local use_marshal = minetest.settings:get_bool('techage_use_marshal', false)
|
|
local MAR_MAGIC = 0x8e
|
|
|
|
-- default functions
|
|
local serialize = minetest.serialize
|
|
local deserialize = minetest.deserialize
|
|
|
|
if use_marshal then
|
|
if not techage.IE then
|
|
error("Please add 'secure.trusted_mods = techage' to minetest.conf!")
|
|
end
|
|
local marshal = techage.IE.require("marshal")
|
|
if not marshal then
|
|
error("Please install marshal via 'luarocks install lua-marshal'")
|
|
end
|
|
|
|
serialize = marshal.encode
|
|
|
|
deserialize = function(s)
|
|
if s ~= "" then
|
|
if s:byte(1) == MAR_MAGIC then
|
|
return marshal.decode(s)
|
|
else
|
|
return minetest.deserialize(s)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------
|
|
-- API functions
|
|
-------------------------------------------------------------------
|
|
local api = {}
|
|
|
|
function api.get_mapblock_data(key)
|
|
return {}
|
|
end
|
|
|
|
function api.store_mapblock_data(key, mapblock_data)
|
|
for key, item in pairs(mapblock_data) do
|
|
if key ~= "in_use" then
|
|
local pos = item and item._POS_
|
|
if pos then
|
|
item._POS_ = nil
|
|
local data = serialize(item)
|
|
item._POS_ = pos
|
|
local meta = M(pos)
|
|
meta:set_string("ta_data", data)
|
|
meta:mark_as_private("ta_data")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function api.get_node_data(pos)
|
|
local tbl = {}
|
|
local s = M(pos):get_string("ta_data")
|
|
|
|
if s ~= "" then
|
|
tbl = deserialize(s) or {}
|
|
end
|
|
tbl._POS_ = table.copy(pos)
|
|
|
|
return tbl
|
|
end
|
|
|
|
-- Meta data can't be written reliable at shutdown,
|
|
-- so we have to store/restore the data differently
|
|
function api.freeze_at_shutdown(data)
|
|
storage:set_string("shutdown_nodedata", serialize(data))
|
|
end
|
|
|
|
function api.restore_at_startup()
|
|
local s = storage:get_string("shutdown_nodedata")
|
|
if s ~= "" then
|
|
return deserialize(s) or {}
|
|
end
|
|
return {}
|
|
end
|
|
|
|
return api
|