mirror of
https://github.com/minetest-mods/craftguide.git
synced 2024-11-23 03:13:44 +01:00
Ability to register custom crafts dynamically
This commit is contained in:
parent
83151cb394
commit
3d77ec58b4
4
API.md
4
API.md
@ -73,10 +73,6 @@ end)
|
|||||||
|
|
||||||
Removes the recipe filter with the given name.
|
Removes the recipe filter with the given name.
|
||||||
|
|
||||||
#### `craftguide.set_recipe_filter(name, function(recipe, player))`
|
|
||||||
|
|
||||||
Removes all recipe filters and adds a new one.
|
|
||||||
|
|
||||||
#### `craftguide.get_recipe_filters()`
|
#### `craftguide.get_recipe_filters()`
|
||||||
|
|
||||||
Returns a map of recipe filters, indexed by name.
|
Returns a map of recipe filters, indexed by name.
|
||||||
|
81
init.lua
81
init.lua
@ -13,6 +13,7 @@ local fuel_cache = {}
|
|||||||
local progressive_mode = core.settings:get_bool("craftguide_progressive_mode")
|
local progressive_mode = core.settings:get_bool("craftguide_progressive_mode")
|
||||||
local sfinv_only = core.settings:get_bool("craftguide_sfinv_only") and rawget(_G, "sfinv")
|
local sfinv_only = core.settings:get_bool("craftguide_sfinv_only") and rawget(_G, "sfinv")
|
||||||
|
|
||||||
|
local log = core.log
|
||||||
local after = core.after
|
local after = core.after
|
||||||
local colorize = core.colorize
|
local colorize = core.colorize
|
||||||
local reg_items = core.registered_items
|
local reg_items = core.registered_items
|
||||||
@ -33,8 +34,8 @@ local on_receive_fields = core.register_on_player_receive_fields
|
|||||||
local ESC = core.formspec_escape
|
local ESC = core.formspec_escape
|
||||||
local S = core.get_translator("craftguide")
|
local S = core.get_translator("craftguide")
|
||||||
|
|
||||||
local maxn, sort, concat, copy =
|
local maxn, sort, concat, copy, insert =
|
||||||
table.maxn, table.sort, table.concat, table.copy
|
table.maxn, table.sort, table.concat, table.copy, table.insert
|
||||||
|
|
||||||
local fmt, find, gmatch, match, sub, split, upper, lower =
|
local fmt, find, gmatch, match, sub, split, upper, lower =
|
||||||
string.format, string.find, string.gmatch, string.match,
|
string.format, string.find, string.gmatch, string.match,
|
||||||
@ -78,10 +79,6 @@ local function table_replace(t, val, new)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function __func()
|
|
||||||
return debug.getinfo(2, "n").name
|
|
||||||
end
|
|
||||||
|
|
||||||
local function is_str(x)
|
local function is_str(x)
|
||||||
return type(x) == "string"
|
return type(x) == "string"
|
||||||
end
|
end
|
||||||
@ -98,24 +95,35 @@ local function is_func(x)
|
|||||||
return type(x) == "function"
|
return type(x) == "function"
|
||||||
end
|
end
|
||||||
|
|
||||||
local custom_crafts, craft_types = {}, {}
|
local craft_types = {}
|
||||||
|
|
||||||
function craftguide.register_craft_type(name, def)
|
function craftguide.register_craft_type(name, def)
|
||||||
local func = "craftguide." .. __func() .. "(): "
|
if not is_str(name) or name == "" then
|
||||||
assert(is_str(name), func .. "'name' field missing")
|
return log("error", "craftguide.register_craft_type(): name missing")
|
||||||
assert(is_str(def.description), func .. "'description' field missing")
|
end
|
||||||
assert(is_str(def.icon), func .. "'icon' field missing")
|
|
||||||
|
if not is_str(def.description) then
|
||||||
|
def.description = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
if not is_str(def.icon) then
|
||||||
|
def.icon = ""
|
||||||
|
end
|
||||||
|
|
||||||
craft_types[name] = def
|
craft_types[name] = def
|
||||||
end
|
end
|
||||||
|
|
||||||
function craftguide.register_craft(def)
|
function craftguide.register_craft(def)
|
||||||
|
if not is_table(def) or not next(def) then
|
||||||
|
return log("error", "craftguide.register_craft(): craft definition missing")
|
||||||
|
end
|
||||||
|
|
||||||
if def.result then
|
if def.result then
|
||||||
def.output = def.result -- Backward compatibility
|
def.output = def.result -- Backward compatibility
|
||||||
end
|
end
|
||||||
|
|
||||||
if not is_str(def.output) then
|
if not is_str(def.output) or def.output == "" then
|
||||||
def.output = ""
|
return log("error", "craftguide.register_craft(): output missing")
|
||||||
end
|
end
|
||||||
|
|
||||||
if not is_table(def.items) then
|
if not is_table(def.items) then
|
||||||
@ -151,15 +159,19 @@ function craftguide.register_craft(def)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
custom_crafts[#custom_crafts + 1] = def
|
local output = match(def.output, "%S*")
|
||||||
|
recipes_cache[output] = recipes_cache[output] or {}
|
||||||
|
insert(recipes_cache[output], def)
|
||||||
end
|
end
|
||||||
|
|
||||||
local recipe_filters = {}
|
local recipe_filters = {}
|
||||||
|
|
||||||
function craftguide.add_recipe_filter(name, f)
|
function craftguide.add_recipe_filter(name, f)
|
||||||
local func = "craftguide." .. __func() .. "(): "
|
if not is_str(name) or name == "" then
|
||||||
assert(is_str(name), func .. "filter name missing")
|
return log("error", "craftguide.add_recipe_filter(): name missing")
|
||||||
assert(is_func(f), func .. "filter function missing")
|
elseif not is_func(f) then
|
||||||
|
return log("error", "craftguide.add_recipe_filter(): function missing")
|
||||||
|
end
|
||||||
|
|
||||||
recipe_filters[name] = f
|
recipe_filters[name] = f
|
||||||
end
|
end
|
||||||
@ -168,14 +180,6 @@ function craftguide.remove_recipe_filter(name)
|
|||||||
recipe_filters[name] = nil
|
recipe_filters[name] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function craftguide.set_recipe_filter(name, f)
|
|
||||||
local func = "craftguide." .. __func() .. "(): "
|
|
||||||
assert(is_str(name), func .. "filter name missing")
|
|
||||||
assert(is_func(f), func .. "filter function missing")
|
|
||||||
|
|
||||||
recipe_filters = {[name] = f}
|
|
||||||
end
|
|
||||||
|
|
||||||
function craftguide.get_recipe_filters()
|
function craftguide.get_recipe_filters()
|
||||||
return recipe_filters
|
return recipe_filters
|
||||||
end
|
end
|
||||||
@ -191,9 +195,11 @@ end
|
|||||||
local search_filters = {}
|
local search_filters = {}
|
||||||
|
|
||||||
function craftguide.add_search_filter(name, f)
|
function craftguide.add_search_filter(name, f)
|
||||||
local func = "craftguide." .. __func() .. "(): "
|
if not is_str(name) or name == "" then
|
||||||
assert(is_str(name), func .. "filter name missing")
|
return log("error", "craftguide.add_search_filter(): name missing")
|
||||||
assert(is_func(f), func .. "filter function missing")
|
elseif not is_func(f) then
|
||||||
|
return log("error", "craftguide.add_search_filter(): function missing")
|
||||||
|
end
|
||||||
|
|
||||||
search_filters[name] = f
|
search_filters[name] = f
|
||||||
end
|
end
|
||||||
@ -299,17 +305,17 @@ end
|
|||||||
|
|
||||||
local function cache_recipes(output)
|
local function cache_recipes(output)
|
||||||
local recipes = get_all_recipes(output) or {}
|
local recipes = get_all_recipes(output) or {}
|
||||||
|
local num = #recipes
|
||||||
|
|
||||||
for i = 1, #custom_crafts do
|
if num > 0 then
|
||||||
local custom_craft = custom_crafts[i]
|
if recipes_cache[output] then
|
||||||
if match(custom_craft.output, "%S*") == output then
|
for i = 1, num do
|
||||||
recipes[#recipes + 1] = custom_craft
|
insert(recipes_cache[output], 1, recipes[i])
|
||||||
end
|
end
|
||||||
end
|
else
|
||||||
|
|
||||||
if #recipes > 0 then
|
|
||||||
recipes_cache[output] = recipes
|
recipes_cache[output] = recipes
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function cache_usages(item)
|
local function cache_usages(item)
|
||||||
@ -1335,8 +1341,9 @@ register_command("craft", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
function craftguide.show(name, item, show_usages)
|
function craftguide.show(name, item, show_usages)
|
||||||
local func = "craftguide." .. __func() .. "(): "
|
if not is_str(name) or name == "" then
|
||||||
assert(is_str(name), func .. "player name missing")
|
return log("error", "craftguide.show(): player name missing")
|
||||||
|
end
|
||||||
|
|
||||||
local data = pdata[name]
|
local data = pdata[name]
|
||||||
local player = get_player_by_name(name)
|
local player = get_player_by_name(name)
|
||||||
|
Loading…
Reference in New Issue
Block a user