Skip to content
Permalink
Browse files

Bugfixes to get_craft_recipe and get_all_craft_recipes.

Improvements to get_all_craft_recipes (see api doc)
  • Loading branch information
RealBadAngel authored and kwolekr committed Apr 11, 2013
1 parent dda2071 commit e7f5cdf9d4cbe17a2a42015e072a791659b3886b
Showing with 34 additions and 22 deletions.
  1. +17 −4 doc/lua_api.txt
  2. +17 −18 src/scriptapi_craft.cpp
@@ -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
@@ -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;

1 comment on commit e7f5cdf

@PilzAdam

This comment has been minimized.

Copy link
Contributor

@PilzAdam PilzAdam commented on e7f5cdf Apr 11, 2013

Why the example? lua-api.txt shouldnt contain many examples. It should be short and precise.
This function is completly understandable without examples. You can add the example to the dev wiki if you want.

Please sign in to comment.
You can’t perform that action at this time.