From 7b69a6d46e801c60fd82ce6fa8f378d91577f780 Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Thu, 11 Apr 2013 03:36:38 +0200 Subject: [PATCH] Bugfixes to get_craft_recipe and get_all_craft_recipes. Improvements to get_all_craft_recipes (see api doc) --- doc/lua_api.txt | 21 +++++++++++++++++---- src/scriptapi_craft.cpp | 21 ++++++++++----------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 285f3d205..b29c50379 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -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 diff --git a/src/scriptapi_craft.cpp b/src/scriptapi_craft.cpp index 183eeb840..4c6e1e3da 100644 --- a/src/scriptapi_craft.cpp +++ b/src/scriptapi_craft.cpp @@ -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; @@ -411,21 +407,22 @@ 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::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_pushinteger(L,k); lua_pushstring(L,i->name.c_str()); lua_settable(L, -3); } @@ -446,6 +443,8 @@ int l_get_all_craft_recipes(lua_State *L) lua_pushstring(L,"unknown"); } lua_setfield(L, -2, "type"); + 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)); }