1
0
mirror of https://github.com/moparisthebest/minetest synced 2024-12-23 08:08:47 -05:00

Bugfixes to get_craft_recipe and get_all_craft_recipes.

Improvements to get_all_craft_recipes (see api doc)
This commit is contained in:
RealBadAngel 2013-04-11 03:36:38 +02:00 committed by kwolekr
parent dda2071cc0
commit e7f5cdf9d4
2 changed files with 34 additions and 22 deletions

View File

@ -1002,10 +1002,23 @@ minetest.get_craft_recipe(output) -> input
^ input.items = for example { stack 1, stack 2, stack 3, stack 4, ^ input.items = for example { stack 1, stack 2, stack 3, stack 4,
stack 5, stack 6, stack 7, stack 8, stack 9 } stack 5, stack 6, stack 7, stack 8, stack 9 }
^ input.items = nil if no recipe found ^ input.items = nil if no recipe found
minetest.get_all_craft_recipes(output) -> table or nil minetest.get_all_craft_recipes(query item) -> table or nil
^ returns table with all registered recipes for output item (node) ^ returns indexed table with all registered recipes for query item (node)
^ returns nil if no recipe was found or nil if no recipe was found
^ table entries have same format as minetest.get_craft_recipe 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) minetest.handle_node_drops(pos, drops, digger)
^ drops: list of itemstrings ^ drops: list of itemstrings
^ Handles drops from nodes after digging: Default action is to put them into ^ Handles drops from nodes after digging: Default action is to put them into

View File

@ -330,8 +330,7 @@ int l_get_craft_result(lua_State *L)
// get_craft_recipe(result item) // get_craft_recipe(result item)
int l_get_craft_recipe(lua_State *L) int l_get_craft_recipe(lua_State *L)
{ {
int k = 0; int k = 1;
char tmp[20];
int input_i = 1; int input_i = 1;
std::string o_item = luaL_checkstring(L,input_i); std::string o_item = luaL_checkstring(L,input_i);
@ -351,8 +350,7 @@ int l_get_craft_recipe(lua_State *L)
{ {
continue; continue;
} }
sprintf(tmp,"%d",k); lua_pushinteger(L,k);
lua_pushstring(L,tmp);
lua_pushstring(L,i->name.c_str()); lua_pushstring(L,i->name.c_str());
lua_settable(L, -3); lua_settable(L, -3);
} }
@ -383,9 +381,7 @@ int l_get_craft_recipe(lua_State *L)
// get_all_craft_recipes(result item) // get_all_craft_recipes(result item)
int l_get_all_craft_recipes(lua_State *L) int l_get_all_craft_recipes(lua_State *L)
{ {
char tmp[20]; std::string o_item = luaL_checkstring(L,1);
int input_i = 1;
std::string o_item = luaL_checkstring(L,input_i);
IGameDef *gdef = get_server(L); IGameDef *gdef = get_server(L);
ICraftDefManager *cdef = gdef->cdef(); ICraftDefManager *cdef = gdef->cdef();
CraftInput input; CraftInput input;
@ -402,7 +398,7 @@ int l_get_all_craft_recipes(lua_State *L)
int table_insert = lua_gettop(L); int table_insert = lua_gettop(L);
lua_newtable(L); lua_newtable(L);
int table = lua_gettop(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.begin();
i != recipes_list.end(); i++) i != recipes_list.end(); i++)
{ {
@ -411,28 +407,29 @@ int l_get_all_craft_recipes(lua_State *L)
tmpout.time = 0; tmpout.time = 0;
CraftDefinition *def = *i; CraftDefinition *def = *i;
tmpout = def->getOutput(input, gdef); 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); input = def->getInput(output, gdef);
lua_pushvalue(L, table_insert); lua_pushvalue(L, table_insert);
lua_pushvalue(L, table); lua_pushvalue(L, table);
lua_newtable(L); lua_newtable(L);
int k = 0; int k = 1;
lua_newtable(L); lua_newtable(L);
for(std::vector<ItemStack>::const_iterator for(std::vector<ItemStack>::const_iterator
i = input.items.begin(); i = input.items.begin();
i != input.items.end(); i++, k++) i != input.items.end(); i++, k++)
{ {
if (i->empty()) continue; if (i->empty())
sprintf(tmp,"%d",k); continue;
lua_pushstring(L,tmp); lua_pushinteger(L, k);
lua_pushstring(L,i->name.c_str()); lua_pushstring(L, i->name.c_str());
lua_settable(L, -3); lua_settable(L, -3);
} }
lua_setfield(L, -2, "items"); lua_setfield(L, -2, "items");
setintfield(L, -1, "width", input.width); setintfield(L, -1, "width", input.width);
switch (input.method) switch (input.method) {
{
case CRAFT_METHOD_NORMAL: case CRAFT_METHOD_NORMAL:
lua_pushstring(L,"normal"); lua_pushstring(L,"normal");
break; break;
@ -446,8 +443,10 @@ int l_get_all_craft_recipes(lua_State *L)
lua_pushstring(L,"unknown"); lua_pushstring(L,"unknown");
} }
lua_setfield(L, -2, "type"); lua_setfield(L, -2, "type");
if(lua_pcall(L, 2, 0, 0)) lua_pushstring(L, &tmpout.item[0]);
script_error(L, "error: %s", lua_tostring(L, -1)); lua_setfield(L, -2, "output");
if (lua_pcall(L, 2, 0, 0))
script_error(L, "error: %s", lua_tostring(L, -1));
} }
} }
return 1; return 1;