|
@@ -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}
|