diff options
| -rw-r--r-- | api.lua | 78 | ||||
| -rw-r--r-- | locale/de.txt | 3 | ||||
| -rw-r--r-- | locale/template.txt | 3 | ||||
| -rw-r--r-- | textures/ui_craftgrid_icon.png | bin | 488 -> 896 bytes | 
4 files changed, 84 insertions, 0 deletions
| @@ -45,6 +45,7 @@ minetest.after(0.01, function()  	print("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 @@ -56,6 +57,77 @@ 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! +			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  	for _, recipes in pairs(unified_inventory.crafts_for.recipe) do @@ -204,6 +276,12 @@ unified_inventory.register_craft_type("digging", {  	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 diff --git a/locale/de.txt b/locale/de.txt index 1ef1d39..e652e49 100644 --- a/locale/de.txt +++ b/locale/de.txt @@ -1,5 +1,8 @@  # Translation mostly by Xanthin +### api.lua ### +Digging (by chance) = Graben (durch Zufall) +  ### bags.lua ###  Bags = Taschen  Bag 1 = Tasche 1 diff --git a/locale/template.txt b/locale/template.txt index a741acf..e0e50f6 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -1,5 +1,8 @@  # Translation by +### api.lua ### +Digging (by chance) =  +  # Template  ### bags.lua ###  Bags =  diff --git a/textures/ui_craftgrid_icon.png b/textures/ui_craftgrid_icon.pngBinary files differ index b6831a9..6731327 100644 --- a/textures/ui_craftgrid_icon.png +++ b/textures/ui_craftgrid_icon.png | 
