+bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
+ const InventoryList *old_craft_grid, const InventoryLocation &craft_inv)
+{
+ SCRIPTAPI_PRECHECKHEADER
+
+ int error_handler = PUSH_ERROR_HANDLER(L);
+
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "on_craft");
+ LuaItemStack::create(L, item);
+ objectrefGetOrCreate(L, user);
+
+ // Push inventory list
+ std::vector<ItemStack> items;
+ for (u32 i = 0; i < old_craft_grid->getSize(); i++) {
+ items.push_back(old_craft_grid->getItem(i));
+ }
+ push_items(L, items);
+
+ InvRef::create(L, craft_inv);
+ PCALL_RES(lua_pcall(L, 4, 1, error_handler));
+ if (!lua_isnil(L, -1)) {
+ try {
+ item = read_item(L, -1, getServer()->idef());
+ } catch (LuaError &e) {
+ throw LuaError(std::string(e.what()) + ". item=" + item.name);
+ }
+ }
+ lua_pop(L, 2); // Pop item and error handler
+ return true;
+}
+
+bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user,
+ const InventoryList *old_craft_grid, const InventoryLocation &craft_inv)
+{
+ SCRIPTAPI_PRECHECKHEADER
+ sanity_check(old_craft_grid);
+ int error_handler = PUSH_ERROR_HANDLER(L);
+
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "craft_predict");
+ LuaItemStack::create(L, item);
+ objectrefGetOrCreate(L, user);
+
+ //Push inventory list
+ std::vector<ItemStack> items;
+ for (u32 i = 0; i < old_craft_grid->getSize(); i++) {
+ items.push_back(old_craft_grid->getItem(i));
+ }
+ push_items(L, items);
+
+ InvRef::create(L, craft_inv);
+ PCALL_RES(lua_pcall(L, 4, 1, error_handler));
+ if (!lua_isnil(L, -1)) {
+ try {
+ item = read_item(L, -1, getServer()->idef());
+ } catch (LuaError &e) {
+ throw LuaError(std::string(e.what()) + ". item=" + item.name);
+ }
+ }
+ lua_pop(L, 2); // Pop item and error handler
+ return true;
+}
+
+// Retrieves core.registered_items[name][callbackname]