Save players’ data on discovered recipes
Specifically, data on items/groups they have held.
This commit is contained in:
parent
e4d566b13a
commit
7b1c884406
94
init.lua
94
init.lua
|
@ -1,5 +1,6 @@
|
|||
local S = minetest.get_translator("mtg_craftguide")
|
||||
local esc = minetest.formspec_escape
|
||||
local storage = minetest.get_mod_storage()
|
||||
|
||||
local player_data = {}
|
||||
local init_items = {}
|
||||
|
@ -408,26 +409,6 @@ local function on_receive_fields(player, fields)
|
|||
end
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
local info = minetest.get_player_information(name)
|
||||
|
||||
player_data[name] = {
|
||||
filter = "",
|
||||
pagenum = 1,
|
||||
items = {},
|
||||
held_items = {},
|
||||
held_groups = {},
|
||||
known_items = {},
|
||||
lang_code = info.lang_code
|
||||
}
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
player_data[name] = nil
|
||||
end)
|
||||
|
||||
sfinv.register_page("mtg_craftguide:craftguide", {
|
||||
title = esc(S("Recipes")),
|
||||
get = function(self, player, context)
|
||||
|
@ -559,4 +540,77 @@ minetest.register_on_craft(function(itemstack, player)
|
|||
update_known_items(player, itemstack:get_name())
|
||||
end)
|
||||
|
||||
-- Initialize player-data.
|
||||
-- If saved data is found, load previous held-items and held-groups data.
|
||||
function load_player_data(player)
|
||||
local name = player:get_player_name()
|
||||
local info = minetest.get_player_information(name)
|
||||
|
||||
player_data[name] = {
|
||||
filter = "",
|
||||
pagenum = 1,
|
||||
items = {},
|
||||
held_items = {},
|
||||
held_groups = {},
|
||||
known_items = {},
|
||||
lang_code = info.lang_code
|
||||
}
|
||||
|
||||
local saved_data_str = storage:get_string("player_" .. name)
|
||||
local saved_data = minetest.deserialize(saved_data_str or "")
|
||||
if saved_data_str and saved_data then
|
||||
player_data[name].held_items = saved_data.held_items
|
||||
player_data[name].held_groups = saved_data.held_groups
|
||||
end
|
||||
end
|
||||
|
||||
-- Go over held items, and make sure any recipes that can be done with
|
||||
-- them is listed in visible items.
|
||||
function init_player_known_items(player)
|
||||
local name = player:get_player_name()
|
||||
local data = player_data[name]
|
||||
|
||||
for item,_ in pairs(data.held_items) do
|
||||
local outputs = known_crafting_outputs(data, item)
|
||||
if outputs then
|
||||
for _,output in pairs(outputs) do
|
||||
data.known_items[output] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Save a player’s held-item and held-group data.
|
||||
function save_player_data(player)
|
||||
local name = player:get_player_name()
|
||||
local data = player_data[name]
|
||||
if data then
|
||||
storage:set_string("player_" .. name, minetest.serialize(data))
|
||||
end
|
||||
end
|
||||
|
||||
-- Save all players’ held-item and held-group data.
|
||||
function save_all_player_data()
|
||||
for name,data in pairs(player_data) do
|
||||
if data then
|
||||
storage:set_string("player_" .. name, minetest.serialize(data))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
load_player_data(player)
|
||||
init_player_known_items(player)
|
||||
|
||||
-- Init displayed items.
|
||||
local data = player_data[player:get_player_name()]
|
||||
data.items = visible_items(data)
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
save_player_data(player)
|
||||
player_data[player:get_player_name()] = nil -- Save memory!
|
||||
end)
|
||||
|
||||
minetest.register_on_shutdown(save_all_player_data)
|
||||
|
||||
|
|
Ŝarĝante…
Reference in New Issue