forked from minetest-mods/unified_inventory
Merge pull request #65 from Wuzzy2/digging_chance
Add partial support for complex (table-based) node drops
This commit is contained in:
commit
32769c9f34
78
api.lua
78
api.lua
|
@ -45,6 +45,7 @@ minetest.after(0.01, function()
|
||||||
print("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
|
print("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
|
||||||
for _, name in ipairs(unified_inventory.items_list) do
|
for _, name in ipairs(unified_inventory.items_list) do
|
||||||
local def = minetest.registered_items[name]
|
local def = minetest.registered_items[name]
|
||||||
|
-- Simple drops
|
||||||
if type(def.drop) == "string" then
|
if type(def.drop) == "string" then
|
||||||
local dstack = ItemStack(def.drop)
|
local dstack = ItemStack(def.drop)
|
||||||
if not dstack:is_empty() and dstack:get_name() ~= name then
|
if not dstack:is_empty() and dstack:get_name() ~= name then
|
||||||
|
@ -56,6 +57,77 @@ minetest.after(0.01, function()
|
||||||
})
|
})
|
||||||
|
|
||||||
end
|
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!
|
||||||
|
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
|
||||||
|
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
|
||||||
end
|
end
|
||||||
for _, recipes in pairs(unified_inventory.crafts_for.recipe) do
|
for _, recipes in pairs(unified_inventory.crafts_for.recipe) do
|
||||||
|
@ -204,6 +276,12 @@ unified_inventory.register_craft_type("digging", {
|
||||||
height = 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)
|
function unified_inventory.register_page(name, def)
|
||||||
unified_inventory.pages[name] = def
|
unified_inventory.pages[name] = def
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
# Translation mostly by Xanthin
|
# Translation mostly by Xanthin
|
||||||
|
|
||||||
|
### api.lua ###
|
||||||
|
Digging (by chance) = Graben (durch Zufall)
|
||||||
|
|
||||||
### bags.lua ###
|
### bags.lua ###
|
||||||
Bags = Taschen
|
Bags = Taschen
|
||||||
Bag 1 = Tasche 1
|
Bag 1 = Tasche 1
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
# Translation by
|
# Translation by
|
||||||
|
|
||||||
|
### api.lua ###
|
||||||
|
Digging (by chance) =
|
||||||
|
|
||||||
# Template
|
# Template
|
||||||
### bags.lua ###
|
### bags.lua ###
|
||||||
Bags =
|
Bags =
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 488 B After Width: | Height: | Size: 896 B |
Loading…
Reference in New Issue
Block a user