void callEntrypoint(const std::string &entrypoint, const Args &... args) { setCurrentWorldScript(); if (!callQuestEntrypoint(entrypoint, args...)) { safeCall(entrypoint, args...); } };
void LuaInterface::evaluateExpression(const std::string& expression, const std::string& source) { // evaluates the expression if(!expression.empty()) { std::string buffer = stdext::format("__exp = (%s)", expression); loadBuffer(buffer, source); safeCall(); // gets the expression result getGlobal("__exp"); // resets global __exp pushNil(); setGlobal("__exp"); } else pushNil(); }
void LuaInterface::loadFunction(const std::string& buffer, const std::string& source) { if(buffer.empty()) { pushNil(); return; } std::string buf; if(stdext::starts_with(buffer, "function")) buf = stdext::format("__func = %s", buffer); else buf = stdext::format("__func = function(self)\n%s\nend", buffer); loadBuffer(buf, source); safeCall(); // get the function getGlobal("__func"); // reset the global __func pushNil(); setGlobal("__func"); }
int LuaInterface::signalCall(int numArgs, int numRets) { int rets = 0; int funcIndex = -numArgs-1; try { // must be a function if(isFunction(funcIndex)) { rets = safeCall(numArgs); if(numRets != -1) { if(rets != numRets) throw LuaException("function call didn't return the expected number of results", 0); } } // can also calls table of functions else if(isTable(funcIndex)) { // loop through table values pushNil(); bool done = false; while(next(funcIndex-1)) { if(isFunction()) { // repush arguments for(int i=0;i<numArgs;++i) pushValue(-numArgs-2); int rets = safeCall(numArgs); if(rets == 1) { done = popBoolean(); if(done) { pop(); break; } } else if(rets != 0) throw LuaException("function call didn't return the expected number of results", 0); } else { throw LuaException("attempt to call a non function", 0); } } pop(numArgs + 1); // pops the table of function and arguments if(numRets == 1 || numRets == -1) { rets = 1; pushBoolean(done); } } // nil values are ignored else if(isNil(funcIndex)) { pop(numArgs + 1); // pops the function and arguments } // if not nil, warn else { throw LuaException("attempt to call a non function value", 0); } } catch(stdext::exception& e) { g_logger.error(stdext::format("protected lua call failed: %s", e.what())); } // pushes nil values if needed while(numRets != -1 && rets < numRets) { pushNil(); rets++; } // returns the number of results on the stack return rets; }
void LuaInterface::runBuffer(const std::string& buffer, const std::string& source) { loadBuffer(buffer, source); safeCall(0, 0); }
void LuaInterface::runScript(const std::string& fileName) { loadScript(fileName); safeCall(0, 0); }