diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 5ec8ef79..16587144 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -363,8 +363,7 @@ effective towards. Groups in crafting recipes --------------------------- -- Not implemented yet. (TODO) -- Will probably look like this: +An example: { output = 'food:meat_soup_raw', recipe = { @@ -372,7 +371,7 @@ Groups in crafting recipes {'group:water'}, {'group:bowl'}, }, - preserve = {'group:bowl'}, + preserve = {'group:bowl'}, -- Not implemented yet (TODO) } Special groups @@ -1210,19 +1209,19 @@ Node definition (register_node) ^ default: minetest.node_metadata_inventory_take_allow_all } -Recipe: (register_craft) +Recipe for register_craft: (shaped) { output = 'default:pick_stone', recipe = { {'default:cobble', 'default:cobble', 'default:cobble'}, {'', 'default:stick', ''}, - {'', 'default:stick', ''}, + {'', 'default:stick', ''}, -- Also groups; eg. 'group:crumbly' }, replacements = } -Recipe (shapeless): +Recipe for register_craft (shapeless) { type = "shapeless", output = 'mushrooms:mushroom_stew', @@ -1235,13 +1234,13 @@ Recipe (shapeless): replace one input item with another item on crafting> } -Recipe (tool repair): +Recipe for register_craft (tool repair) { type = "toolrepair", additional_wear = -0.02, } -Recipe (cooking): +Recipe for register_craft (cooking) { type = "cooking", output = "default:glass", @@ -1249,7 +1248,7 @@ Recipe (cooking): cooktime = 3, } -Recipe (furnace fuel): +Recipe for register_craft (furnace fuel) { type = "fuel", recipe = "default:leaves", diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua index c8ffb25d..e8551034 100644 --- a/games/minimal/mods/experimental/init.lua +++ b/games/minimal/mods/experimental/init.lua @@ -496,6 +496,14 @@ minetest.register_craftitem("experimental:tester_tool_1", { end, }) +minetest.register_craft({ + output = 'experimental:tester_tool_1', + recipe = { + {'group:crumbly'}, + {'group:crumbly'}, + } +}) + minetest.log("experimental modname="..dump(minetest.get_current_modname())) minetest.log("experimental modpath="..dump(minetest.get_modpath("experimental"))) minetest.log("experimental worldpath="..dump(minetest.get_worldpath())) diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 57a1851a..37fa63a0 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -27,6 +27,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "inventory.h" +// Check if input matches recipe +// Takes recipe groups into account +static bool inputItemMatchesRecipe(const std::string &inp_name, + const std::string &rec_name, IItemDefManager *idef) +{ + // Exact name + if(inp_name == rec_name) + return true; + + // Group + if(rec_name.substr(0,6) == "group:" && idef->isKnown(inp_name)){ + std::string rec_group = rec_name.substr(6); + const struct ItemDefinition &def = idef->get(inp_name); + if(itemgroup_get(def.groups, rec_group) != 0) + return true; + } + + // Didn't match + return false; +} // Deserialize an itemstring then return the name of the item static std::string craftGetItemName(const std::string &itemstring, IGameDef *gamedef) @@ -403,9 +423,9 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co unsigned int rec_x = rec_min_x + x; unsigned int rec_y = rec_min_y + y; - if( - inp_names[inp_y * inp_width + inp_x] != - rec_names[rec_y * rec_width + rec_x] + if(!inputItemMatchesRecipe( + inp_names[inp_y * inp_width + inp_x], + rec_names[rec_y * rec_width + rec_x], gamedef->idef()) ){ return false; }