1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Added method to get all registered recipes for item(node)

This commit is contained in:
RealBadAngel 2013-03-04 01:55:16 +01:00 committed by kwolekr
parent ba78194636
commit 5af8acfa6e
4 changed files with 120 additions and 0 deletions

View file

@ -1000,6 +1000,79 @@ static int l_notify_authentication_modified(lua_State *L)
return 0;
}
// get_craft_recipes(result item)
static 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);
IGameDef *gdef = get_server(L);
ICraftDefManager *cdef = gdef->cdef();
CraftInput input;
CraftOutput output(o_item,0);
std::vector<CraftDefinition*> recipes_list = cdef->getCraftRecipes(output, gdef);
if (recipes_list.empty())
{
lua_pushnil(L);
return 1;
}
// Get the table insert function
lua_getglobal(L, "table");
lua_getfield(L, -1, "insert");
int table_insert = lua_gettop(L);
lua_newtable(L);
int table = lua_gettop(L);
for(std::vector<CraftDefinition*>::const_iterator
i = recipes_list.begin();
i != recipes_list.end(); i++)
{
CraftOutput tmpout;
tmpout.item = "";
tmpout.time = 0;
CraftDefinition *def = *i;
tmpout = def->getOutput(input, gdef);
if(tmpout.item.substr(0,output.item.length()) == output.item)
{
input = def->getInput(output, gdef);
lua_pushvalue(L, table_insert);
lua_pushvalue(L, table);
lua_newtable(L);
int k = 0;
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());
lua_settable(L, -3);
}
lua_setfield(L, -2, "items");
setintfield(L, -1, "width", input.width);
switch (input.method)
{
case CRAFT_METHOD_NORMAL:
lua_pushstring(L,"normal");
break;
case CRAFT_METHOD_COOKING:
lua_pushstring(L,"cooking");
break;
case CRAFT_METHOD_FUEL:
lua_pushstring(L,"fuel");
break;
default:
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));
}
}
return 1;
}
// rollback_get_last_node_actor(p, range, seconds) -> actor, p, seconds
static int l_rollback_get_last_node_actor(lua_State *L)
{
@ -1086,6 +1159,7 @@ static const struct luaL_Reg minetest_f [] = {
{"notify_authentication_modified", l_notify_authentication_modified},
{"get_craft_result", l_get_craft_result},
{"get_craft_recipe", l_get_craft_recipe},
{"get_all_craft_recipes", l_get_all_craft_recipes},
{"rollback_get_last_node_actor", l_rollback_get_last_node_actor},
{"rollback_revert_actions_by", l_rollback_revert_actions_by},
{NULL, NULL}