straightforward signal and slots system for lua events

This commit is contained in:
Eduardo Bart
2011-08-29 16:35:58 -03:00
parent f41fd0576c
commit f05c048f6d
5 changed files with 42 additions and 13 deletions

View File

@@ -419,21 +419,32 @@ int LuaInterface::protectedCall(int numArgs, int requestedResults)
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-i)-2);
pushValue(-numArgs-2);
int rets = safeCall(numArgs);
pop(rets);
}
// just ignore
else {
pop();
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(requestedResults == -1 || requestedResults == 1) {
numRets = 1;
pushBoolean(done);
}
}
// nil values are ignored
else if(isNil(funcIndex)) {

View File

@@ -62,13 +62,15 @@ void Game::processConnectionError(const boost::system::error_code& error)
{
// connection errors only have meaning if we still have a protocol
if(m_protocolGame) {
g_lua.callGlobalField("Game", "onConnectionError", error.message());
if(error != asio::error::eof)
g_lua.callGlobalField("Game", "onConnectionError", error.message());
if(m_online)
if(m_online) {
processLogout();
// disconnect isn't needed, we are already disconnected
m_protocolGame.reset();
} else {
m_protocolGame->disconnect();
m_protocolGame.reset();
}
}
}