aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-06-06 23:39:17 +0300
committerPerttu Ahola <celeron55@gmail.com>2012-06-06 23:39:17 +0300
commita435cfcd82ccb138cbb05facdf3408335c638720 (patch)
treed376fd8316f45fc93bbeb86f4cd4a2f38efa2815
parent7631918a12068124fafbe7d78bb60b563a1824dd (diff)
downloadminetest-a435cfcd82ccb138cbb05facdf3408335c638720.tar.gz
minetest-a435cfcd82ccb138cbb05facdf3408335c638720.tar.bz2
minetest-a435cfcd82ccb138cbb05facdf3408335c638720.zip
Allow groups in crafting recipes
-rw-r--r--doc/lua_api.txt17
-rw-r--r--games/minimal/mods/experimental/init.lua8
-rw-r--r--src/craftdef.cpp26
3 files changed, 39 insertions, 12 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 5ec8ef79b..16587144d 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 = <optional list of item pairs,
replace one input item with another item on crafting>
}
-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 c8ffb25de..e8551034f 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 57a1851af..37fa63a00 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;
}