86 lines
2.5 KiB
Lua
86 lines
2.5 KiB
Lua
local storage = minetest.get_mod_storage()
|
|
local changed_entries = {} -- playername -> true
|
|
|
|
local function get_player_storage(playername)
|
|
local player_storage = digiline_global_memory.store[playername]
|
|
if not player_storage then
|
|
player_storage = minetest.deserialize(storage:get_string(playername)) or {}
|
|
digiline_global_memory.store[playername] = player_storage
|
|
end
|
|
return player_storage
|
|
end
|
|
|
|
-- returns the players memory-names
|
|
function digiline_global_memory.get_keys(playername)
|
|
local keys = {}
|
|
local player_storage = get_player_storage(playername)
|
|
|
|
for key in pairs(player_storage) do
|
|
table.insert(keys, key)
|
|
end
|
|
return keys
|
|
end
|
|
|
|
-- increment and get value
|
|
-- resets the value in store to 0 if it is not a number
|
|
function digiline_global_memory.inc_value(playername, memory_name, inc)
|
|
local player_storage = get_player_storage(playername)
|
|
local value = player_storage[memory_name]
|
|
if type(value) ~= "number" then
|
|
value = 0
|
|
end
|
|
if type(inc) == "number" then
|
|
value = value + inc
|
|
player_storage[memory_name] = value
|
|
end
|
|
return value
|
|
end
|
|
|
|
-- get value
|
|
function digiline_global_memory.get_value(playername, memory_name)
|
|
local player_storage = get_player_storage(playername)
|
|
return player_storage[memory_name]
|
|
end
|
|
|
|
-- set value
|
|
function digiline_global_memory.set_value(playername, memory_name, raw_value)
|
|
local value, cost = digiline_global_memory.clean_and_weigh_digiline_message(raw_value)
|
|
if cost > digiline_global_memory.max_cost then
|
|
return false, "data too long/complex", -1
|
|
end
|
|
|
|
local player_storage = get_player_storage(playername)
|
|
|
|
local count = 0
|
|
for _ in pairs(player_storage) do
|
|
count = count + 1
|
|
end
|
|
if count > digiline_global_memory.max_items and raw_value ~= nil then
|
|
return false, "per-player entry-count exceeded", -2
|
|
end
|
|
|
|
player_storage[memory_name] = value
|
|
changed_entries[playername] = true
|
|
|
|
return true
|
|
end
|
|
|
|
function digiline_global_memory.clear(playername)
|
|
digiline_global_memory.store[playername] = {}
|
|
changed_entries[playername] = true
|
|
end
|
|
|
|
function digiline_global_memory.flush_changes()
|
|
for playername in pairs(changed_entries) do
|
|
local entry = digiline_global_memory.store[playername]
|
|
storage:set_string(playername, minetest.serialize(entry))
|
|
end
|
|
changed_entries = {}
|
|
end
|
|
|
|
-- save changed entries periodically
|
|
local function save_worker()
|
|
digiline_global_memory.flush_changes()
|
|
minetest.after(5, save_worker)
|
|
end
|
|
minetest.after(5, save_worker) |