1
0
Fork 0

Implement recipe registering API

This commit is contained in:
the-real-herowl 2023-11-13 17:01:37 +01:00 committed by the-real-herowl
parent 12568a6749
commit b252e577ec
1 changed files with 47 additions and 60 deletions

View File

@ -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 local cut_item = ItemStack(str)
table.insert(cuttable_recipes, item_name) cut_item:set_count(recipe)
end inv:set_stack("output", 1, cut_item)
end else
inv:set_stack("output", 1, "")
end end
meta:set_string("formspec", show_stonecutter_formspec(cuttable_recipes))
else else
meta:set_string("formspec", show_stonecutter_formspec(nil)) meta:set_string("formspec", show_stonecutter_formspec(nil))
end 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)
if string.match(str, "mcl_stairs:slab_") then
cut_item:set_count(2)
else
cut_item:set_count(1)
end
inv:set_stack("output", 1, cut_item)
else
inv:set_stack("output", 1, "")
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
@ -127,18 +114,18 @@ minetest.register_node("mcl_stonecutter:stonecutter", {
"mcl_stonecutter_bottom.png", "mcl_stonecutter_bottom.png",
"mcl_stonecutter_side.png", "mcl_stonecutter_side.png",
"mcl_stonecutter_side.png", "mcl_stonecutter_side.png",
{name="mcl_stonecutter_saw.png", {name="mcl_stonecutter_saw.png",
animation={ animation={
type="vertical_frames", type="vertical_frames",
aspect_w=16, aspect_w=16,
aspect_h=16, aspect_h=16,
length=1 length=1
}}, }},
{name="mcl_stonecutter_saw.png", {name="mcl_stonecutter_saw.png",
animation={ animation={
type="vertical_frames", type="vertical_frames",
aspect_w=16, aspect_w=16,
aspect_h=16, aspect_h=16,
length=1 length=1
}} }}
}, },