Compare commits

..

1 Commits
master ... 1.2

Author SHA1 Message Date
49dd2753d3 Support for sfinv! 2018-11-11 22:24:48 +01:00
12 changed files with 65 additions and 147 deletions

38
LICENSE
View File

@ -1,7 +1,4 @@
License of source code
----------------------
« Copyright © 2015-2018, Jean-Patrick Guerrero <jeanpatrick.guerrero@gmail.com>
« Copyright © 2015-2017, Jean-Patrick Guerrero <jeanpatrick.guerrero@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
@ -10,36 +7,3 @@ The above copyright notice and this permission notice shall be included in all c
The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders X be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.
Except as contained in this notice, the name of the <copyright holders> shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the <copyright holders>. »
Licenses of media (textures)
----------------------------
Copyright © Diego Martínez (kaeza): craftguide_*_icon.png (CC BY-SA 3.0)
You are free to:
Share — copy and redistribute the material in any medium or format.
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and
indicate if changes were made. You may do so in any reasonable manner, but not in any way
that suggests the licensor endorses you or your use.
ShareAlike — If you remix, transform, or build upon the material, you must distribute
your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that
legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public
domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary
for your intended use. For example, other rights such as publicity, privacy, or moral
rights may limit how you use the material.
For more details:
http://creativecommons.org/licenses/by-sa/3.0/

View File

@ -12,4 +12,4 @@ The progressive mode can be enabled with `craftguide_progressive_mode = true` in
`craftguide` is also integrated in `sfinv` (Minetest Game inventory) when you enable it with
`craftguide_sfinv_only = true` in `minetest.conf`.
![Preview2](https://i.imgur.com/bToFH38.png)
![Preview2](http://i.imgur.com/3q7rVSo.png)

170
init.lua
View File

@ -17,13 +17,13 @@ craftguide.intllib = S
-- https://github.com/kilbith/xdecor/blob/master/handlers/helpers.lua#L1
local remove, maxn, sort = table.remove, table.maxn, table.sort
local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil
local unpack = unpack
local DEFAULT_SIZE = 10
local MIN_LIMIT, MAX_LIMIT = 10, 12
local MIN_LIMIT, MAX_LIMIT = 9, 12
DEFAULT_SIZE = min(MAX_LIMIT, max(MIN_LIMIT, DEFAULT_SIZE))
local GRID_LIMIT = 5
local BUTTON_SIZE = 1.1
local group_stereotypes = {
wool = "wool:white",
@ -60,7 +60,8 @@ local function extract_groups(str)
end
local function colorize(str)
return mt.colorize("#FFFF00", str)
-- If client <= 0.4.14, don't colorize for compatibility.
return mt.colorize and mt.colorize("#FFFF00", str) or str
end
local function get_fueltime(item)
@ -104,105 +105,71 @@ function craftguide:get_tooltip(item, recipe_type, cooktime, groups)
return has_extras and tooltip .. "]" or ""
end
function craftguide:get_recipe(iX, iY, xoffset, recipe_num, recipes, show_usage)
function craftguide:get_recipe(iY, xoffset, recipe_num, recipes, show_usage)
local formspec, recipes_total = "", #recipes
if recipes_total > 1 then
formspec = formspec ..
"button[" .. (iX - (sfinv_only and 2.2 or 2.6)) .. "," ..
(iY + (sfinv_only and 3.9 or 3.3)) .. ";2.2,1;alternate;" ..
"button[0," .. (iY + (sfinv_only and 3.8 or 3.3)) ..
";2,1;alternate;" .. S("Alternate") .. "]" ..
"label[0," .. (iY + (sfinv_only and 3.3 or 2.8)) .. ";" ..
(show_usage and S("Usage") or S("Recipe")) .. " " ..
S("@1 of @2", recipe_num, recipes_total) .. "]"
S("@1 of @2", recipe_num, recipes_total) .. "]"
end
local recipe_type = recipes[recipe_num].type
local items = recipes[recipe_num].items
local width = recipes[recipe_num].width
local cooktime = width
if recipe_type == "cooking" then
width = 1
elseif width == 0 then
if recipe_type == "cooking" or (recipe_type == "normal" and width == 0) then
local icon = recipe_type == "cooking" and "furnace" or "shapeless"
formspec = formspec ..
"image[" .. (xoffset - 0.8) .. "," .. (iY + (sfinv_only and 2.2 or 1.7)) ..
";0.5,0.5;craftguide_" .. icon .. ".png]"
end
if width == 0 then
width = min(3, #items)
end
local rows = ceil(maxn(items) / width)
local rightest, s_btn_size = 0
if recipe_type == "normal" and (width > GRID_LIMIT or rows > GRID_LIMIT) then
formspec = formspec ..
"label[" .. ((iX / 2) - 2) .. "," .. (iY + 2.2) .. ";" ..
S("Recipe is too big to be displayed (@1x@2)", width, rows) .. "]"
return formspec
"label[" .. xoffset .. "," .. (iY + 2) .. ";" ..
S("Recipe is too big to\nbe displayed (@1x@2)", width, rows) .. "]"
else
local btn_size = 1
for i, v in pairs(items) do
local X = ceil((i - 1) % width + xoffset - width) -
(sfinv_only and 0 or 0.2)
local X = (i - 1) % width + xoffset
local Y = ceil(i / width + (iY + 2) - min(2, rows))
if recipe_type == "normal" and (width > 3 or rows > 3) then
BUTTON_SIZE = width > 3 and 3 / width or 3 / rows
s_btn_size = BUTTON_SIZE
X = BUTTON_SIZE * (i % width) + xoffset - 2.65
Y = BUTTON_SIZE * floor((i - 1) / width) + (iY + 3) - min(2, rows)
end
if X > rightest then
rightest = X
btn_size = width > 3 and 3 / width or 3 / rows
X = btn_size * (i % width) + xoffset
Y = btn_size * floor((i - 1) / width) + (iY + 3) - min(2, rows)
end
local groups = extract_groups(v)
local label = groups and "\nG" or ""
local item_r = self:group_to_item(v)
local tltip = self:get_tooltip(item_r, recipe_type, cooktime, groups)
local tltip = self:get_tooltip(item_r, recipe_type, width, groups)
formspec = formspec ..
"item_image_button[" .. X .. "," ..
(Y + (sfinv_only and 0.7 or 0.2)) .. ";" ..
BUTTON_SIZE .. "," .. BUTTON_SIZE .. ";" .. item_r ..
btn_size .. "," .. btn_size .. ";" .. item_r ..
";" .. item_r .. ";" .. label .. "]" .. tltip
end
BUTTON_SIZE = 1.1
end
if recipe_type == "cooking" or (recipe_type == "normal" and width == 0) then
local icon = recipe_type == "cooking" and "furnace" or "shapeless"
formspec = formspec ..
"image[" .. (rightest + 1.2) .. "," ..
(iY + (sfinv_only and 2.2 or 1.7)) ..
";0.5,0.5;craftguide_" .. icon .. ".png]"
end
local output = recipes[recipe_num].output:match("%S+")
local output_is_fuel = get_fueltime(output) > 0
local arrow_X = rightest + (s_btn_size or BUTTON_SIZE)
local output_X = arrow_X + 0.9
formspec = formspec ..
"image[" .. arrow_X .. "," ..
(iY + (sfinv_only and 2.85 or 2.35)) ..
local output = recipes[recipe_num].output
return formspec ..
"image[" .. (xoffset - 1) .. "," .. (iY + (sfinv_only and 2.85 or 2.35)) ..
";0.9,0.7;craftguide_arrow.png]" ..
"item_image_button[" .. output_X .. "," ..
(iY + (sfinv_only and 2.7 or 2.2)) .. ";" ..
BUTTON_SIZE .. "," .. BUTTON_SIZE .. ";" ..
output .. ";" .. output .. ";]" ..
self:get_tooltip(output)
if output_is_fuel then
formspec = formspec ..
"image[" .. (output_X + 1) .. "," ..
(iY + (sfinv_only and 2.83 or 2.33)) ..
";0.6,0.4;craftguide_arrow.png]" ..
"image[" .. (output_X + 1.6) .. "," ..
(iY + (sfinv_only and 2.68 or 2.18)) ..
";0.6,0.6;craftguide_fire.png]"
end
return formspec
"item_image_button[" .. (xoffset - 2) .. "," ..
(iY + (sfinv_only and 2.7 or 2.2)) .. ";1,1;" ..
output .. ";" .. output .. ";]" ..
self:get_tooltip(output:match("%S+"))
end
function craftguide:get_formspec(player_name, is_fuel)
@ -223,35 +190,32 @@ function craftguide:get_formspec(player_name, is_fuel)
"background[1,1;1,1;craftguide_bg.png;true]" ..
"tooltip[size_inc;" .. S("Increase window size") .. "]" ..
"tooltip[size_dec;" .. S("Decrease window size") .. "]" ..
"image_button[" .. (data.iX * 0.47) ..
",0.12;0.8,0.8;craftguide_zoomin_icon.png;size_inc;]" ..
"image_button[" .. ((data.iX * 0.47) + 0.6) ..
",0.12;0.8,0.8;craftguide_zoomout_icon.png;size_dec;]"
"button[" .. (data.iX * 0.48) .. ",-0.02;0.7,1;size_inc;+]" ..
"button[" .. ((data.iX * 0.48) + 0.5) .. ",-0.02;0.7,1;size_dec;-]"
end
formspec = formspec .. [[
image_button[2.4,0.12;0.8,0.8;craftguide_search_icon.png;search;]
image_button[3.05,0.12;0.8,0.8;craftguide_clear_icon.png;clear;]
button[2.4,0.23;0.8,0.5;search;?]
button[3.05,0.23;0.8,0.5;clear;X]
field_close_on_enter[filter;false]
]] ..
"tooltip[search;" .. S("Search") .. "]" ..
"tooltip[clear;" .. S("Reset") .. "]" ..
"tooltip[prev;" .. S("Previous page") .. "]" ..
"tooltip[next;" .. S("Next page") .. "]" ..
"image_button[" .. (data.iX - (sfinv_only and 2.6 or 3.1)) ..
",0.12;0.8,0.8;craftguide_prev_icon.png;prev;]" ..
"label[" .. (data.iX - (sfinv_only and 1.7 or 2.2)) .. ",0.22;" ..
"button[" .. (data.iX - 3.1) .. ",0;0.8,0.95;prev;<]" ..
"label[" .. (data.iX - 2.2) .. ",0.18;" ..
colorize(data.pagenum) .. " / " .. data.pagemax .. "]" ..
"image_button[" .. (data.iX - (sfinv_only and 0.7 or 1.2) -
(data.iX >= 11 and 0.08 or 0)) ..
",0.12;0.8,0.8;craftguide_next_icon.png;next;]" ..
"button[" .. (data.iX - 1.2) .. ",0;0.8,0.95;next;>]" ..
"field[0.3,0.32;2.5,1;filter;;" .. mt.formspec_escape(data.filter) .. "]"
local xoffset = data.iX / 2.15
local even_num = data.iX % 2 == 0
local xoffset = data.iX / 2 + (even_num and 0.5 or 0)
if not next(data.items) then
formspec = formspec ..
"label[" .. ((data.iX / 2) - 1) .. ",2;" .. S("No item to show") .. "]"
"label[" .. (xoffset - (even_num and 1.5 or 1)) .. ",2;" ..
S("No item to show") .. "]"
end
local first_item = (data.pagenum - 1) * ipp
@ -262,36 +226,24 @@ function craftguide:get_formspec(player_name, is_fuel)
local Y = (i % ipp - X) / data.iX + 1
formspec = formspec ..
"item_image_button[" ..
(X - (sfinv_only and 0 or (X * 0.05))) .. "," ..
Y .. ";" .. BUTTON_SIZE .. "," .. BUTTON_SIZE .. ";" ..
"item_image_button[" .. (X - (X * 0.05)) .. "," .. Y .. ";1.1,1.1;" ..
name .. ";" .. name .. "_inv;]"
end
if data.item and reg_items[data.item] then
if not data.recipes_item or (is_fuel and not get_recipe(data.item).items) then
local X = floor(xoffset) - (sfinv_only and 0 or 0.2)
formspec = formspec ..
"item_image_button[" .. X .. "," ..
(iY + (sfinv_only and 2.7 or 2.2)) ..
";" .. BUTTON_SIZE .. "," .. BUTTON_SIZE ..
";" .. data.item .. ";" .. data.item .. ";]" ..
"image[" .. (X + 1.1) .. "," ..
(iY + (sfinv_only and 2.85 or 2.35)) ..
"image[" .. (xoffset - 1) .. "," .. (iY + 2.35) ..
";0.9,0.7;craftguide_arrow.png]" ..
"item_image_button[" .. xoffset .. "," .. (iY + 2.2) ..
";1,1;" .. data.item .. ";" .. data.item .. ";]" ..
self:get_tooltip(data.item) ..
"image[" .. (X + 2.1) .. "," ..
(iY + (sfinv_only and 2.68 or 2.18)) ..
";1.1,1.1;craftguide_fire.png]"
"image[" .. (xoffset - 2) .. "," ..
(iY + 2.18) .. ";1,1;craftguide_fire.png]"
else
local show_usage = data.show_usage
formspec = formspec ..
self:get_recipe(data.iX,
iY,
xoffset,
self:get_recipe(iY, xoffset,
data.rnum,
(show_usage and data.usages or data.recipes_item),
show_usage)
@ -455,21 +407,25 @@ function craftguide:get_item_usages(item)
end
local function get_fields(player, ...)
local args, formname, fields = {...}
if sfinv_only then
fields = args[1]
local args = {...}
local formname, fields
if #args == 1 then
formname = "craftguide"
fields = args[#args]
else
formname, fields = args[1], args[2]
formname, fields = unpack(args)
end
if not sfinv_only and formname ~= "craftguide" then return end
if formname ~= "craftguide" then return end
local player_name = player:get_player_name()
local data = datas[player_name]
local show_fs = function(is_fuel)
local context = sfinv.get_or_create_context(player)
context.fuel = is_fuel
if sfinv_only then
local context = sfinv.get_or_create_context(player)
context.fuel = is_fuel
sfinv.set_player_inventory_formspec(player, context)
else
craftguide:get_formspec(player_name, is_fuel)
@ -709,5 +665,3 @@ for x = 1, 6 do
})
end
]]
minetest.log("action", "[craftguide] loaded.")

View File

@ -1,4 +1,4 @@
#For enabling some options of craftguide.
craftguide_progressive_mode (Progressive Mode) bool false
craftguide_sfinv_only (Sfinv only) bool false
craftguide_sfinv_only (Sfinv only) bool true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 708 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB