mirror of
https://github.com/minetest-mods/craftguide.git
synced 2024-12-13 18:20:17 +01:00
Fix issue #60
This commit is contained in:
parent
e37f1df6d3
commit
fc2d2e585c
145
init.lua
145
init.lua
@ -49,6 +49,8 @@ local group_stereotypes = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
local function table_merge(t, t2)
|
local function table_merge(t, t2)
|
||||||
|
t, t2 = t or {}, t2 or {}
|
||||||
|
|
||||||
for i = 1, #t2 do
|
for i = 1, #t2 do
|
||||||
t[#t + 1] = t2[i]
|
t[#t + 1] = t2[i]
|
||||||
end
|
end
|
||||||
@ -132,6 +134,55 @@ local function apply_recipe_filters(recipes, player)
|
|||||||
return recipes
|
return recipes
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function item_has_groups(item_groups, groups)
|
||||||
|
for i = 1, #groups do
|
||||||
|
local group = groups[i]
|
||||||
|
if not item_groups[group] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function extract_groups(str)
|
||||||
|
return str:sub(7):split(",")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function item_in_recipe(item, recipe)
|
||||||
|
local item_groups = reg_items[item].groups
|
||||||
|
for _, recipe_item in pairs(recipe.items) do
|
||||||
|
if recipe_item == item then
|
||||||
|
return true
|
||||||
|
elseif recipe_item:sub(1,6) == "group:" then
|
||||||
|
local groups = extract_groups(recipe_item)
|
||||||
|
if item_has_groups(item_groups, groups) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_item_usages(item)
|
||||||
|
local usages, c = {}, 0
|
||||||
|
|
||||||
|
for _, recipes in pairs(recipes_cache) do
|
||||||
|
for i = 1, #recipes do
|
||||||
|
local recipe = recipes[i]
|
||||||
|
if item_in_recipe(item, recipe) then
|
||||||
|
c = c + 1
|
||||||
|
usages[c] = recipe
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if fuel_cache[item] then
|
||||||
|
usages[#usages + 1] = {type = "fuel", width = 1, items = {item}}
|
||||||
|
end
|
||||||
|
|
||||||
|
return usages
|
||||||
|
end
|
||||||
|
|
||||||
local function get_filtered_items(player)
|
local function get_filtered_items(player)
|
||||||
local items, c = {}, 0
|
local items, c = {}, 0
|
||||||
|
|
||||||
@ -139,6 +190,10 @@ local function get_filtered_items(player)
|
|||||||
local item = init_items[i]
|
local item = init_items[i]
|
||||||
local recipes = recipes_cache[item]
|
local recipes = recipes_cache[item]
|
||||||
|
|
||||||
|
if fuel_cache[item] then
|
||||||
|
recipes = table_merge(get_item_usages(item), recipes)
|
||||||
|
end
|
||||||
|
|
||||||
if recipes then
|
if recipes then
|
||||||
recipes = apply_recipe_filters(recipes, player)
|
recipes = apply_recipe_filters(recipes, player)
|
||||||
if #recipes > 0 then
|
if #recipes > 0 then
|
||||||
@ -181,21 +236,6 @@ local function cache_fuel(item)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function extract_groups(str)
|
|
||||||
return str:sub(7):split(",")
|
|
||||||
end
|
|
||||||
|
|
||||||
local function item_has_groups(item_groups, groups)
|
|
||||||
for i = 1, #groups do
|
|
||||||
local group = groups[i]
|
|
||||||
if not item_groups[group] then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
local function groups_to_item(groups)
|
local function groups_to_item(groups)
|
||||||
if #groups == 1 then
|
if #groups == 1 then
|
||||||
local group = groups[1]
|
local group = groups[1]
|
||||||
@ -522,40 +562,6 @@ local function search(data)
|
|||||||
data.items = filtered_list
|
data.items = filtered_list
|
||||||
end
|
end
|
||||||
|
|
||||||
local function item_in_recipe(item, recipe)
|
|
||||||
local item_groups = reg_items[item].groups
|
|
||||||
for _, recipe_item in pairs(recipe.items) do
|
|
||||||
if recipe_item == item then
|
|
||||||
return true
|
|
||||||
elseif recipe_item:sub(1,6) == "group:" then
|
|
||||||
local groups = extract_groups(recipe_item)
|
|
||||||
if item_has_groups(item_groups, groups) then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_item_usages(item)
|
|
||||||
local usages, c = {}, 0
|
|
||||||
|
|
||||||
for _, recipes in pairs(recipes_cache) do
|
|
||||||
for i = 1, #recipes do
|
|
||||||
local recipe = recipes[i]
|
|
||||||
if item_in_recipe(item, recipe) then
|
|
||||||
c = c + 1
|
|
||||||
usages[c] = recipe
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if fuel_cache[item] then
|
|
||||||
usages[#usages + 1] = {type = "fuel", width = 1, items = {item}}
|
|
||||||
end
|
|
||||||
|
|
||||||
return usages
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_inv_items(player)
|
local function get_inv_items(player)
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
local main, craft = inv:get_list("main"), inv:get_list("craft")
|
local main, craft = inv:get_list("main"), inv:get_list("craft")
|
||||||
@ -576,25 +582,6 @@ local function get_inv_items(player)
|
|||||||
return inv_items
|
return inv_items
|
||||||
end
|
end
|
||||||
|
|
||||||
local function item_in_inv(item, inv_items)
|
|
||||||
local inv_items_size = #inv_items
|
|
||||||
if item:sub(1,6) == "group:" then
|
|
||||||
local groups = extract_groups(item)
|
|
||||||
for i = 1, inv_items_size do
|
|
||||||
local item_groups = reg_items[inv_items[i]].groups
|
|
||||||
if item_has_groups(item_groups, groups) then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
for i = 1, inv_items_size do
|
|
||||||
if inv_items[i] == item then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function init_data(name)
|
local function init_data(name)
|
||||||
player_data[name] = {
|
player_data[name] = {
|
||||||
filter = "",
|
filter = "",
|
||||||
@ -865,6 +852,26 @@ 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 item:sub(1,6) == "group:" then
|
||||||
|
local groups = extract_groups(item)
|
||||||
|
for i = 1, inv_items_size do
|
||||||
|
local item_groups = reg_items[inv_items[i]].groups
|
||||||
|
if item_has_groups(item_groups, groups) then
|
||||||
|
return true
|
||||||
|
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
|
||||||
@ -969,7 +976,7 @@ mt.register_chatcommand("craft", {
|
|||||||
elseif recipes_cache[node_name] then
|
elseif recipes_cache[node_name] then
|
||||||
return false, fmt(msg, S("You don't know a recipe for this node"))
|
return false, fmt(msg, S("You don't know a recipe for this node"))
|
||||||
else
|
else
|
||||||
return false, fmt(msg, S("No recipe for this node"))
|
return false, fmt(msg, S("No recipe for this node"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user