forked from VoxeLibre/VoxeLibre
Implement recipe registering API
This commit is contained in:
parent
12568a6749
commit
b252e577ec
|
@ -5,6 +5,30 @@
|
||||||
|
|
||||||
local S = minetest.get_translator("mcl_stonecutter")
|
local S = minetest.get_translator("mcl_stonecutter")
|
||||||
|
|
||||||
|
mcl_stonecutter = {}
|
||||||
|
mcl_stonecutter.registered_recipes = {}
|
||||||
|
|
||||||
|
-- API
|
||||||
|
-- input - string - name of a registered item
|
||||||
|
-- output - string - name of a registered item
|
||||||
|
-- count - int - number of the output -
|
||||||
|
-- - defaults to 1
|
||||||
|
-- - non-int rounded down
|
||||||
|
function mcl_stonecutter.register_recipe(input, output, count)
|
||||||
|
if not (minetest.registered_items[input] and minetest.registered_items[output]) then
|
||||||
|
error("Input or output is not a registered item")
|
||||||
|
end
|
||||||
|
local n = count
|
||||||
|
if type(count) ~= "number" then
|
||||||
|
n = 1
|
||||||
|
end
|
||||||
|
n = math.floor(n)
|
||||||
|
if not mcl_stonecutter.registered_recipes[input] then
|
||||||
|
mcl_stonecutter.registered_recipes[input] = {}
|
||||||
|
end
|
||||||
|
mcl_stonecutter.registered_recipes[input][output] = n
|
||||||
|
end
|
||||||
|
|
||||||
-- formspecs
|
-- formspecs
|
||||||
local function show_stonecutter_formspec(items, input)
|
local function show_stonecutter_formspec(items, input)
|
||||||
local cut_items = {}
|
local cut_items = {}
|
||||||
|
@ -13,13 +37,13 @@ local function show_stonecutter_formspec(items, input)
|
||||||
|
|
||||||
-- This loops through all the items that can be made and inserted into the formspec
|
-- This loops through all the items that can be made and inserted into the formspec
|
||||||
if items ~= nil then
|
if items ~= nil then
|
||||||
for index, value in pairs(items) do
|
for name, count in pairs(items) do
|
||||||
x_len = x_len + 1
|
x_len = x_len + 1
|
||||||
if x_len > 5 then
|
if x_len > 5 then
|
||||||
y_len = y_len + 1
|
y_len = y_len + 1
|
||||||
x_len = 1
|
x_len = 1
|
||||||
end
|
end
|
||||||
table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, value, ""))
|
table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, name, name, tostring(count)))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -43,66 +67,28 @@ local function show_stonecutter_formspec(items, input)
|
||||||
return formspec
|
return formspec
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--Checks for the string for the different stair and wall positions that shouldn't be craftable
|
|
||||||
local function check(item_name, input_name)
|
|
||||||
print(item_name)
|
|
||||||
if string.match(item_name, "mcl_walls") then
|
|
||||||
if string.match(item_name, "%d") then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if string.match(item_name, "_outer") then
|
|
||||||
return true
|
|
||||||
elseif string.match(item_name, "_inner") then
|
|
||||||
return true
|
|
||||||
elseif string.match(item_name, "_top") then
|
|
||||||
return true
|
|
||||||
elseif string.match(item_name, "_double") then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
if minetest.get_item_group(item_name, "stonecutter_stage") == 0 and minetest.get_item_group(input_name, "stonecutter_stage") > 0 then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Updates the formspec
|
-- Updates the formspec
|
||||||
local function update_stonecutter_slots(pos,str)
|
local function update_stonecutter_slots(pos, str)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
local input = inv:get_stack("input", 1)
|
local input = inv:get_stack("input", 1)
|
||||||
local name = input:get_name()
|
local name = input:get_name()
|
||||||
local compat_item = minetest.get_item_group(name, "stonecuttable")
|
local recipes = mcl_stonecutter.registered_recipes[name]
|
||||||
|
|
||||||
-- Checks if input is in the group
|
if recipes then
|
||||||
if compat_item > 0 then
|
meta:set_string("formspec", show_stonecutter_formspec(recipes))
|
||||||
local cuttable_recipes = {}
|
if str then
|
||||||
for item_name, item_def in pairs(minetest.registered_items) do
|
local recipe = recipes[str]
|
||||||
if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then
|
if not recipe then return end
|
||||||
if check(item_name, name) == false and name ~= item_name then
|
|
||||||
table.insert(cuttable_recipes, item_name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
meta:set_string("formspec", show_stonecutter_formspec(cuttable_recipes))
|
|
||||||
else
|
|
||||||
meta:set_string("formspec", show_stonecutter_formspec(nil))
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2
|
|
||||||
if minetest.get_item_group(str, "stonecutter_output") > 0 then
|
|
||||||
local cut_item = ItemStack(str)
|
local cut_item = ItemStack(str)
|
||||||
if string.match(str, "mcl_stairs:slab_") then
|
cut_item:set_count(recipe)
|
||||||
cut_item:set_count(2)
|
|
||||||
else
|
|
||||||
cut_item:set_count(1)
|
|
||||||
end
|
|
||||||
inv:set_stack("output", 1, cut_item)
|
inv:set_stack("output", 1, cut_item)
|
||||||
else
|
else
|
||||||
inv:set_stack("output", 1, "")
|
inv:set_stack("output", 1, "")
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
meta:set_string("formspec", show_stonecutter_formspec(nil))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Only drop the items that were in the input slot
|
-- Only drop the items that were in the input slot
|
||||||
|
@ -114,6 +100,7 @@ local function drop_stonecutter_items(pos, meta)
|
||||||
if not stack:is_empty() then
|
if not stack:is_empty() then
|
||||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||||
minetest.add_item(p, stack)
|
minetest.add_item(p, stack)
|
||||||
|
-- inv:set_stack("input", i, ItemStack())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue