Track new discovered items all the time

This commit is contained in:
Jean-Patrick Guerrero 2019-02-13 00:45:06 +01:00
parent b3bba5c2ff
commit 07bc14e516

View File

@ -53,25 +53,40 @@ local group_stereotypes = {
local function table_merge(t, t2) local function table_merge(t, t2)
t, t2 = t or {}, t2 or {} t, t2 = t or {}, t2 or {}
local c = #t
for i = 1, #t2 do for i = 1, #t2 do
t[#t + 1] = t2[i] c = c + 1
t[c] = t2[i]
end end
return t return t
end end
local function clean_items(items) local function table_diff(t, t2)
local hash, ct = {}, {} local t3 = {}
for i = 1, #items do
local item = items[i] for i = 1, #t do
if not hash[item] and reg_items[item] then local v = t[i]
ct[#ct + 1] = item t3[v] = true
hash[item] = true end
for i = 1, #t2 do
local v = t2[i]
t3[v] = nil
end
local ret, c = {}, 0
for i = 1, #t do
local v = t[i]
if t3[v] then
c = c + 1
ret[c] = v
end end
end end
return ct return ret
end end
local function __func() local function __func()
@ -740,6 +755,7 @@ if sfinv_only then
if next(recipe_filters) then if next(recipe_filters) then
local name = player:get_player_name() local name = player:get_player_name()
local data = player_data[name] local data = player_data[name]
data.items_raw = get_filtered_items(player) data.items_raw = get_filtered_items(player)
search(data) search(data)
end end
@ -877,18 +893,16 @@ if progressive_mode then
local function progressive_filter(recipes, player) local function progressive_filter(recipes, player)
local name = player:get_player_name() local name = player:get_player_name()
local discovered = player_data[name].inv_items local data = player_data[name]
local inv_items = get_inv_items(player)
discovered = clean_items(table_merge(discovered, inv_items))
if #discovered == 0 then if #data.inv_items == 0 then
return {} return {}
end end
local filtered, c = {}, 0 local filtered, c = {}, 0
for i = 1, #recipes do for i = 1, #recipes do
local recipe = recipes[i] local recipe = recipes[i]
if recipe_in_inv(recipe, discovered) then if recipe_in_inv(recipe, data.inv_items) then
c = c + 1 c = c + 1
filtered[c] = recipe filtered[c] = recipe
end end
@ -897,19 +911,37 @@ if progressive_mode then
return filtered return filtered
end end
mt.register_globalstep(function()
local players = mt.get_connected_players()
for i = 1, #players do
local player = players[i]
local name = player:get_player_name()
local data = player_data[name]
local inv_items = get_inv_items(player)
local diff = table_diff(inv_items, data.inv_items)
if #diff > 0 then
data.inv_items = table_merge(diff, data.inv_items)
end
end
end)
craftguide.add_recipe_filter("Default progressive filter", progressive_filter) craftguide.add_recipe_filter("Default progressive filter", progressive_filter)
mt.register_on_joinplayer(function(player) mt.register_on_joinplayer(function(player)
local meta = player:get_meta() local meta = player:get_meta()
local inv_items = deserialize(meta:get_string("inv_items")) or {}
local name = player:get_player_name() local name = player:get_player_name()
player_data[name].inv_items = inv_items local data = player_data[name]
data.inv_items = deserialize(meta:get_string("inv_items")) or {}
end) end)
local function save_meta(player) local function save_meta(player)
local meta = player:get_meta() local meta = player:get_meta()
local name = player:get_player_name() local name = player:get_player_name()
meta:set_string("inv_items", serialize(player_data[name].inv_items)) local data = player_data[name]
meta:set_string("inv_items", serialize(data.inv_items))
end end
mt.register_on_leaveplayer(save_meta) mt.register_on_leaveplayer(save_meta)
@ -917,7 +949,8 @@ if progressive_mode then
mt.register_on_shutdown(function() mt.register_on_shutdown(function()
local players = mt.get_connected_players() local players = mt.get_connected_players()
for i = 1, #players do for i = 1, #players do
save_meta(players[i]) local player = players[i]
save_meta(player)
end end
end) end)
end end