sqlite3 support added, furnace bugfix
This commit is contained in:
parent
376e29b854
commit
f558351246
15
README.md
15
README.md
@ -35,7 +35,8 @@ Textures: CC BY-SA 3.0
|
|||||||
### Dependencies
|
### Dependencies
|
||||||
Required: default, doors, bucket, stairs, screwdriver, basic_materials, tubelib2, minecart, lcdlib, safer_lua
|
Required: default, doors, bucket, stairs, screwdriver, basic_materials, tubelib2, minecart, lcdlib, safer_lua
|
||||||
Recommended: signs_bot, hyperloop, compost, techpack_stairway, autobahn
|
Recommended: signs_bot, hyperloop, compost, techpack_stairway, autobahn
|
||||||
Optional: unified_inventory, wielded_light, unifieddyes
|
Optional: unified_inventory, wielded_light, unifieddyes, lua-mashal, lsqlite3
|
||||||
|
|
||||||
|
|
||||||
The mods `default`, `doors`, `bucket`, `stairs`, and `screwdriver` are part of Minetest Game.
|
The mods `default`, `doors`, `bucket`, `stairs`, and `screwdriver` are part of Minetest Game.
|
||||||
|
|
||||||
@ -55,21 +56,21 @@ It is highly recommended that you install the following mods, too:
|
|||||||
* [techpack_stairway](https://github.com/joe7575/techpack_stairway): Ladders, stairways, and bridges for your machines
|
* [techpack_stairway](https://github.com/joe7575/techpack_stairway): Ladders, stairways, and bridges for your machines
|
||||||
* [autobahn](https://github.com/joe7575/autobahn): Street blocks and slopes with stripes for faster traveling
|
* [autobahn](https://github.com/joe7575/autobahn): Street blocks and slopes with stripes for faster traveling
|
||||||
|
|
||||||
|
For large servers with many player, the following packages are recommended:
|
||||||
|
|
||||||
### Configuration
|
* `lua-mashal` for faster serialization/deserialization of data
|
||||||
|
* `lsqlite3` for storing node and network data
|
||||||
|
|
||||||
For servers with many players, it is recommended to use the external Lua library 'lua-marshal' to accelarate
|
Both packages are installed via [luarocks](https://luarocks.org/):
|
||||||
the serialization/deserialization of node data and the database SQLite (lsqlite3) to store large amounts of data.
|
|
||||||
To be able to use 'lua-marshal' and 'lsqlite3', install the packages with:
|
|
||||||
|
|
||||||
luarocks install lua-marshal
|
luarocks install lua-marshal
|
||||||
luarocks install lsqlite3
|
luarocks install lsqlite3
|
||||||
|
|
||||||
and add 'techage' to the list of trusted mods in minetest.conf:
|
To enable this `unsafe` packages, add 'techage' to the list of trusted mods in minetest.conf:
|
||||||
|
|
||||||
secure.trusted_mods = techage
|
secure.trusted_mods = techage
|
||||||
|
|
||||||
For the installation of 'luarocks' (if not already available), see: https://luarocks.org/
|
For the installation of 'luarocks' (if not already available), see [luarocks](https://luarocks.org/)
|
||||||
|
|
||||||
If you enable 'lsqlite3' you also have to enable 'lua-marshal'. Available worlds will be converted
|
If you enable 'lsqlite3' you also have to enable 'lua-marshal'. Available worlds will be converted
|
||||||
to 'lsqlite3' and 'lua-marshal', but there is no way back, so:
|
to 'lsqlite3' and 'lua-marshal', but there is no way back, so:
|
||||||
|
@ -1,174 +0,0 @@
|
|||||||
--[[
|
|
||||||
|
|
||||||
TechAge
|
|
||||||
=======
|
|
||||||
|
|
||||||
Copyright (C) 2019 Joachim Stolberg
|
|
||||||
|
|
||||||
GPL v3
|
|
||||||
See LICENSE.txt for more information
|
|
||||||
|
|
||||||
Memory storage system for volatile and non-volatile memory.
|
|
||||||
Non-volatile memory is stored from time to time and at shutdown
|
|
||||||
as node metadata. Volatile memory is lost at every shutdown.
|
|
||||||
|
|
||||||
]]--
|
|
||||||
|
|
||||||
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
|
||||||
|
|
||||||
-- Node data will be stored every NUM_SLOTS * CYCLE_TIME seconds
|
|
||||||
local NUM_SLOTS = 50
|
|
||||||
local CYCLE_TIME = 60
|
|
||||||
local NvmStore = {}
|
|
||||||
local MemStore = {}
|
|
||||||
local NumNodes = 0
|
|
||||||
local StoredNodes = 0
|
|
||||||
local NextNum = 0
|
|
||||||
local Timeslot = 0
|
|
||||||
local FNAME = minetest.get_worldpath()..DIR_DELIM.."techage_metadata.txt"
|
|
||||||
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
|
|
||||||
|
|
||||||
local function read_file()
|
|
||||||
local f = io.open(FNAME, "r")
|
|
||||||
if f ~= nil then
|
|
||||||
local s = f:read("*all")
|
|
||||||
io.close(f)
|
|
||||||
return minetest.deserialize(s) or {}
|
|
||||||
end
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
|
|
||||||
local function write_file(tbl)
|
|
||||||
local s = minetest.serialize(tbl)
|
|
||||||
local f = io.open(FNAME, "w")
|
|
||||||
f:write(s)
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
NvmStore = read_file()
|
|
||||||
|
|
||||||
minetest.register_on_shutdown(function()
|
|
||||||
write_file(NvmStore)
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local function set_metadata(hash, tbl)
|
|
||||||
local pos = minetest.get_position_from_hash(hash)
|
|
||||||
tbl.USED = nil
|
|
||||||
local data = serialize(tbl)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("ta_data", data)
|
|
||||||
meta:mark_as_private("ta_data")
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_metadata(hash)
|
|
||||||
local pos = minetest.get_position_from_hash(hash)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local s = meta:get_string("ta_data")
|
|
||||||
if s ~= "" then
|
|
||||||
return deserialize(s)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function nvm_storage()
|
|
||||||
local ToBeDeleted = {}
|
|
||||||
for hash,tbl in pairs(NvmStore) do
|
|
||||||
NumNodes = NumNodes + 1
|
|
||||||
if tbl.USED then
|
|
||||||
if not tbl.SLOT then
|
|
||||||
tbl.SLOT = NextNum % NUM_SLOTS
|
|
||||||
NextNum = NextNum + 1
|
|
||||||
end
|
|
||||||
if tbl.SLOT == Timeslot then
|
|
||||||
set_metadata(hash, tbl)
|
|
||||||
StoredNodes = StoredNodes + 1
|
|
||||||
end
|
|
||||||
else
|
|
||||||
ToBeDeleted[#ToBeDeleted+1] = hash
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for _,hash in ipairs(ToBeDeleted) do
|
|
||||||
NvmStore[hash] = nil
|
|
||||||
end
|
|
||||||
return #ToBeDeleted
|
|
||||||
end
|
|
||||||
|
|
||||||
local function cyclic_task()
|
|
||||||
local t = minetest.get_us_time()
|
|
||||||
Timeslot = (Timeslot + 1) % NUM_SLOTS
|
|
||||||
NumNodes = 0
|
|
||||||
StoredNodes = 0
|
|
||||||
local deleted = nvm_storage()
|
|
||||||
t = minetest.get_us_time() - t
|
|
||||||
if StoredNodes > 0 then
|
|
||||||
minetest.log("action", "[TA NVM Storage] duration="..t.."us, total="..NumNodes..", stored="..StoredNodes..", deleted="..deleted)
|
|
||||||
end
|
|
||||||
minetest.after(CYCLE_TIME, cyclic_task)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.after(CYCLE_TIME, cyclic_task)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- To get the volatile node data as table
|
|
||||||
function techage.get_mem(pos)
|
|
||||||
local hash = minetest.hash_node_position(pos)
|
|
||||||
if not MemStore[hash] then
|
|
||||||
MemStore[hash] = {}
|
|
||||||
end
|
|
||||||
return MemStore[hash]
|
|
||||||
end
|
|
||||||
|
|
||||||
-- To get the nonvolatile node data as table
|
|
||||||
function techage.get_nvm(pos)
|
|
||||||
local hash = minetest.hash_node_position(pos)
|
|
||||||
if not NvmStore[hash] then
|
|
||||||
NvmStore[hash] = get_metadata(hash) or {}
|
|
||||||
end
|
|
||||||
NvmStore[hash].USED = true
|
|
||||||
return NvmStore[hash]
|
|
||||||
end
|
|
||||||
|
|
||||||
function techage.peek_nvm(pos)
|
|
||||||
local hash = minetest.hash_node_position(pos)
|
|
||||||
return NvmStore[hash] or {}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- To be called when a node is removed
|
|
||||||
function techage.del_mem(pos)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
meta:set_string("ta_data", "")
|
|
||||||
local hash = minetest.hash_node_position(pos)
|
|
||||||
NvmStore[hash] = nil
|
|
||||||
MemStore[hash] = nil
|
|
||||||
end
|
|
Loading…
Reference in New Issue
Block a user