// Call the given string directly, used in the lua debug command. int call_lua(std::string tocall) { lua_State *L = lua_state; update_globals(L); int err = luaL_dostring(L, tocall.c_str()); lua_report_error(L, err, tocall.c_str()); return err; }
// Call the given string directly, used in the lua debug command. int call_lua(std::string tocall) { lua_State* L = lua_state; update_globals(L); int err = luaL_dostring(L, tocall.c_str()); if(err) { // Error handling. const char* error = lua_tostring(L, -1); debugmsg("Error in lua command: %s", error); } return err; }
// If we're not using lua, need to define Use_function in a way to always call the C++ function int use_function::call(player* player_instance, item* item_instance, bool active) { if(function_type == USE_FUNCTION_CPP) { // If it's a C++ function, simply call it with the given arguments. iuse tmp; return (tmp.*cpp_function)(player_instance, item_instance, active); } else { #ifdef LUA // We'll be using lua_state a lot! lua_State* L = lua_state; // If it's a lua function, the arguments have to be wrapped in // lua userdata's and passed on the lua stack. // We will now call the function f(player, item, active) update_globals(L); // Push the lua function on top of the stack lua_rawgeti(L, LUA_REGISTRYINDEX, lua_function); // Push the item on top of the stack. int item_in_registry; { item** item_userdata = (item**) lua_newuserdata(L, sizeof(item*)); *item_userdata = item_instance; // Save a reference to the item in the registry so that we can deallocate it // when we're done. item_in_registry = luah_store_in_registry(L, -1); // Set the metatable for the item. luah_setmetatable(L, "item_metatable"); } // Push the "active" parameter on top of the stack. lua_pushboolean(L, active); // Call the iuse function int err = lua_pcall(L, 3, 1, 0); if(err) { // Error handling. const char* error = lua_tostring(L, -1); debugmsg("Error in lua iuse function: %s", error); } // Make sure the now outdated parameters we passed to lua aren't // being used anymore by setting a metatable that will error on // access. luah_remove_from_registry(L, item_in_registry); luah_setmetatable(L, "outdated_metatable"); return lua_tointeger(L, -1); #else // If LUA isn't defined and for some reason we registered a lua function, // simply do nothing. return 0; #endif } }
// If we're not using lua, need to define Use_function in a way to always call the C++ function int use_function::call(player *player_instance, item *item_instance, bool active, point pos) const { if (function_type == USE_FUNCTION_NONE) { if (player_instance != NULL && player_instance->is_player()) { add_msg(_("You can't do anything interesting with your %s."), item_instance->tname().c_str()); } } else if (function_type == USE_FUNCTION_CPP) { // If it's a C++ function, simply call it with the given arguments. iuse tmp; return (tmp.*cpp_function)(player_instance, item_instance, active, pos); } else if (function_type == USE_FUNCTION_ACTOR_PTR) { return actor_ptr->use(player_instance, item_instance, active, pos); } else { #ifdef LUA // We'll be using lua_state a lot! lua_State *L = lua_state; // If it's a lua function, the arguments have to be wrapped in // lua userdata's and passed on the lua stack. // We will now call the function f(player, item, active) update_globals(L); // Push the lua function on top of the stack lua_rawgeti(L, LUA_REGISTRYINDEX, lua_function); // TODO: also pass the player object, because of NPCs and all // I guess // Push the item on top of the stack. int item_in_registry; { item **item_userdata = (item **) lua_newuserdata(L, sizeof(item *)); *item_userdata = item_instance; // Save a reference to the item in the registry so that we can deallocate it // when we're done. item_in_registry = luah_store_in_registry(L, -1); // Set the metatable for the item. luah_setmetatable(L, "item_metatable"); } // Push the "active" parameter on top of the stack. lua_pushboolean(L, active); // Call the iuse function int err = lua_pcall(L, 2, 1, 0); lua_report_error( L, err, "iuse function" ); // Make sure the now outdated parameters we passed to lua aren't // being used anymore by setting a metatable that will error on // access. luah_remove_from_registry(L, item_in_registry); luah_setmetatable(L, "outdated_metatable"); return lua_tointeger(L, -1); #else // If LUA isn't defined and for some reason we registered a lua function, // simply do nothing. return 0; #endif } return 0; }