forked from minetest-mods/craftguide
Allow special search filters by groups
Using <optional name>:groups=<group_name1,group_name2,...>
This commit is contained in:
parent
92daae3e95
commit
eb2a81b8b5
86
init.lua
86
init.lua
|
@ -24,9 +24,12 @@ local ESC = M.formspec_escape
|
||||||
local S = M.get_translator("craftguide")
|
local S = M.get_translator("craftguide")
|
||||||
|
|
||||||
local maxn, sort, concat, insert, copy =
|
local maxn, sort, concat, insert, copy =
|
||||||
table.maxn, table.sort, table.concat, table.insert, table.copy
|
table.maxn, table.sort, table.concat, table.insert,
|
||||||
local fmt, find, match, sub, split =
|
table.copy
|
||||||
string.format, string.find, string.match, string.sub, string.split
|
|
||||||
|
local fmt, find, match, sub, split, lower =
|
||||||
|
string.format, string.find, string.match, string.sub,
|
||||||
|
string.split, string.lower
|
||||||
|
|
||||||
local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil
|
local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil
|
||||||
local pairs, next, unpack = pairs, next, unpack
|
local pairs, next, unpack = pairs, next, unpack
|
||||||
|
@ -249,29 +252,6 @@ local function get_item_usages(item)
|
||||||
return usages
|
return usages
|
||||||
end
|
end
|
||||||
|
|
||||||
local function item_in_inv(item, inv_items)
|
|
||||||
local inv_items_size = #inv_items
|
|
||||||
|
|
||||||
if sub(item, 1, 6) == "group:" then
|
|
||||||
local groups = extract_groups(item)
|
|
||||||
for i = 1, inv_items_size do
|
|
||||||
local inv_item = reg_items[inv_items[i]]
|
|
||||||
if inv_item then
|
|
||||||
local item_groups = inv_item.groups
|
|
||||||
if item_has_groups(item_groups, groups) then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
for i = 1, inv_items_size do
|
|
||||||
if inv_items[i] == item then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_filtered_items(player)
|
local function get_filtered_items(player)
|
||||||
local items, c = {}, 0
|
local items, c = {}, 0
|
||||||
|
|
||||||
|
@ -681,9 +661,34 @@ local function search(data)
|
||||||
|
|
||||||
for i = 1, #data.items_raw do
|
for i = 1, #data.items_raw do
|
||||||
local item = data.items_raw[i]
|
local item = data.items_raw[i]
|
||||||
local desc = reg_items[item].description:lower()
|
local def = reg_items[item]
|
||||||
|
local desc = lower(def.description)
|
||||||
|
|
||||||
if find(item .. desc, filter, 1, true) then
|
local to_add
|
||||||
|
local search_in = item .. desc
|
||||||
|
local subfilter, search_groups, group_filters =
|
||||||
|
match(filter, "(.*)(:groups=)([%w_,]+)$")
|
||||||
|
|
||||||
|
if search_groups then
|
||||||
|
local groups = split(group_filters, ",")
|
||||||
|
local has_groups = true
|
||||||
|
|
||||||
|
for j = 1, #groups do
|
||||||
|
local group = groups[j]
|
||||||
|
if not def.groups[group] then
|
||||||
|
has_groups = nil
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if has_groups then
|
||||||
|
to_add = not subfilter or find(search_in, subfilter, 1, true)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
to_add = find(search_in, filter, 1, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if to_add then
|
||||||
c = c + 1
|
c = c + 1
|
||||||
filtered_list[c] = item
|
filtered_list[c] = item
|
||||||
end
|
end
|
||||||
|
@ -795,7 +800,7 @@ local function on_receive_fields(player, fields)
|
||||||
|
|
||||||
elseif (fields.key_enter_field == "filter" or fields.search) and
|
elseif (fields.key_enter_field == "filter" or fields.search) and
|
||||||
fields.filter ~= "" then
|
fields.filter ~= "" then
|
||||||
local fltr = fields.filter:lower()
|
local fltr = lower(fields.filter)
|
||||||
if data.filter == fltr then
|
if data.filter == fltr then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -993,6 +998,29 @@ else
|
||||||
end
|
end
|
||||||
|
|
||||||
if progressive_mode then
|
if progressive_mode then
|
||||||
|
local function item_in_inv(item, inv_items)
|
||||||
|
local inv_items_size = #inv_items
|
||||||
|
|
||||||
|
if sub(item, 1, 6) == "group:" then
|
||||||
|
local groups = extract_groups(item)
|
||||||
|
for i = 1, inv_items_size do
|
||||||
|
local inv_item = reg_items[inv_items[i]]
|
||||||
|
if inv_item then
|
||||||
|
local item_groups = inv_item.groups
|
||||||
|
if item_has_groups(item_groups, groups) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for i = 1, inv_items_size do
|
||||||
|
if inv_items[i] == item then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function recipe_in_inv(recipe, inv_items)
|
local function recipe_in_inv(recipe, inv_items)
|
||||||
for _, item in pairs(recipe.items) do
|
for _, item in pairs(recipe.items) do
|
||||||
if not item_in_inv(item, inv_items) then
|
if not item_in_inv(item, inv_items) then
|
||||||
|
|
Loading…
Reference in New Issue
Block a user