forked from minetest-mods/unified_inventory
fa0142c2c0
get_all_craft_recipes() returns the recipes that were registered under the specified name, so asking about an item's canonical name won't see recipes registered under an alias, and vice versa. Several mods register recipes under aliases, so the craft guide was missing that handful of recipes. To work around it, invert the aliases table and ask explicitly about each alias.
114 lines
3.1 KiB
Lua
114 lines
3.1 KiB
Lua
|
|
-- Create detached creative inventory after loading all mods
|
|
minetest.after(0.01, function()
|
|
local rev_aliases = {}
|
|
for source, target in pairs(minetest.registered_aliases) do
|
|
if not rev_aliases[target] then rev_aliases[target] = {} end
|
|
table.insert(rev_aliases[target], source)
|
|
end
|
|
unified_inventory.items_list = {}
|
|
for name, def in pairs(minetest.registered_items) do
|
|
if (not def.groups.not_in_creative_inventory or
|
|
def.groups.not_in_creative_inventory == 0) and
|
|
def.description and def.description ~= "" then
|
|
table.insert(unified_inventory.items_list, name)
|
|
local all_names = rev_aliases[name] or {}
|
|
table.insert(all_names, name)
|
|
local all_recipes = {}
|
|
for _, name in ipairs(all_names) do
|
|
local recipes = minetest.get_all_craft_recipes(name)
|
|
if recipes then
|
|
for _, recipe in ipairs(recipes) do
|
|
table.insert(all_recipes, recipe)
|
|
end
|
|
end
|
|
end
|
|
unified_inventory.crafts_table[name] = all_recipes
|
|
end
|
|
end
|
|
table.sort(unified_inventory.items_list)
|
|
unified_inventory.items_list_size = #unified_inventory.items_list
|
|
print("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
|
|
end)
|
|
|
|
|
|
-- load_home
|
|
local function load_home()
|
|
local input = io.open(unified_inventory.home_filename, "r")
|
|
if input then
|
|
while true do
|
|
local x = input:read("*n")
|
|
if x == nil then
|
|
break
|
|
end
|
|
local y = input:read("*n")
|
|
local z = input:read("*n")
|
|
local name = input:read("*l")
|
|
unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z}
|
|
end
|
|
io.close(input)
|
|
else
|
|
unified_inventory.home_pos = {}
|
|
end
|
|
end
|
|
load_home()
|
|
|
|
function unified_inventory.set_home(player, pos)
|
|
local player_name = player:get_player_name()
|
|
unified_inventory.home_pos[player_name] = pos
|
|
-- save the home data from the table to the file
|
|
local output = io.open(unified_inventory.home_filename, "w")
|
|
for k, v in pairs(unified_inventory.home_pos) do
|
|
if v ~= nil then
|
|
output:write(math.floor(v.x).." "
|
|
..math.floor(v.y).." "
|
|
..math.floor(v.z).." "
|
|
..k.."\n")
|
|
end
|
|
end
|
|
io.close(output)
|
|
end
|
|
|
|
function unified_inventory.go_home(player)
|
|
local pos = unified_inventory.home_pos[player:get_player_name()]
|
|
if pos ~= nil then
|
|
player:setpos(pos)
|
|
end
|
|
end
|
|
|
|
-- register_craft
|
|
function unified_inventory.register_craft(options)
|
|
if options.output == nil then
|
|
return
|
|
end
|
|
local itemstack = ItemStack(options.output)
|
|
if itemstack:is_empty() then
|
|
return
|
|
end
|
|
if unified_inventory.crafts_table[itemstack:get_name()] == nil then
|
|
unified_inventory.crafts_table[itemstack:get_name()] = {}
|
|
end
|
|
table.insert(unified_inventory.crafts_table[itemstack:get_name()],options)
|
|
end
|
|
|
|
function unified_inventory.register_page(name, def)
|
|
unified_inventory.pages[name] = def
|
|
end
|
|
|
|
function unified_inventory.register_button(name, def)
|
|
if not def.action then
|
|
def.action = function(player)
|
|
unified_inventory.set_inventory_formspec(player, name)
|
|
end
|
|
end
|
|
def.name = name
|
|
table.insert(unified_inventory.buttons, def)
|
|
end
|
|
|
|
function unified_inventory.is_creative(playername)
|
|
if minetest.check_player_privs(playername, {creative=true}) or
|
|
minetest.setting_getbool("creative_mode") then
|
|
return true
|
|
end
|
|
end
|