static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v) { SQPRINTFUNCTION pf = sq_getprintfunc(v); if(pf) { const SQChar *sErr = 0; if(sq_gettop(v)>=1) { if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) { pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr); } else{ pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n")); } sqstd_printcallstack(v); } } return 0; }
_MEMBER_FUNCTION_IMPL(xml, nodeFind) { CXML * pXML = sq_getinstance<CXML *>(pVM); if(!pXML) { CLogFile::Print("Failed to get the XML instance."); sq_pushbool(pVM, false); return 1; } const char * nodeName; sq_getstring(pVM, -1, &nodeName); sq_pushbool(pVM, pXML->findNode(nodeName)); return 1; }
SQInteger PrintRuntimeError(HSQUIRRELVM v) { SQPRINTFUNCTION pf = sq_geterrorfunc(v); if(pf) { const SQChar *sErr = 0; if(sq_gettop(v)>=1) { if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) { pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr); } else{ pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n")); } PrintCallStack(v); } } return 0; }
/* * returns database path with given name * * @param database name * @param database path */ SQInteger emoDatabaseGetPath(HSQUIRRELVM v) { const SQChar* name; SQInteger nargs = sq_gettop(v); if (nargs >= 2 && sq_gettype(v, 2) == OT_STRING) { sq_tostring(v, 2); sq_getstring(v, -1, &name); sq_poptop(v); } else { return 0; } std::string path = engine->database->getPath(name); const char* cpath = path.c_str(); sq_pushstring(v, cpath, -1); return 1; }
SQInteger getter_v4(HSQUIRRELVM v) { SQChar const * key; sq_getstring(v,2,(SQChar const**)&key); glm::vec4* obj; SQInteger error = 0; sq_getinstanceup(v,1,(SQUserPointer*)&obj, 0); if(!strcmp(key, "x")){ sq_pushfloat(v,obj->x); }else if(!strcmp(key, "y")){ sq_pushfloat(v,obj->y); }else if(!strcmp(key, "z")){ sq_pushfloat(v,obj->z); }else if(!strcmp(key, "w")){ sq_pushfloat(v,obj->w); }else{ return sq_throwerror(v, "invalid param"); } return 1; }
void CSquirrelVM::Pop(CString& str, CString strDefaultValue) { SQObjectType argType = sq_gettype(m_pVM, m_iStackIndex); if (argType == OT_STRING) { const char* c = NULL; sq_getstring(m_pVM, m_iStackIndex++, &c); str = c; return; } else { if(argType == OT_NULL) { str = strDefaultValue; } } str = ""; m_iStackIndex++; }
static int flash_device_name_get(HSQUIRRELVM v, int index, const wgChar **str) { sq_pushroottable(v); sq_pushstring(v, _SC("flash_device_name_get"), -1); if(SQ_SUCCEEDED(sq_get(v,-2))){ sq_pushroottable(v); sq_pushinteger(v, index); SQRESULT r = sq_call(v, 2, SQTrue, SQTrue); assert(r == SQ_OK); r++; } if(sq_gettype(v, -1) != OT_STRING){ return 0; } if(SQ_FAILED(sq_getstring(v, -1, str))){ return 0; } return 1; }
static SQInteger _mod_filesize(HSQUIRRELVM v) { const SQChar* fname; sq_getstring(v, 2, &fname); if(fname) { char fullname[512]; if(fname[0]=='/') sprintf(fullname,"%s",fname); else sprintf(fullname,"%s/%s",__pSQ->ctx()->_dir_home,fname); struct stat stt; if(stat(fullname, &stt)==0) { sq_pushinteger(v, stt.st_size); return stt.st_size; }else{ sq_pushinteger(v, 0); } } return 1; }
std::string read_string(HSQUIRRELVM vm, const char* name) { sq_pushstring(vm, name, -1); if(SQ_FAILED(sq_get(vm, -2))) { std::ostringstream msg; msg << "Couldn't get string value for '" << name << "' from table"; throw scripting::SquirrelError(vm, msg.str()); } const char* result; if(SQ_FAILED(sq_getstring(vm, -1, &result))) { std::ostringstream msg; msg << "Couldn't get string value for '" << name << "' from table"; throw scripting::SquirrelError(vm, msg.str()); } sq_pop(vm, 1); return std::string(result); }
/* * Runtime echo * * @param message * @return given message */ SQInteger emoRuntimeEcho(HSQUIRRELVM v) { const SQChar *str; SQInteger nargs = sq_gettop(v); for (SQInteger n = 1; n <= nargs; n++) { if (sq_gettype(v, n) == OT_STRING) { sq_tostring(v, n); sq_getstring(v, -1, &str); sq_poptop(v); } else { str = NULL; } } if (str != NULL) { sq_pushstring(v, str, -1); } return 1; }
int CEventNatives::Call(SQVM* pVM) { // we need enough parameters if(sq_gettop(pVM)<3) { sq_pushbool(pVM, false); return 1; } // get the event name const char* szEventName; if(SQ_FAILED(sq_getstring(pVM, 2, &szEventName))) { sq_pushbool(pVM, false); return 1; } // get the entity which it should effect CEntity* pEntity = sq_toentity(pVM, 3); // if we have a valid entity, use it if(pEntity) { // collect the parameters CSquirrelArguments* pArguments = new CSquirrelArguments(); for(int i = 4; i <= sq_gettop(pVM); ++ i) { // push all arguments from the stack if(!pArguments->pushFromStack(pVM, i)) { sq_pushbool(pVM, false); delete pArguments; return 1; } } sq_pushbool(pVM, pEntity->CallEvent(szEventName, pArguments)); delete pArguments; } else sq_pushbool(pVM, false); return 1; }
// Font _MEMBER_FUNCTION_IMPL(GUIFont, constructor) { if(sq_gettop(pVM) < 2) { sq_pushbool(pVM, false); return 1; } const char * szFont; int iSize = 8; bool bScaled = false; sq_getstring(pVM, 2, &szFont); if(sq_gettop(pVM) >= 3) { sq_getinteger(pVM, 3, &iSize); if(iSize < 3 || iSize > 100) { sq_pushbool(pVM, false); return 1; } if(sq_gettop(pVM) >= 4) { SQBool sqb; sq_getbool(pVM, 4, &sqb); bScaled = sqb != 0; } } CEGUI::Font * pFont = g_pClient->GetGUI()->GetFont(szFont, iSize, bScaled); if(!pFont || SQ_FAILED(sq_setinstance(pVM, pFont))) { CLogFile::Printf("Can't create GUIFont."); sq_pushbool(pVM, false); return 1; } sq_pushbool(pVM, true); return 1; }
/* * delete preference with given key * * @param preference key * @return EMO_NO_ERROR if succeeds */ SQInteger emoDatabaseDeletePreference(HSQUIRRELVM v) { const SQChar* key; SQInteger nargs = sq_gettop(v); if (nargs >= 2 && sq_gettype(v, 2) == OT_STRING) { sq_tostring(v, 2); sq_getstring(v, -1, &key); sq_poptop(v); } else { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } if (!engine->database->deletePreference(key)) { sq_pushinteger(v, ERR_DATABASE); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
SQInteger SFSpriteCreateText(HSQUIRRELVM v) { char *text; int fontnum; int text_r; int text_g; int text_b; int sprite; sq_getstring(Scripts.vm, 2, (const char **)&text); sq_getinteger(Scripts.vm, 3, &fontnum); sq_getinteger(Scripts.vm, 4, &text_r); sq_getinteger(Scripts.vm, 5, &text_g); sq_getinteger(Scripts.vm, 6, &text_b); sprite = SpritesCreateText(text, fontnum, text_r, text_g, text_b, WRAP_NOWRAP); sq_pushinteger(Scripts.vm, sprite); return 1; }
SQInteger setter_v3(HSQUIRRELVM v){ SQChar const * key; sq_getstring(v,2,(SQChar const**)&key); glm::vec3* obj; SQInteger error = 0; sq_getinstanceup(v,1,(SQUserPointer*)&obj,0); if(!strcmp(key, "x")){ float val;error = with_assert_sq_getfloat(v,3,val);if(error) return error; obj->x = val; }else if(!strcmp(key, "y")){ float val;error = with_assert_sq_getfloat(v,3,val);if(error) return error; obj->y = val; }else if(!strcmp(key, "z")){ float val;error = with_assert_sq_getfloat(v,3,val);if(error) return error; obj->z = val; }else{ return sq_throwerror(v, "invalid param"); } return 0; }
SQInteger sq_setTextForAll(SQVM * pVM) { SQInteger textId; const char * szText; sq_getstring(pVM, -1, &szText); sq_getinteger(pVM, -2, &textId); if(pNetowkManager->GetTextManager()->GetSlotState(textId)) { pNetowkManager->GetTextManager()->GetAt(textId)->SetText(szText); sq_pushbool(pVM, true); return 1; } sq_pushbool(pVM, false); return 1; }
/* * Shows Android toast message */ SQInteger emoRuntimeAndroidToast(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); const SQChar* text; if (nargs >= 2 && sq_gettype(v, 2) == OT_STRING) { sq_tostring(v, 2); sq_getstring(v, -1, &text); sq_poptop(v); } SQInteger duration = ANDROID_TOAST_SHORT; if (nargs <= 3 && sq_gettype(v, 3) == OT_INTEGER) { sq_getinteger(v, 3, &duration); } engine->javaGlue->callStringInt_Void("toast", text, duration); return 0; }
SQInteger SFSpriteChangeText(HSQUIRRELVM v) { int spriteNum; char *text; int fontNum; int textR; int textG; int textB; sq_getinteger(Scripts.vm, 2, &spriteNum); sq_getstring(Scripts.vm, 3, (const char **)&text); sq_getinteger(Scripts.vm, 4, &fontNum); sq_getinteger(Scripts.vm, 5, &textR); sq_getinteger(Scripts.vm, 6, &textG); sq_getinteger(Scripts.vm, 7, &textB); SpritesChangeText(spriteNum, text, fontNum, textR, textG, textB, WRAP_NOWRAP); return 0; }
_MEMBER_FUNCTION_IMPL(xml, constructor) { // Get the filename const char * szFileName; sq_getstring( pVM, -1, &szFileName ); // Do we have a valid filename? if( szFileName ) { // Generate the path string String strPath; #ifdef _CLIENT strPath = pCore->GetClientScriptingManager()->GetScriptingManager()->Get( pVM )->GetPath(); strPath = SharedUtility::GetFileNameForScriptFile( szFileName, strPath.Get(), pCore->GetHost().Get(), pCore->GetPort() ); #else strPath = pCore->GetScriptingManager()->Get( pVM )->GetPath(); strPath = SharedUtility::GetFileNameForScriptFile( szFileName, strPath.Get() ); #endif // Create the XML instance CXML * pXML = new CXML( strPath.Get() ); // Did the XML instance fail to create or set the squirrel instance? if( !pXML || SQ_FAILED( sq_setinstance( pVM, pXML ) ) ) { // Delete the xml instance if( pXML ) SAFE_DELETE( pXML ); // sq_pushbool( pVM, false ); return 1; } //_SET_RELEASE_HOOK(xml); sq_pushbool( pVM, true ); return 1; } sq_pushbool( pVM, false ); return 1; }
SQInteger SquirrelStd::require(HSQUIRRELVM vm) { SQInteger top = sq_gettop(vm); const SQChar *filename; SQChar *real_filename; sq_getstring(vm, 2, &filename); /* Get the script-name of the current file, so we can work relative from it */ SQStackInfos si; sq_stackinfos(vm, 1, &si); if (si.source == NULL) { DEBUG(misc, 0, "[squirrel] Couldn't detect the script-name of the 'require'-caller; this should never happen!"); return SQ_ERROR; } real_filename = scstrdup(si.source); /* Keep the dir, remove the rest */ SQChar *s = scstrrchr(real_filename, PATHSEPCHAR); if (s != NULL) { /* Keep the PATHSEPCHAR there, remove the rest */ s++; *s = '\0'; } /* And now we concat, so we are relative from the current script * First, we have to make sure we have enough space for the full path */ real_filename = ReallocT(real_filename, scstrlen(real_filename) + scstrlen(filename) + 1); scstrcat(real_filename, filename); /* Tars dislike opening files with '/' on Windows.. so convert it to '\\' ;) */ char *filen = strdup(SQ2OTTD(real_filename)); #if (PATHSEPCHAR != '/') for (char *n = filen; *n != '\0'; n++) if (*n == '/') *n = PATHSEPCHAR; #endif bool ret = Squirrel::LoadScript(vm, filen); /* Reset the top, so the stack stays correct */ sq_settop(vm, top); free(real_filename); free(filen); return ret ? 0 : SQ_ERROR; }
SQInteger CUtilNatives::PlayerIdFromName( SQVM * pVM ) { const SQChar * szName; sq_getstring( pVM, -1, &szName ); for ( EntityId i = 0; i < MAX_PLAYERS; i ++ ) { if ( pCore->GetPlayerManager()->IsActive ( i ) ) { if ( !strcmp ( szName, pCore->GetPlayerManager()->Get( i )->GetNick() ) ) { sq_pushinteger( pVM, pCore->GetPlayerManager()->Get( i )->GetId () ); return 1; } } } sq_pushinteger( pVM, INVALID_ENTITY_ID ); return 1; }
static SQInteger _mod_readfile(HSQUIRRELVM v) { const SQChar* fname; SQInteger bytes=0; sq_getstring(v, 2, &fname); sq_getinteger(v, 3, &bytes); FILE * pf = fopen(fname,"rb"); if(!pf) {return sq_throwerror(v,_SC("popen(null_pointer, 0 bytes) error"));} if(pf) { char* pc = new char[bytes+1]; if(pc) { bytes = fread(pc, 1, bytes, (FILE*)pf); if(bytes>0) { pc[bytes] = 0; sq_pushstring(v, pc, bytes); } delete[] pc; } } return 1; }
SQInteger Sq_GetInfo(HSQUIRRELVM v) { const SQChar *What; sq_getstring(v, 2, &What); if(!strcasecmp(What, "filename")) sq_pushstring(v, FilenameOnly(LevelFilename), -1); else if(!strcasecmp(What, "numlayers")) sq_pushinteger(v, NumLayers); else if(!strcasecmp(What, "width")) sq_pushinteger(v, LevelW); else if(!strcasecmp(What, "height")) sq_pushinteger(v, LevelH); else if(!strcasecmp(What, "cameraX")) sq_pushinteger(v, CameraX); else if(!strcasecmp(What, "cameraY")) sq_pushinteger(v, CameraY); else sq_pushnull(v); return 1; }
// getRule(name) SQInteger CServerNatives::GetRule(SQVM * pVM) { if(!g_pQuery) { // If <query> is disabled on server. sq_pushbool(pVM, false); return 1; } const char* rule; sq_getstring(pVM, -1, &rule); QueryRule * pRule = g_pQuery->GetRule(rule); if(pRule) sq_pushstring(pVM, pRule->strValue.Get(), -1); else sq_pushbool(pVM, false); return 1; }
// BOOL ViCbSetToolTip(VApiHandle hWnd, LPCTSTR pstrName) SQInteger ViCbSetToolTip(HSQUIRRELVM v) { SQInteger nargs = sq_gettop(v); SQInteger Handle = 0; CControlUI* pCtrl = NULL; LPCTSTR pstrName = NULL; if (!v || 2 + 1 != nargs) {goto _Exit_;} if (OT_INTEGER != sq_gettype(v, 2)) {goto _Exit_;} if (OT_STRING != sq_gettype(v, 3)) {goto _Exit_;} sq_getinteger(v, 2, &Handle); sq_getstring(v, 3, &pstrName); pCtrl = QiHwHandleToCtrl(Handle); if (!pCtrl) {goto _Exit_;} pCtrl->SetToolTip(pstrName); _Exit_: sq_pushbool(v, TRUE); return 1; }
int AnimSquirrel::getJobID(SQVM* v) { const char* tChar; int ID; int retVal = 0; SQInteger nargs = sq_gettop(v); if(nargs >= 3) { sq_getstring(v,3,&tChar); sq_getinteger(v,2,&ID); KeyframeAnimComponent* component = 0; GameEntity* entity = GameModules::gameWorld()->entity(ID); if( entity && ( component = static_cast<KeyframeAnimComponent*>(entity->component("KeyframeAnimComponent")) ) != 0 ) { retVal = component->getJobID(tChar); } } sq_pushinteger(v,retVal); return 1; }
_MEMBER_FUNCTION_IMPL(xml, commentNew) { CXML * pXML = sq_getinstance<CXML *>(pVM); if(!pXML) { CLogFile::Print("Failed to get the XML instance."); sq_pushbool(pVM, false); return 1; } const char * val; sq_getstring(pVM, -1, &val); pXML->newComment(val); sq_pushbool(pVM, true); return 1; }
/* * open database with given name * * @param database name * @return EMO_NO_ERROR if succeeds */ SQInteger emoDatabaseOpen(HSQUIRRELVM v) { const SQChar* name; SQInteger nargs = sq_gettop(v); if (nargs >= 2 && sq_gettype(v, 2) == OT_STRING) { sq_tostring(v, 2); sq_getstring(v, -1, &name); sq_poptop(v); } else { sq_pushinteger(v, ERR_INVALID_PARAM); return 1; } if (!engine->database->open(name)) { sq_pushinteger(v, ERR_DATABASE_OPEN); return 1; } sq_pushinteger(v, EMO_NO_ERROR); return 1; }
SQInteger SFSpriteCreateTextWrapped(HSQUIRRELVM v) { char *text; int fontnum; int textR; int textG; int textB; int wrapLength; int sprite; sq_getstring(Scripts.vm, 2, (const char **)&text); sq_getinteger(Scripts.vm, 3, &fontnum); sq_getinteger(Scripts.vm, 4, &textR); sq_getinteger(Scripts.vm, 5, &textG); sq_getinteger(Scripts.vm, 6, &textB); sq_getinteger(Scripts.vm, 7, &wrapLength); sprite = SpritesCreateText(text, fontnum, textR, textG, textB, wrapLength); sq_pushinteger(Scripts.vm, sprite); return 1; }
_MEMBER_FUNCTION_IMPL(xml, nodeSetContent) { CXML * pXML = sq_getinstance<CXML *>(pVM); if(!pXML) { CLogFile::Print("Failed to get the XML instance."); sq_pushbool(pVM, false); return 1; } const char * content; sq_getstring(pVM, -1, &content); pXML->nodeSetContent(content); sq_pushbool(pVM, true); return 1; }