mirror of
https://github.com/minetest-mods/unified_inventory.git
synced 2025-06-30 07:20:39 +02:00
Version MFF.
This commit is contained in:
175
api.lua
Normal file → Executable file
175
api.lua
Normal file → Executable file
@ -1,9 +1,5 @@
|
||||
local S
|
||||
if intllib then
|
||||
S = intllib.Getter()
|
||||
else
|
||||
S = function(s) return s end
|
||||
end
|
||||
local S = unified_inventory.gettext
|
||||
local F = unified_inventory.fgettext
|
||||
|
||||
-- Create detached creative inventory after loading all mods
|
||||
minetest.after(0.01, function()
|
||||
@ -24,7 +20,33 @@ minetest.after(0.01, function()
|
||||
local recipes = minetest.get_all_craft_recipes(name)
|
||||
if recipes then
|
||||
for _, recipe in ipairs(recipes) do
|
||||
unified_inventory.register_craft(recipe)
|
||||
|
||||
local unknowns
|
||||
|
||||
for _,chk in pairs(recipe.items) do
|
||||
local groupchk = string.find(chk, "group:")
|
||||
if groupchk then
|
||||
for _,groupname in pairs(string.gsub(chk, "group:", ""):split(",")) do
|
||||
if not unified_inventory.get_group_item(groupname).item then
|
||||
unknowns = true
|
||||
if minetest.setting_getbool("show_unknown_craftrecipes") then
|
||||
minetest.log("error", "Recipe for item " .. recipe.output .. " contains unknown group " .. groupname)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
elseif not minetest.registered_items[chk] then
|
||||
unknowns = true
|
||||
if minetest.setting_getbool("show_unknown_craftrecipes") then
|
||||
minetest.log("error", "Recipe for item " .. recipe.output .. " contains unknown item " .. chk)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not unknowns then
|
||||
unified_inventory.register_craft(recipe)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -32,9 +54,10 @@ minetest.after(0.01, function()
|
||||
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)
|
||||
minetest.log("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
|
||||
for _, name in ipairs(unified_inventory.items_list) do
|
||||
local def = minetest.registered_items[name]
|
||||
-- Simple drops
|
||||
if type(def.drop) == "string" then
|
||||
local dstack = ItemStack(def.drop)
|
||||
if not dstack:is_empty() and dstack:get_name() ~= name then
|
||||
@ -46,6 +69,79 @@ minetest.after(0.01, function()
|
||||
})
|
||||
|
||||
end
|
||||
-- Complex drops. Yes, it's really complex!
|
||||
elseif type(def.drop) == "table" then
|
||||
--[[ Extract single items from the table and save them into dedicated tables
|
||||
to register them later, in order to avoid duplicates. These tables counts
|
||||
the total number of guaranteed drops and drops by chance (“maybes”) for each item.
|
||||
For “maybes”, the final count is the theoretical maximum number of items, not
|
||||
neccessarily the actual drop count. ]]
|
||||
local drop_guaranteed = {}
|
||||
local drop_maybe = {}
|
||||
-- This is for catching an obscure corner case: If the top items table has
|
||||
-- only items with rarity = 1, but max_items is set, then only the first
|
||||
-- max_items will be part of the drop, any later entries are logically
|
||||
-- impossible, so this variable is for keeping track of this
|
||||
local max_items_left = def.drop.max_items
|
||||
-- For checking whether we still encountered only guaranteed only so far;
|
||||
-- for the first “maybe” item it will become false which will cause ALL
|
||||
-- later items to be considered “maybes”.
|
||||
-- A common idiom is:
|
||||
-- { max_items 1, { items = {
|
||||
-- { items={"example:1"}, rarity = 5 },
|
||||
-- { items={"example:2"}, rarity = 1 }, }}}
|
||||
-- example:2 must be considered a “maybe” because max_items is set and it
|
||||
-- appears after a “maybe”
|
||||
local max_start = true
|
||||
-- Let's iterate through the items madness!
|
||||
if def.drop.items then
|
||||
for i=1,#def.drop.items do
|
||||
if max_items_left ~= nil and max_items_left <= 0 then break end
|
||||
local itit = def.drop.items[i]
|
||||
for j=1,#itit.items do
|
||||
local dstack = ItemStack(itit.items[j])
|
||||
if not dstack:is_empty() and dstack:get_name() ~= name then
|
||||
local dname = dstack:get_name()
|
||||
local dcount = dstack:get_count()
|
||||
-- Guaranteed drops AND we are not yet in “maybe mode”
|
||||
if #itit.items == 1 and itit.rarity == 1 and max_start then
|
||||
if drop_guaranteed[dname] == nil then
|
||||
drop_guaranteed[dname] = 0
|
||||
end
|
||||
drop_guaranteed[dname] = drop_guaranteed[dname] + dcount
|
||||
|
||||
if max_items_left ~= nil then
|
||||
max_items_left = max_items_left - 1
|
||||
if max_items_left <= 0 then break end
|
||||
end
|
||||
-- Drop was a “maybe”
|
||||
else
|
||||
if max_items_left ~= nil then max_start = false end
|
||||
if drop_maybe[dname] == nil then
|
||||
drop_maybe[dname] = 0
|
||||
end
|
||||
drop_maybe[dname] = drop_maybe[dname] + dcount
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
for itemstring, count in pairs(drop_guaranteed) do
|
||||
unified_inventory.register_craft({
|
||||
type = "digging",
|
||||
items = {name},
|
||||
output = itemstring .. " " .. count,
|
||||
width = 0,
|
||||
})
|
||||
end
|
||||
for itemstring, count in pairs(drop_maybe) do
|
||||
unified_inventory.register_craft({
|
||||
type = "digging_chance",
|
||||
items = {name},
|
||||
output = itemstring .. " " .. count,
|
||||
width = 0,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, recipes in pairs(unified_inventory.crafts_for.recipe) do
|
||||
@ -73,50 +169,43 @@ 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
|
||||
if not input then
|
||||
unified_inventory.home_pos = {}
|
||||
return
|
||||
end
|
||||
while true do
|
||||
local x = input:read("*n")
|
||||
if not x 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)
|
||||
end
|
||||
load_home()
|
||||
|
||||
function unified_inventory.set_home(player, pos)
|
||||
local player_name = player:get_player_name()
|
||||
unified_inventory.home_pos[player_name] = pos
|
||||
unified_inventory.home_pos[player_name] = vector.round(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
|
||||
output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n")
|
||||
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
|
||||
if pos then
|
||||
player:setpos(pos)
|
||||
end
|
||||
end
|
||||
|
||||
-- register_craft
|
||||
function unified_inventory.register_craft(options)
|
||||
if options.output == nil then
|
||||
if not options.output then
|
||||
return
|
||||
end
|
||||
local itemstack = ItemStack(options.output)
|
||||
@ -126,7 +215,7 @@ function unified_inventory.register_craft(options)
|
||||
if options.type == "normal" and options.width == 0 then
|
||||
options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
|
||||
end
|
||||
if unified_inventory.crafts_for.recipe[itemstack:get_name()] == nil then
|
||||
if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then
|
||||
unified_inventory.crafts_for.recipe[itemstack:get_name()] = {}
|
||||
end
|
||||
table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options)
|
||||
@ -156,7 +245,8 @@ end
|
||||
|
||||
|
||||
unified_inventory.register_craft_type("normal", {
|
||||
description = "Crafting",
|
||||
description = F("Crafting"),
|
||||
icon = "ui_craftgrid_icon.png",
|
||||
width = 3,
|
||||
height = 3,
|
||||
get_shaped_craft_width = function (craft) return craft.width end,
|
||||
@ -171,7 +261,8 @@ unified_inventory.register_craft_type("normal", {
|
||||
|
||||
|
||||
unified_inventory.register_craft_type("shapeless", {
|
||||
description = "Mixing",
|
||||
description = F("Mixing"),
|
||||
icon = "ui_craftgrid_icon.png",
|
||||
width = 3,
|
||||
height = 3,
|
||||
dynamic_display_size = function (craft)
|
||||
@ -185,18 +276,26 @@ unified_inventory.register_craft_type("shapeless", {
|
||||
|
||||
|
||||
unified_inventory.register_craft_type("cooking", {
|
||||
description = "Cooking",
|
||||
description = F("Cooking"),
|
||||
icon = "default_furnace_front.png",
|
||||
width = 1,
|
||||
height = 1,
|
||||
})
|
||||
|
||||
|
||||
unified_inventory.register_craft_type("digging", {
|
||||
description = "Digging",
|
||||
description = F("Digging"),
|
||||
icon = "default_tool_steelpick.png",
|
||||
width = 1,
|
||||
height = 1,
|
||||
})
|
||||
|
||||
unified_inventory.register_craft_type("digging_chance", {
|
||||
description = "Digging (by chance)",
|
||||
icon = "default_tool_steelpick.png^[transformFY.png",
|
||||
width = 1,
|
||||
height = 1,
|
||||
})
|
||||
|
||||
function unified_inventory.register_page(name, def)
|
||||
unified_inventory.pages[name] = def
|
||||
@ -215,9 +314,7 @@ 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
|
||||
return minetest.check_player_privs(playername, {creative=true})
|
||||
or minetest.setting_getbool("creative_mode")
|
||||
end
|
||||
|
||||
|
Reference in New Issue
Block a user