bool CSquirrelArguments::pushFromStack(SQVM* pVM, int idx) { CSquirrelArgument * arg = new CSquirrelArgument(); if(arg->pushFromStack(pVM, idx)) { push_back(arg); return true; } delete arg; return false; }
void TriggerEvent( RakNet::BitStream * pBitStream, RakNet::Packet * pPacket ) { CSquirrelArguments * pArgs = new CSquirrelArguments( pBitStream ); CSquirrelArgument * pEventName = (pArgs->size() > 0 ? pArgs->front() : 0); // if( pEventName && pEventName->GetType() == OT_STRING ) { String strEventName = *pEventName->data.str; pArgs->pop_front(); pCore->GetClientScriptingManager()->GetEvents()->Call( strEventName, pArgs ); SAFE_DELETE( pEventName ); } SAFE_DELETE( pArgs ); }
// event guiKeyPress(string guiName, string key, string keyState) bool OnKeyPress(const CEGUI::KeyEventArgs &eArgs, String keyState) { CEvents * pEvents = g_pClient->GetEvents(); String eventName("guiKeyPress"); if(!pEvents->IsEventRegistered(eventName)) return false; CEGUI::Window * pWindow = eArgs.window; CSquirrel * pScript = g_pClient->GetClientScriptManager()->GetGUIManager()->GetScript(pWindow); CEGUI::Key::Scan keyCode = eArgs.scancode; CSquirrelArguments pArguments; pArguments.push(eArgs.window->getName().c_str()); pArguments.push(GetKeyNameByScan(eArgs.scancode)); pArguments.push(keyState); CSquirrelArgument pReturn = pEvents->Call(eventName, &pArguments, pScript); return pReturn.GetBool(); }
void CSquirrel::RegisterConstant(String strConstantName, CSquirrelArgument value) { // Push the constant name onto the stack sq_pushstring(m_pVM, strConstantName.Get(), -1); // Push the constant value onto the stack value.push(m_pVM); // Create a new slot sq_createslot(m_pVM, -3); }
// TODO: 'Call for this script only' argument // callEvent(eventname, defaultretval, ...) SQInteger CEventNatives::Call(SQVM * pVM) { CHECK_PARAMS_MIN("callEvent", 2); CHECK_TYPE("callEvent", 1, 2, OT_STRING); SQInteger iTop = sq_gettop(pVM); // Get the name const char * szEventName; sq_getstring(pVM, 2, &szEventName); // Grab all arguments CSquirrelArguments pArguments; for(SQInteger i = 3; i <= iTop; ++ i) pArguments.pushFromStack(pVM, i); // Call the event CSquirrelArgument pReturn = CEvents::GetInstance()->Call(szEventName, &pArguments); pReturn.push(pVM); return 1; }
// event windowClose(windowName) bool OnWindowClose(const CEGUI::EventArgs &eventArgs) { CEvents * pEvents = g_pClient->GetEvents(); String eventName("windowClose"); if(!pEvents->IsEventRegistered(eventName)) return false; CEGUI::Window * pWindow = static_cast<const CEGUI::WindowEventArgs&>(eventArgs).window; CSquirrel * pScript = g_pClient->GetClientScriptManager()->GetGUIManager()->GetScript(pWindow); CSquirrelArguments pArguments; pArguments.push(pWindow->getName().c_str()); // Event handler must return 1 to close window, otherwise, 0. CSquirrelArgument pReturn = pEvents->Call(eventName, &pArguments, pScript); if(pReturn.GetInteger()) pWindow->hide(); return true; }
void CServerRPCHandler::EventCall(CBitStream * pBitStream, CPlayerSocket * pSenderSocket) { // Ensure we have a valid bit stream if(!pBitStream) return; CSquirrelArguments* pArgs = new CSquirrelArguments(pBitStream); CSquirrelArgument* pEventName = pArgs->size() > 0 ? pArgs->front() : 0; if(pEventName && pEventName->GetType() == OT_STRING) { String strEventName = pEventName->data.str->C_String(); pArgs->pop_front(); pArgs->push_front(new CSquirrelArgument(pSenderSocket->playerId)); g_pEvents->Call(strEventName, pArgs); delete pEventName; } delete pArgs; }
SQInteger CSquirrel::PrintErrorFunction(SQVM * pVM) { if(sq_gettop(pVM) >= 1) { const SQChar * szError = NULL; sq_getstring(pVM, 2, &szError); ErrorInfo info; info.strError = szError; SQStackInfos si; SQInteger level = 1; // 1 is to skip this function that is level 0 const SQChar *name = 0; SQInteger seq = 0; while(SQ_SUCCEEDED(sq_stackinfos(pVM, level, &si))) { const SQChar * fn = _SC("unknown"); const SQChar * src = _SC("unknown"); if(si.funcname) fn = si.funcname; if(si.source) src = si.source; info.callstack.push_back(ErrorCallstackPair(fn, ErrorSourcePair(src, si.line))); level++; } for(level = 0; level < 10; level++) { seq = 0; while((name = sq_getlocal(pVM, level, seq))) { seq++; CSquirrelArgument arg; arg.pushFromStack(pVM, -1); info.locals.push_back(ErrorLocalPair(name, arg)); sq_pop(pVM, 1); } } CSquirrel * pScript = CScriptingManager::GetInstance()->Get(pVM); if(pScript) { CSquirrelArguments arguments; CSquirrelArguments tempArray; CSquirrelArguments callstackTable; CSquirrelArguments localsTable; arguments.push(info.strError); for(ErrorCallstackList::iterator iter = info.callstack.begin(); iter != info.callstack.end(); iter++) { String strFunction = iter->first; String strSource = iter->second.first; int iLine = iter->second.second; callstackTable.push(strFunction); tempArray.reset(); tempArray.push(strSource); tempArray.push(iLine); callstackTable.push(tempArray, true); } arguments.push(callstackTable, false); for(ErrorLocalsList::iterator iter = info.locals.begin(); iter != info.locals.end(); iter++) { String strName = iter->first; CSquirrelArgument arg = iter->second; localsTable.push(strName); localsTable.push(arg); } arguments.push(localsTable, false); if(CEvents::GetInstance()->Call("scriptError", &arguments, pScript).GetInteger() == 1) { CLogFile::Printf("<Error (%s)>", info.strError.Get()); CLogFile::Printf("<Callstack>"); for(ErrorCallstackList::iterator iter = info.callstack.begin(); iter != info.callstack.end(); iter++) { String strFunction = iter->first; String strSource = iter->second.first; int iLine = iter->second.second; CLogFile::Printf("<%s (%s, %d)>", strFunction.Get(), strSource.Get(), iLine); } CLogFile::Printf("</Callstack>"); CLogFile::Printf("<Locals>"); for(ErrorLocalsList::iterator iter = info.locals.begin(); iter != info.locals.end(); iter++) { String strName = iter->first; CSquirrelArgument arg = iter->second; CLogFile::Printf("<%s (%s)>", strName.Get(), arg.GetTypeString().Get()); } CLogFile::Printf("</Locals>"); CLogFile::Printf("</Error>"); } } } return 0; }