Bugfixes to get_craft_recipe and get_all_craft_recipes.
authorRealBadAngel <mk@realbadangel.pl>
Thu, 11 Apr 2013 01:36:38 +0000 (03:36 +0200)
committerkwolekr <kwolekr@minetest.net>
Thu, 11 Apr 2013 02:33:59 +0000 (22:33 -0400)
Improvements to get_all_craft_recipes (see api doc)

doc/lua_api.txt
src/scriptapi_craft.cpp

index 285f3d205ee53299aace366e6063ce911b42b32a..b29c503797a7724cb99a9c6972ef23fc7ab62a99 100644 (file)
@@ -1002,10 +1002,23 @@ minetest.get_craft_recipe(output) -> input
 ^ input.items = for example { stack 1, stack 2, stack 3, stack 4,
                               stack 5, stack 6, stack 7, stack 8, stack 9 }
 ^ input.items = nil if no recipe found
-minetest.get_all_craft_recipes(output) -> table or nil
-^ returns table with all registered recipes for output item (node)
-^ returns nil if no recipe was found
-^ table entries have same format as minetest.get_craft_recipe
+minetest.get_all_craft_recipes(query item) -> table or nil
+^ returns indexed table with all registered recipes for query item (node)
+  or nil if no recipe was found
+  recipe entry table:
+  { 
+   method = 'normal' or 'cooking' or 'fuel'
+   width = 0-3, 0 means shapeless recipe
+   items = indexed [1-9] table with recipe items
+   output = string with item name and quantity
+  }
+  Example query for default:gold_ingot will return table:
+  {
+   1={type = "cooking", width = 3, output = "default:gold_ingot",
+    items = {1 = "default:gold_lump"}},
+   2={type = "normal", width = 1, output = "default:gold_ingot 9",
+    items = {1 = "default:goldblock"}}
+  }
 minetest.handle_node_drops(pos, drops, digger)
 ^ drops: list of itemstrings
 ^ Handles drops from nodes after digging: Default action is to put them into
index 183eeb84055759ed1f4c534728632df688088c8d..459908237e84c10bcaae43d20f9599ace79426f3 100644 (file)
@@ -330,8 +330,7 @@ int l_get_craft_result(lua_State *L)
 // get_craft_recipe(result item)
 int l_get_craft_recipe(lua_State *L)
 {
-       int k = 0;
-       char tmp[20];
+       int k = 1;
        int input_i = 1;
        std::string o_item = luaL_checkstring(L,input_i);
 
@@ -351,8 +350,7 @@ int l_get_craft_recipe(lua_State *L)
                        {
                                continue;
                        }
-                       sprintf(tmp,"%d",k);
-                       lua_pushstring(L,tmp);
+                       lua_pushinteger(L,k);
                        lua_pushstring(L,i->name.c_str());
                        lua_settable(L, -3);
                }
@@ -383,9 +381,7 @@ int l_get_craft_recipe(lua_State *L)
 // get_all_craft_recipes(result item)
 int l_get_all_craft_recipes(lua_State *L)
 {
-       char tmp[20];
-       int input_i = 1;
-       std::string o_item = luaL_checkstring(L,input_i);
+       std::string o_item = luaL_checkstring(L,1);
        IGameDef *gdef = get_server(L);
        ICraftDefManager *cdef = gdef->cdef();
        CraftInput input;
@@ -402,7 +398,7 @@ int l_get_all_craft_recipes(lua_State *L)
        int table_insert = lua_gettop(L);
        lua_newtable(L);
        int table = lua_gettop(L);
-       for(std::vector<CraftDefinition*>::const_iterator
+       for (std::vector<CraftDefinition*>::const_iterator
                i = recipes_list.begin();
                i != recipes_list.end(); i++)
        {
@@ -411,28 +407,29 @@ int l_get_all_craft_recipes(lua_State *L)
                tmpout.time = 0;
                CraftDefinition *def = *i;
                tmpout = def->getOutput(input, gdef);
-               if(tmpout.item.substr(0,output.item.length()) == output.item)
+               std::string query = tmpout.item;
+               char *fmtpos, *fmt = &query[0];
+               if (strtok_r(fmt, " ", &fmtpos) == output.item)
                {
                        input = def->getInput(output, gdef);
                        lua_pushvalue(L, table_insert);
                        lua_pushvalue(L, table);
                        lua_newtable(L);
-                       int k = 0;
+                       int k = 1;
                        lua_newtable(L);
                        for(std::vector<ItemStack>::const_iterator
                                i = input.items.begin();
                                i != input.items.end(); i++, k++)
                        {
-                               if (i->empty()) continue;
-                               sprintf(tmp,"%d",k);
-                               lua_pushstring(L,tmp);
-                               lua_pushstring(L,i->name.c_str());
+                               if (i->empty())
+                                       continue;
+                               lua_pushinteger(L, k);
+                               lua_pushstring(L, i->name.c_str());
                                lua_settable(L, -3);
                        }
                        lua_setfield(L, -2, "items");
                        setintfield(L, -1, "width", input.width);
-                       switch (input.method)
-                               {
+                       switch (input.method) {
                                case CRAFT_METHOD_NORMAL:
                                        lua_pushstring(L,"normal");
                                        break;
@@ -446,8 +443,10 @@ int l_get_all_craft_recipes(lua_State *L)
                                        lua_pushstring(L,"unknown");
                                }
                        lua_setfield(L, -2, "type");
-                       if(lua_pcall(L, 2, 0, 0))
-                       script_error(L, "error: %s", lua_tostring(L, -1));
+                       lua_pushstring(L, &tmpout.item[0]);
+                       lua_setfield(L, -2, "output");
+                       if (lua_pcall(L, 2, 0, 0))
+                               script_error(L, "error: %s", lua_tostring(L, -1));
                }
        }
        return 1;