Navigation Menu

Skip to content

Commit

Permalink
Bugfixes to get_craft_recipe and get_all_craft_recipes.
Browse files Browse the repository at this point in the history
Improvements to get_all_craft_recipes (see api doc)
  • Loading branch information
RealBadAngel authored and kwolekr committed Apr 11, 2013
1 parent dda2071 commit e7f5cdf
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 22 deletions.
21 changes: 17 additions & 4 deletions doc/lua_api.txt
Expand Up @@ -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
Expand Down
35 changes: 17 additions & 18 deletions src/scriptapi_craft.cpp
Expand Up @@ -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);

Expand All @@ -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);
}
Expand Down Expand Up @@ -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;
Expand All @@ -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++)
{
Expand All @@ -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;
Expand All @@ -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;
Expand Down

1 comment on commit e7f5cdf

@PilzAdam
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.