mirror of
https://github.com/minetest/minetest.git
synced 2024-12-23 14:42:24 +01: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:
parent
dda2071cc0
commit
e7f5cdf9d4
@ -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
|
||||||
|
@ -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;
|
||||||
@ -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,6 +443,8 @@ 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");
|
||||||
|
lua_pushstring(L, &tmpout.item[0]);
|
||||||
|
lua_setfield(L, -2, "output");
|
||||||
if (lua_pcall(L, 2, 0, 0))
|
if (lua_pcall(L, 2, 0, 0))
|
||||||
script_error(L, "error: %s", lua_tostring(L, -1));
|
script_error(L, "error: %s", lua_tostring(L, -1));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user