Animated image buttons for groups (needs polish)
This commit is contained in:
parent
e17e1080d3
commit
a6605263f4
|
@ -1,11 +1,10 @@
|
||||||
local PNG = i3.files.styles()
|
|
||||||
local replacements = {fuel = {}}
|
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("is_group", "extract_groups", "item_has_groups", "groups_to_items")
|
||||||
IMPORT("fmt", "reg_items", "reg_aliases", "reg_nodes", "draw_cube", "ItemStack")
|
IMPORT("fmt", "reg_items", "reg_aliases", "reg_nodes", "is_cube", "get_cube", "ItemStack")
|
||||||
IMPORT("true_str", "true_table", "is_table", "valid_item", "table_merge", "table_replace", "rcp_eq")
|
IMPORT("true_str", "is_table", "valid_item", "table_merge", "table_replace", "rcp_eq")
|
||||||
|
|
||||||
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
|
||||||
|
@ -27,8 +26,31 @@ local function cache_groups(groupname, groups)
|
||||||
i3.groups[groupname] = {}
|
i3.groups[groupname] = {}
|
||||||
i3.groups[groupname].groups = groups
|
i3.groups[groupname].groups = groups
|
||||||
i3.groups[groupname].items = groups_to_items(groups, true)
|
i3.groups[groupname].items = groups_to_items(groups, true)
|
||||||
|
|
||||||
|
local items = i3.groups[groupname].items
|
||||||
|
local nb_items = #items
|
||||||
|
|
||||||
|
if nb_items > 1 then
|
||||||
|
local px = 256
|
||||||
|
local sprite = fmt("[combine:%ux%u", px, nb_items + (px * nb_items) - 1)
|
||||||
|
|
||||||
|
for i = 1, nb_items do
|
||||||
|
local item = items[i]
|
||||||
|
local def = reg_items[item]
|
||||||
|
local texture = def.inventory_image or def.wield_image
|
||||||
|
|
||||||
|
if is_cube(def.drawtype) then
|
||||||
|
texture = get_cube(def.tiles)
|
||||||
|
end
|
||||||
|
|
||||||
|
sprite = sprite .. fmt(":0,%u=%s", (i - 1) + ((i - 1) * px), texture)
|
||||||
|
end
|
||||||
|
|
||||||
|
i3.groups[groupname].sprite = sprite
|
||||||
|
end
|
||||||
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 groupname = item:sub(7)
|
||||||
|
@ -296,35 +318,6 @@ local function init_recipes()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_cube(tiles)
|
|
||||||
if not true_table(tiles) then
|
|
||||||
return PNG.blank
|
|
||||||
end
|
|
||||||
|
|
||||||
local top = tiles[1] or PNG.blank
|
|
||||||
if is_table(top) then
|
|
||||||
top = top.name or top.image
|
|
||||||
end
|
|
||||||
|
|
||||||
local left = tiles[3] or top or PNG.blank
|
|
||||||
if is_table(left) then
|
|
||||||
left = left.name or left.image
|
|
||||||
end
|
|
||||||
|
|
||||||
local right = tiles[5] or left or PNG.blank
|
|
||||||
if is_table(right) then
|
|
||||||
right = right.name or right.image
|
|
||||||
end
|
|
||||||
|
|
||||||
return draw_cube(top, left, right)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function is_cube(drawtype)
|
|
||||||
return drawtype == "normal" or drawtype == "liquid" or
|
|
||||||
sub(drawtype, 1, 9) == "glasslike" or
|
|
||||||
sub(drawtype, 1, 8) == "allfaces"
|
|
||||||
end
|
|
||||||
|
|
||||||
local function init_cubes()
|
local function init_cubes()
|
||||||
for name, def in pairs(reg_nodes) do
|
for name, def in pairs(reg_nodes) do
|
||||||
if def then
|
if def then
|
||||||
|
|
|
@ -279,6 +279,35 @@ local function groups_to_items(groups, get_all)
|
||||||
return get_all and names or ""
|
return get_all and names or ""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function is_cube(drawtype)
|
||||||
|
return drawtype == "normal" or drawtype == "liquid" or
|
||||||
|
sub(drawtype, 1, 9) == "glasslike" or
|
||||||
|
sub(drawtype, 1, 8) == "allfaces"
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_cube(tiles)
|
||||||
|
if not true_table(tiles) then
|
||||||
|
return "i3_blank.png"
|
||||||
|
end
|
||||||
|
|
||||||
|
local top = tiles[1] or "i3_blank.png"
|
||||||
|
if is_table(top) then
|
||||||
|
top = top.name or top.image
|
||||||
|
end
|
||||||
|
|
||||||
|
local left = tiles[3] or top or "i3_blank.png"
|
||||||
|
if is_table(left) then
|
||||||
|
left = left.name or left.image
|
||||||
|
end
|
||||||
|
|
||||||
|
local right = tiles[5] or left or "i3_blank.png"
|
||||||
|
if is_table(right) then
|
||||||
|
right = right.name or right.image
|
||||||
|
end
|
||||||
|
|
||||||
|
return core.inventorycube(top, left, right)
|
||||||
|
end
|
||||||
|
|
||||||
local function apply_recipe_filters(recipes, player)
|
local function apply_recipe_filters(recipes, player)
|
||||||
for _, filter in pairs(i3.recipe_filters) do
|
for _, filter in pairs(i3.recipe_filters) do
|
||||||
recipes = filter(recipes, player)
|
recipes = filter(recipes, player)
|
||||||
|
@ -667,6 +696,8 @@ local _ = {
|
||||||
msg = msg,
|
msg = msg,
|
||||||
|
|
||||||
-- Misc. functions
|
-- Misc. functions
|
||||||
|
is_cube = is_cube,
|
||||||
|
get_cube = get_cube,
|
||||||
ItemStack = ItemStack,
|
ItemStack = ItemStack,
|
||||||
valid_item = valid_item,
|
valid_item = valid_item,
|
||||||
spawn_item = spawn_item,
|
spawn_item = spawn_item,
|
||||||
|
|
23
src/gui.lua
23
src/gui.lua
|
@ -93,8 +93,7 @@ local function get_stack_max(inv, data, is_recipe, rcp)
|
||||||
local def = reg_items[item]
|
local def = reg_items[item]
|
||||||
|
|
||||||
if def then
|
if def then
|
||||||
local groupname = name:sub(7)
|
local group_cache = i3.groups[name:sub(7)]
|
||||||
local group_cache = i3.groups[groupname]
|
|
||||||
local groups = group_cache and group_cache.groups or extract_groups(name)
|
local groups = group_cache and group_cache.groups or extract_groups(name)
|
||||||
|
|
||||||
if item_has_groups(def.groups, groups) then
|
if item_has_groups(def.groups, groups) then
|
||||||
|
@ -994,10 +993,9 @@ local function get_grid_fs(fs, data, rcp, is_recipe)
|
||||||
end
|
end
|
||||||
|
|
||||||
local groups
|
local groups
|
||||||
|
local group_cache = i3.groups[name:sub(7)]
|
||||||
|
|
||||||
if is_group(name) then
|
if is_group(name) then
|
||||||
local groupname = name:sub(7)
|
|
||||||
local group_cache = i3.groups[groupname]
|
|
||||||
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.items[1] or groups_to_items(groups)
|
||||||
end
|
end
|
||||||
|
@ -1031,10 +1029,21 @@ local function get_grid_fs(fs, data, rcp, is_recipe)
|
||||||
end
|
end
|
||||||
|
|
||||||
local btn_name = groups and fmt("group!%s!%s", groups[1], name) or name
|
local btn_name = groups and fmt("group!%s!%s", groups[1], name) or name
|
||||||
|
local _count = count * (is_recipe and data.scrbar_rcp or data.scrbar_usg or 1)
|
||||||
|
|
||||||
fs("item_image_button", X, Y, btn_size, btn_size,
|
if group_cache and group_cache.sprite then
|
||||||
fmt("%s %u", name, count * (is_recipe and data.scrbar_rcp or data.scrbar_usg or 1)),
|
local sprite = group_cache.sprite
|
||||||
btn_name, label)
|
|
||||||
|
fs("item_image_button", X, Y, btn_size, btn_size, "", btn_name, "")
|
||||||
|
fs("animated_image", X + 0.01, Y, 1.87, 1.87, sprite, #group_cache.items, 1000)
|
||||||
|
fs("label", X + 0.45, Y + 0.18, label)
|
||||||
|
|
||||||
|
if _count > 1 then
|
||||||
|
fs("label", X + 0.8, Y + 0.9, tostring(_count))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
fs("item_image_button", X, Y, btn_size, btn_size, fmt("%s %u", name, _count), btn_name, label)
|
||||||
|
end
|
||||||
|
|
||||||
local def = reg_items[name]
|
local def = reg_items[name]
|
||||||
local unknown = not def or nil
|
local unknown = not def or nil
|
||||||
|
|
Ŝarĝante…
Reference in New Issue