Improve groups caching
This commit is contained in:
parent
cb1dce66f9
commit
8525633d4c
|
@ -2,9 +2,9 @@ local replacements = {fuel = {}}
|
||||||
local http = ...
|
local http = ...
|
||||||
|
|
||||||
IMPORT("maxn", "copy", "insert", "sort", "match", "sub")
|
IMPORT("maxn", "copy", "insert", "sort", "match", "sub")
|
||||||
IMPORT("is_group", "extract_groups", "item_has_groups", "groups_to_items")
|
|
||||||
IMPORT("fmt", "reg_items", "reg_aliases", "reg_nodes", "is_cube", "get_cube", "ItemStack")
|
|
||||||
IMPORT("true_str", "is_table", "valid_item", "table_merge", "table_replace", "rcp_eq")
|
IMPORT("true_str", "is_table", "valid_item", "table_merge", "table_replace", "rcp_eq")
|
||||||
|
IMPORT("fmt", "reg_items", "reg_aliases", "reg_nodes", "is_cube", "get_cube", "ItemStack")
|
||||||
|
IMPORT("is_group", "extract_groups", "item_has_groups", "groups_to_items", "get_group_stereotype")
|
||||||
|
|
||||||
local function get_burntime(item)
|
local function get_burntime(item)
|
||||||
return core.get_craft_result{method = "fuel", items = {item}}.time
|
return core.get_craft_result{method = "fuel", items = {item}}.time
|
||||||
|
@ -22,12 +22,13 @@ local function cache_fuel(item)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function cache_groups(groupname, groups)
|
local function cache_groups(group, groups)
|
||||||
i3.groups[groupname] = {}
|
i3.groups[group] = {}
|
||||||
i3.groups[groupname].groups = groups
|
i3.groups[group].groups = groups
|
||||||
i3.groups[groupname].items = groups_to_items(groups, true)
|
i3.groups[group].stereotype = get_group_stereotype(groups[1])
|
||||||
|
i3.groups[group].items = groups_to_items(groups)
|
||||||
|
|
||||||
local items = i3.groups[groupname].items
|
local items = i3.groups[group].items
|
||||||
if #items <= 1 then return end
|
if #items <= 1 then return end
|
||||||
|
|
||||||
local c = 0
|
local c = 0
|
||||||
|
@ -52,18 +53,18 @@ local function cache_groups(groupname, groups)
|
||||||
|
|
||||||
sprite = sprite:gsub("WxH", px .. "x" .. px * c)
|
sprite = sprite:gsub("WxH", px .. "x" .. px * c)
|
||||||
|
|
||||||
i3.groups[groupname].sprite = sprite
|
i3.groups[group].sprite = sprite
|
||||||
i3.groups[groupname].count = c
|
i3.groups[group].count = c
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_item_usages(item, recipe, added)
|
local function get_item_usages(item, recipe, added)
|
||||||
if is_group(item) then
|
if is_group(item) then
|
||||||
local groupname = item:sub(7)
|
local group = item:sub(7)
|
||||||
local group_cache = i3.groups[groupname]
|
local group_cache = i3.groups[group]
|
||||||
local groups = group_cache and group_cache.groups or extract_groups(item)
|
local groups = group_cache and group_cache.groups or extract_groups(item)
|
||||||
|
|
||||||
if not group_cache then
|
if not group_cache then
|
||||||
cache_groups(groupname, groups)
|
cache_groups(group, groups)
|
||||||
end
|
end
|
||||||
|
|
||||||
for name, def in pairs(reg_items) do
|
for name, def in pairs(reg_items) do
|
||||||
|
@ -220,7 +221,7 @@ core.register_craft = function(def)
|
||||||
|
|
||||||
if is_group(output[1]) then
|
if is_group(output[1]) then
|
||||||
groups = extract_groups(output[1])
|
groups = extract_groups(output[1])
|
||||||
output = groups_to_items(groups, true)
|
output = groups_to_items(groups)
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, #output do
|
for i = 1, #output do
|
||||||
|
|
|
@ -253,30 +253,25 @@ local function valid_item(def)
|
||||||
def.description and def.description ~= ""
|
def.description and def.description ~= ""
|
||||||
end
|
end
|
||||||
|
|
||||||
local function groups_to_items(groups, get_all)
|
local function get_group_stereotype(group)
|
||||||
if not get_all and #groups == 1 then
|
|
||||||
local group = groups[1]
|
|
||||||
local stereotype = i3.group_stereotypes[group]
|
local stereotype = i3.group_stereotypes[group]
|
||||||
local def = reg_items[stereotype]
|
local def = reg_items[stereotype]
|
||||||
|
|
||||||
if valid_item(def) then
|
if valid_item(def) then
|
||||||
return stereotype
|
return stereotype
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function groups_to_items(groups)
|
||||||
local names = {}
|
local names = {}
|
||||||
|
|
||||||
for name, def in pairs(reg_items) do
|
for name, def in pairs(reg_items) do
|
||||||
if valid_item(def) and item_has_groups(def.groups, groups) then
|
if valid_item(def) and item_has_groups(def.groups, groups) then
|
||||||
if get_all then
|
|
||||||
insert(names, name)
|
insert(names, name)
|
||||||
else
|
|
||||||
return name
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return get_all and names or ""
|
return names
|
||||||
end
|
end
|
||||||
|
|
||||||
local function is_cube(drawtype)
|
local function is_cube(drawtype)
|
||||||
|
@ -413,7 +408,7 @@ local function craft_stack(player, data, craft_rcp)
|
||||||
items = {}
|
items = {}
|
||||||
local groups = extract_groups(name)
|
local groups = extract_groups(name)
|
||||||
local groupname = name:sub(7)
|
local groupname = name:sub(7)
|
||||||
local item_groups = i3.groups[groupname].items or groups_to_items(groups, true)
|
local item_groups = i3.groups[groupname].items or groups_to_items(groups)
|
||||||
local remaining = count
|
local remaining = count
|
||||||
|
|
||||||
for _, item in ipairs(item_groups) do
|
for _, item in ipairs(item_groups) do
|
||||||
|
@ -669,6 +664,7 @@ local _ = {
|
||||||
extract_groups = extract_groups,
|
extract_groups = extract_groups,
|
||||||
item_has_groups = item_has_groups,
|
item_has_groups = item_has_groups,
|
||||||
groups_to_items = groups_to_items,
|
groups_to_items = groups_to_items,
|
||||||
|
get_group_stereotype = get_group_stereotype,
|
||||||
|
|
||||||
-- Compression
|
-- Compression
|
||||||
compressible = compressible,
|
compressible = compressible,
|
||||||
|
|
13
src/gui.lua
13
src/gui.lua
|
@ -13,12 +13,12 @@ IMPORT("vec_new", "vec_sub", "vec_round")
|
||||||
IMPORT("clr", "ESC", "msg", "check_privs")
|
IMPORT("clr", "ESC", "msg", "check_privs")
|
||||||
IMPORT("min", "max", "floor", "ceil", "round")
|
IMPORT("min", "max", "floor", "ceil", "round")
|
||||||
IMPORT("reg_items", "reg_tools", "reg_entities")
|
IMPORT("reg_items", "reg_tools", "reg_entities")
|
||||||
IMPORT("get_bag_description", "get_detached_inv")
|
IMPORT("true_str", "is_fav", "is_num", "str_to_pos")
|
||||||
IMPORT("S", "ES", "translate", "ItemStack", "toupper")
|
IMPORT("S", "ES", "translate", "ItemStack", "toupper")
|
||||||
IMPORT("groups_to_items", "compression_active", "compressible")
|
IMPORT("get_sorting_idx", "compression_active", "compressible")
|
||||||
IMPORT("true_str", "is_fav", "is_num", "get_group", "str_to_pos")
|
IMPORT("get_bag_description", "get_detached_inv", "get_recipes")
|
||||||
IMPORT("maxn", "sort", "concat", "copy", "insert", "remove", "unpack")
|
IMPORT("maxn", "sort", "concat", "copy", "insert", "remove", "unpack")
|
||||||
IMPORT("get_sorting_idx", "is_group", "extract_groups", "item_has_groups", "get_recipes")
|
IMPORT("get_group_stereotype", "extract_groups", "is_group", "item_has_groups", "get_group")
|
||||||
|
|
||||||
local function fmt(elem, ...)
|
local function fmt(elem, ...)
|
||||||
if not fs_elements[elem] then
|
if not fs_elements[elem] then
|
||||||
|
@ -997,7 +997,8 @@ local function get_grid_fs(fs, data, rcp, is_recipe)
|
||||||
|
|
||||||
if is_group(name) then
|
if is_group(name) then
|
||||||
groups = group_cache and group_cache.groups or extract_groups(name)
|
groups = group_cache and group_cache.groups or extract_groups(name)
|
||||||
name = group_cache and group_cache.items[1] or groups_to_items(groups)
|
name = group_cache and group_cache.stereotype or
|
||||||
|
get_group_stereotype(groups[1]) or group_cache.items[1]
|
||||||
end
|
end
|
||||||
|
|
||||||
local label = groups and "\nG" or ""
|
local label = groups and "\nG" or ""
|
||||||
|
@ -1039,7 +1040,7 @@ local function get_grid_fs(fs, data, rcp, is_recipe)
|
||||||
fs("label", X + 0.45, Y + 0.18, label)
|
fs("label", X + 0.45, Y + 0.18, label)
|
||||||
|
|
||||||
if _count > 1 then
|
if _count > 1 then
|
||||||
fs("label", X + 0.8, Y + 0.9, tostring(_count))
|
fs("label", X + 0.8, Y + 0.9, _count)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
fs("item_image_button", X, Y, btn_size, btn_size, fmt("%s %u", name, _count), btn_name, label)
|
fs("item_image_button", X, Y, btn_size, btn_size, fmt("%s %u", name, _count), btn_name, label)
|
||||||
|
|
Ŝarĝante…
Reference in New Issue