forked from minetest-mods/craftguide
Support for sfinv!
This commit is contained in:
parent
8b309106c3
commit
49dd2753d3
@ -4,5 +4,6 @@ allow_defined_top = true
|
||||
read_globals = {
|
||||
"minetest",
|
||||
"default",
|
||||
"sfinv",
|
||||
"sfinv_buttons",
|
||||
}
|
||||
|
11
README.md
11
README.md
@ -1,14 +1,15 @@
|
||||
##  Crafting Guide ##
|
||||
|
||||
#### A Crafting Guide for Minetest that doesn't suck. ####
|
||||
#### `craftguide` is the most comprehensive crafting guide on Minetest. ####
|
||||
#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details. ####
|
||||
|
||||
#### `craftguide` is the most comprehensive mod of its category. ####
|
||||
#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details and comparisons. ####
|
||||
|
||||
#### This crafting guide is usable with a blue book named *"Crafting Guide"*. ####
|
||||
#### This crafting guide is usable with a blue book named *"Crafting Guide"* ####
|
||||
|
||||
#### This crafting guide features two modes : Standard and Progressive. ####
|
||||
The Progressive mode is a Terraria-like system that only shows recipes you can craft from items in inventory.
|
||||
The progressive mode can be enabled with `craftguide_progressive_mode = true` in `minetest.conf`.
|
||||
|
||||
`craftguide` is also integrated in `sfinv` (Minetest Game inventory) when you enable it with
|
||||
`craftguide_sfinv_only = true` in `minetest.conf`.
|
||||
|
||||

|
||||
|
@ -1,2 +1,3 @@
|
||||
sfinv?
|
||||
sfinv_buttons?
|
||||
intllib?
|
||||
|
123
init.lua
123
init.lua
@ -1,5 +1,8 @@
|
||||
local craftguide, datas, mt = {}, {searches = {}}, minetest
|
||||
|
||||
local progressive_mode = mt.settings:get_bool("craftguide_progressive_mode")
|
||||
local sfinv_only = mt.settings:get_bool("craftguide_sfinv_only")
|
||||
|
||||
local get_recipe, get_recipes = mt.get_craft_recipe, mt.get_all_craft_recipes
|
||||
local get_result, show_formspec = mt.get_craft_result, mt.show_formspec
|
||||
local reg_items = mt.registered_items
|
||||
@ -14,6 +17,7 @@ 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 = 9, 12
|
||||
@ -105,8 +109,9 @@ function craftguide:get_recipe(iY, xoffset, recipe_num, recipes, show_usage)
|
||||
local formspec, recipes_total = "", #recipes
|
||||
if recipes_total > 1 then
|
||||
formspec = formspec ..
|
||||
"button[0," .. (iY + 3.3) .. ";2,1;alternate;" .. S("Alternate") .. "]" ..
|
||||
"label[0," .. (iY + 2.8) .. ";" ..
|
||||
"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) .. "]"
|
||||
end
|
||||
@ -118,7 +123,7 @@ function craftguide:get_recipe(iY, xoffset, recipe_num, recipes, show_usage)
|
||||
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 + 1.7) ..
|
||||
"image[" .. (xoffset - 0.8) .. "," .. (iY + (sfinv_only and 2.2 or 1.7)) ..
|
||||
";0.5,0.5;craftguide_" .. icon .. ".png]"
|
||||
end
|
||||
|
||||
@ -150,7 +155,8 @@ function craftguide:get_recipe(iY, xoffset, recipe_num, recipes, show_usage)
|
||||
local tltip = self:get_tooltip(item_r, recipe_type, width, groups)
|
||||
|
||||
formspec = formspec ..
|
||||
"item_image_button[" .. X .. "," .. (Y + 0.2) .. ";" ..
|
||||
"item_image_button[" .. X .. "," ..
|
||||
(Y + (sfinv_only and 0.7 or 0.2)) .. ";" ..
|
||||
btn_size .. "," .. btn_size .. ";" .. item_r ..
|
||||
";" .. item_r .. ";" .. label .. "]" .. tltip
|
||||
end
|
||||
@ -158,16 +164,17 @@ function craftguide:get_recipe(iY, xoffset, recipe_num, recipes, show_usage)
|
||||
|
||||
local output = recipes[recipe_num].output
|
||||
return formspec ..
|
||||
"image[" .. (xoffset - 1) .. "," .. (iY + 2.35) ..
|
||||
"image[" .. (xoffset - 1) .. "," .. (iY + (sfinv_only and 2.85 or 2.35)) ..
|
||||
";0.9,0.7;craftguide_arrow.png]" ..
|
||||
"item_image_button[" .. (xoffset - 2) .. "," .. (iY + 2.2) .. ";1,1;" ..
|
||||
"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)
|
||||
local data = datas[player_name]
|
||||
local iY = data.iX - 5
|
||||
local iY = sfinv_only and 4 or data.iX - 5
|
||||
local ipp = data.iX * iY
|
||||
|
||||
if not data.items then
|
||||
@ -176,27 +183,31 @@ function craftguide:get_formspec(player_name, is_fuel)
|
||||
|
||||
data.pagemax = max(1, ceil(#data.items / ipp))
|
||||
|
||||
local formspec = "size[" .. (data.iX - 0.35) .. "," .. (iY + 4) .. ";]" .. [[
|
||||
background[1,1;1,1;craftguide_bg.png;true]
|
||||
local formspec = ""
|
||||
if not sfinv_only then
|
||||
formspec = formspec ..
|
||||
"size[" .. (data.iX - 0.35) .. "," .. (iY + 4) .. ";]" ..
|
||||
"background[1,1;1,1;craftguide_bg.png;true]" ..
|
||||
"tooltip[size_inc;" .. S("Increase window size") .. "]" ..
|
||||
"tooltip[size_dec;" .. S("Decrease window size") .. "]" ..
|
||||
"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 .. [[
|
||||
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[size_inc;" .. S("Increase window size") .. "]" ..
|
||||
"tooltip[size_dec;" .. S("Decrease window size") .. "]" ..
|
||||
"tooltip[prev;" .. S("Previous page") .. "]" ..
|
||||
"tooltip[next;" .. S("Next page") .. "]" ..
|
||||
"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;-]" ..
|
||||
"button[" .. (data.iX - 3.1) .. ",0;0.8,0.95;prev;<]" ..
|
||||
"label[" .. (data.iX - 2.2) .. ",0.18;" ..
|
||||
colorize(data.pagenum) .. " / " .. data.pagemax .. "]" ..
|
||||
"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) .. "]"
|
||||
"field[0.3,0.32;2.5,1;filter;;" .. mt.formspec_escape(data.filter) .. "]"
|
||||
|
||||
local even_num = data.iX % 2 == 0
|
||||
local xoffset = data.iX / 2 + (even_num and 0.5 or 0)
|
||||
@ -240,8 +251,13 @@ function craftguide:get_formspec(player_name, is_fuel)
|
||||
end
|
||||
|
||||
data.formspec = formspec
|
||||
|
||||
if sfinv_only then
|
||||
return formspec
|
||||
else
|
||||
show_formspec(player_name, "craftguide", formspec)
|
||||
end
|
||||
end
|
||||
|
||||
local function player_has_item(T)
|
||||
for i = 1, #T do
|
||||
@ -390,11 +406,32 @@ function craftguide:get_item_usages(item)
|
||||
return usages
|
||||
end
|
||||
|
||||
mt.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local function get_fields(player, ...)
|
||||
local args = {...}
|
||||
local formname, fields
|
||||
|
||||
if #args == 1 then
|
||||
formname = "craftguide"
|
||||
fields = args[#args]
|
||||
else
|
||||
formname, fields = unpack(args)
|
||||
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
|
||||
sfinv.set_player_inventory_formspec(player, context)
|
||||
else
|
||||
craftguide:get_formspec(player_name, is_fuel)
|
||||
end
|
||||
end
|
||||
|
||||
if fields.clear then
|
||||
data.show_usage = nil
|
||||
data.filter = ""
|
||||
@ -403,7 +440,7 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
|
||||
data.rnum = 1
|
||||
|
||||
data.items = progressive_mode and data.init_filter_items or datas.init_items
|
||||
craftguide:get_formspec(player_name)
|
||||
show_fs()
|
||||
|
||||
elseif fields.alternate then
|
||||
local num
|
||||
@ -414,14 +451,14 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
|
||||
end
|
||||
|
||||
data.rnum = num and data.rnum + 1 or 1
|
||||
craftguide:get_formspec(player_name)
|
||||
show_fs()
|
||||
|
||||
elseif (fields.key_enter_field == "filter" or fields.search) and
|
||||
fields.filter ~= "" then
|
||||
data.filter = fields.filter:lower()
|
||||
data.pagenum = 1
|
||||
craftguide:get_filter_items(data, player)
|
||||
craftguide:get_formspec(player_name)
|
||||
show_fs()
|
||||
|
||||
elseif fields.prev or fields.next then
|
||||
data.pagenum = data.pagenum - (fields.prev and 1 or -1)
|
||||
@ -432,13 +469,13 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
|
||||
data.pagenum = data.pagemax
|
||||
end
|
||||
|
||||
craftguide:get_formspec(player_name)
|
||||
show_fs()
|
||||
|
||||
elseif (fields.size_inc and data.iX < MAX_LIMIT) or
|
||||
(fields.size_dec and data.iX > MIN_LIMIT) then
|
||||
data.pagenum = 1
|
||||
data.iX = data.iX - (fields.size_dec and 1 or -1)
|
||||
craftguide:get_formspec(player_name)
|
||||
show_fs()
|
||||
|
||||
else for item in pairs(fields) do
|
||||
if item:find(":") then
|
||||
@ -459,7 +496,7 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
|
||||
data.rnum = 1
|
||||
end
|
||||
|
||||
craftguide:get_formspec(player_name)
|
||||
show_fs()
|
||||
else
|
||||
if progressive_mode then
|
||||
local inv = player:get_inventory()
|
||||
@ -474,12 +511,45 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
|
||||
data.rnum = 1
|
||||
data.show_usage = nil
|
||||
|
||||
craftguide:get_formspec(player_name, is_fuel)
|
||||
show_fs(is_fuel)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
if sfinv_only then
|
||||
sfinv.register_page("craftguide:craftguide", {
|
||||
title = "Craft Guide",
|
||||
get = function(self, player, context)
|
||||
local player_name = player:get_player_name()
|
||||
return sfinv.make_formspec(
|
||||
player,
|
||||
context,
|
||||
craftguide:get_formspec(player_name, context.fuel)
|
||||
)
|
||||
end,
|
||||
on_enter = function(self, player, context)
|
||||
if not datas.init_items then
|
||||
craftguide:get_init_items()
|
||||
end
|
||||
|
||||
local player_name = player:get_player_name()
|
||||
local data = datas[player_name]
|
||||
|
||||
if progressive_mode or not data then
|
||||
datas[player_name] = {filter = "", pagenum = 1, iX = 8}
|
||||
if progressive_mode then
|
||||
craftguide:get_filter_items(datas[player_name], player)
|
||||
end
|
||||
end
|
||||
end,
|
||||
on_player_receive_fields = function(self, player, context, fields)
|
||||
get_fields(player, fields)
|
||||
end,
|
||||
})
|
||||
else
|
||||
mt.register_on_player_receive_fields(get_fields)
|
||||
|
||||
function craftguide:on_use(itemstack, user)
|
||||
if not datas.init_items then
|
||||
@ -560,6 +630,7 @@ mt.register_craft({
|
||||
recipe = "craftguide:sign",
|
||||
burntime = 10
|
||||
})
|
||||
end
|
||||
|
||||
if rawget(_G, "sfinv_buttons") then
|
||||
sfinv_buttons.register_button("craftguide", {
|
||||
@ -572,8 +643,6 @@ if rawget(_G, "sfinv_buttons") then
|
||||
})
|
||||
end
|
||||
|
||||
mt.register_alias("xdecor:crafting_guide", "craftguide:book")
|
||||
|
||||
--[[ Custom recipes (>3x3) test code
|
||||
|
||||
mt.register_craftitem("craftguide:custom_recipe_test", {
|
||||
|
4
settingtypes.txt
Normal file
4
settingtypes.txt
Normal file
@ -0,0 +1,4 @@
|
||||
#For enabling some options of craftguide.
|
||||
|
||||
craftguide_progressive_mode (Progressive Mode) bool false
|
||||
craftguide_sfinv_only (Sfinv only) bool true
|
Loading…
x
Reference in New Issue
Block a user