static void StringFunction( int iFunc, LPCTSTR pszKey, CGString &sVal ) { GETNONWHITESPACE(pszKey); if ( *pszKey == '(' ) pszKey++; TCHAR * ppCmd[4]; int iCount = Str_ParseCmds( const_cast<TCHAR *>(pszKey), ppCmd, COUNTOF(ppCmd), ",)" ); if ( ! iCount ) { DEBUG_ERR(( "Bad string function usage. missing )\n" )); return; } TCHAR * psArg1 = ppCmd[0]; switch ( iFunc ) { case SSC_CHR: sVal.Format( "%c", Exp_GetSingle( ppCmd[0] ) ); return; case SSC_StrToLower: // strlower(str) = lower case the string sVal = ppCmd[0]; sVal.MakeLower(); return; case SSC_StrToUpper: // strupper(str) = upper case the string sVal = ppCmd[0]; sVal.MakeUpper(); return; } }
bool CContainer::r_GetRefContainer( LPCTSTR & pszKey, CScriptObj * & pRef ) { ADDTOCALLSTACK("CContainer::r_GetRefContainer"); if ( !strnicmp(pszKey, "FIND", 4) ) // find* { pszKey += 4; if ( !strnicmp(pszKey, "ID", 2) ) // findid { pszKey += 2; SKIP_SEPARATORS(pszKey); pRef = ContentFind(g_Cfg.ResourceGetID(RES_ITEMDEF, pszKey)); SKIP_SEPARATORS(pszKey); return true; } else if ( !strnicmp(pszKey, "CONT", 4) ) // findcont { pszKey += 4; SKIP_SEPARATORS(pszKey); pRef = GetAt(Exp_GetSingle(pszKey)); SKIP_SEPARATORS(pszKey); return true; } else if ( !strnicmp(pszKey, "TYPE", 4) ) // findtype { pszKey += 4; SKIP_SEPARATORS(pszKey); pRef = ContentFind(g_Cfg.ResourceGetID(RES_TYPEDEF, pszKey)); SKIP_SEPARATORS(pszKey); return true; } } return false; }
bool CClient::r_GetRef( LPCTSTR & pszKey, CScriptObj * & pRef ) { ADDTOCALLSTACK("CClient::r_GetRef"); int i = FindTableHeadSorted(pszKey, sm_szRefKeys, COUNTOF(sm_szRefKeys) - 1); if ( i >= 0 ) { pszKey += strlen(sm_szRefKeys[i]); SKIP_SEPARATORS(pszKey); switch ( i ) { case CLIR_ACCOUNT: if ( pszKey[-1] != '.' ) // only used as a ref ! break; pRef = m_pAccount; return true; case CLIR_GMPAGEP: pRef = m_pGMPage; return true; case CLIR_HOUSEDESIGN: pRef = m_pHouseDesign; return true; case CLIR_PARTY: if ( !m_pChar->m_pParty ) { LPCTSTR oldKey = pszKey; if ( !strnicmp(pszKey, "CREATE", 7) ) pszKey += 7; SKIP_SEPARATORS(pszKey); CChar *pChar = static_cast<CChar *>(static_cast<CGrayUID>(Exp_GetSingle(pszKey)).CharFind()); if ( !pChar ) return false; if ( !pChar->m_pClient ) return false; CPartyDef::AcceptEvent(pChar, m_pChar->GetUID(), true); if ( !m_pChar->m_pParty ) return false; pszKey = oldKey; // restoring back to real pszKey, so we don't get errors for giving an uid instead of PDV_CREATE } pRef = m_pChar->m_pParty; return true; case CLIR_TARG: pRef = m_Targ_UID.ObjFind(); return true; case CLIR_TARGPRV: pRef = m_Targ_PrvUID.ObjFind(); return true; case CLIR_TARGPROP: pRef = m_Prop_UID.ObjFind(); return true; } } return CScriptObj::r_GetRef(pszKey, pRef); }
void CScriptTriggerArgs::Init( LPCTSTR pszStr ) { m_pO1 = NULL; if ( !pszStr ) pszStr = ""; // raw is left untouched for now - it'll be split the 1st time argv is accessed m_s1_raw = pszStr; if ( *pszStr == '"' ) pszStr++; m_s1 = pszStr ; // take quote if present. char * str; if ( (str = strchr( m_s1.GetBuffer(), '"' )) ) *str = '\0'; m_iN1 = 0; m_iN2 = 0; m_iN3 = 0; // attempt to parse this. if ( isdigit(*pszStr) || ((*pszStr == '-') && isdigit(*(pszStr+1))) ) { m_iN1 = Exp_GetSingle(pszStr); SKIP_ARGSEP( pszStr ); if ( isdigit(*pszStr) || ((*pszStr == '-') && isdigit(*(pszStr+1))) ) { m_iN2 = Exp_GetSingle(pszStr); SKIP_ARGSEP( pszStr ); if ( isdigit(*pszStr) || ((*pszStr == '-') && isdigit(*(pszStr+1))) ) { m_iN3 = Exp_GetSingle(pszStr); } } } }
bool CDialogDef::r_Verb( CScript & s, CTextConsole * pSrc ) // some command on this object as a target { ADDTOCALLSTACK("CDialogDef::r_Verb"); EXC_TRY("Verb"); // The first part of the key is GUMPCTL_TYPE lpctstr pszKey = s.GetKey(); int index = FindTableSorted( pszKey, sm_szLoadKeys, CountOf(sm_szLoadKeys)-1 ); if ( index < 0 ) { CSString sVal; CScriptTriggerArgs Args(s.GetArgRaw()); if ( r_Call(s.GetKey(), pSrc, &Args, &sVal) ) return true; if (!m_pObj) return CResourceLink::r_Verb(s, pSrc); return m_pObj->r_Verb(s, pSrc); } lpctstr pszArgs = s.GetArgStr(); switch( index ) { case GUMPCTL_PAGE: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; GET_ABSOLUTE( page ); if ( page <= 0 ) return true; int iNewPage; if ( m_wPage == 0 || page > m_wPage || page == 0 ) iNewPage = page; else if ( page == m_wPage ) iNewPage = 1; else iNewPage = page + 1; m_sControls[m_uiControls].Format( "page %d", iNewPage ); ++m_uiControls; return true; } case GUMPCTL_BUTTON: // 7 = X,Y,Down gump,Up gump,pressable(1/0),page,id case GUMPCTL_BUTTONTILEART: // 11 = X,Y,Down gump,Up gump,pressable(1/0),page,id,tileart,hue,X,Y { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( down ); GET_ABSOLUTE( up ); GET_ABSOLUTE( press ); GET_ABSOLUTE( page ); GET_ABSOLUTE( id ); int iNewPage; if ( m_wPage == 0 || page > m_wPage || page == 0 ) iNewPage = page; else if ( page == m_wPage ) iNewPage = 1; else iNewPage = page + 1; if (index == GUMPCTL_BUTTON) m_sControls[m_uiControls].Format( "button %d %d %d %d %d %d %d", x, y, down, up, press, iNewPage, id ); else { GET_ABSOLUTE( tileId ); GET_ABSOLUTE( tileHue ); GET_ABSOLUTE( tileX ); GET_ABSOLUTE( tileY ); m_sControls[m_uiControls].Format( "buttontileart %d %d %d %d %d %d %d %d %d %d %d", x, y, down, up, press, iNewPage, id, tileId, tileHue, tileX, tileY ); } ++m_uiControls; return true; } case GUMPCTL_GUMPPIC: { GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( id ); SKIP_ALL( pszArgs ); m_sControls[m_uiControls].Format( "gumppic %d %d %d%s%s", x, y, id, *pszArgs ? " hue=" : "", *pszArgs ? pszArgs : "" ); ++m_uiControls; return true; } case GUMPCTL_GUMPPICTILED: { GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( sX ); GET_ABSOLUTE( sY ); GET_ABSOLUTE( id ); m_sControls[m_uiControls].Format( "gumppictiled %d %d %d %d %d", x, y, sX, sY, id ); ++m_uiControls; return true; } case GUMPCTL_RESIZEPIC: { GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( id ); GET_ABSOLUTE( sX ); GET_ABSOLUTE( sY ); m_sControls[m_uiControls].Format( "resizepic %d %d %d %d %d", x, y, id, sX, sY ); ++m_uiControls; return true; } case GUMPCTL_TILEPIC: case GUMPCTL_TILEPICHUE: { GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( id ); SKIP_ALL( pszArgs ); // TilePic don't use args, TilePicHue yes :) if ( index == GUMPCTL_TILEPIC ) m_sControls[m_uiControls].Format( "tilepic %d %d %d", x, y, id ); else m_sControls[m_uiControls].Format( "tilepichue %d %d %d%s%s", x, y, id, *pszArgs ? " " : "", *pszArgs ? pszArgs : "" ); ++m_uiControls; return true; } case GUMPCTL_DTEXT: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; if ( m_uiTexts >= (CountOf(m_sText) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( hue ); SKIP_ALL( pszArgs ) if ( *pszArgs == '.' ) pszArgs++; uint iText = GumpAddText( *pszArgs ? pszArgs : "" ); m_sControls[m_uiControls].Format( "text %d %d %d %u", x, y, hue, iText ); ++m_uiControls; return true; } case GUMPCTL_DCROPPEDTEXT: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; if ( m_uiTexts >= (CountOf(m_sText) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( w ); GET_ABSOLUTE( h ); GET_ABSOLUTE( hue ); SKIP_ALL( pszArgs ) if ( *pszArgs == '.' ) pszArgs++; uint iText = GumpAddText( *pszArgs ? pszArgs : "" ); m_sControls[m_uiControls].Format( "croppedtext %d %d %d %d %d %u", x, y, w, h, hue, iText ); ++m_uiControls; return true; } case GUMPCTL_DHTMLGUMP: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; if ( m_uiTexts >= (CountOf(m_sText) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( w ); GET_ABSOLUTE( h ); GET_ABSOLUTE( bck ); GET_ABSOLUTE( options ); SKIP_ALL( pszArgs ) uint iText = GumpAddText( *pszArgs ? pszArgs : "" ); m_sControls[m_uiControls].Format( "htmlgump %d %d %d %d %u %d %d", x, y, w, h, iText, bck, options ); ++m_uiControls; return true; } case GUMPCTL_DTEXTENTRY: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; if ( m_uiTexts >= (CountOf(m_sText) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( w ); GET_ABSOLUTE( h ); GET_ABSOLUTE( hue ); GET_ABSOLUTE( id ); SKIP_ALL( pszArgs ) uint iText = GumpAddText( *pszArgs ? pszArgs : "" ); m_sControls[m_uiControls].Format( "textentry %d %d %d %d %d %d %u", x, y, w, h, hue, id, iText ); ++m_uiControls; return true; } case GUMPCTL_DTEXTENTRYLIMITED: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; if ( m_uiTexts >= (CountOf(m_sText) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( w ); GET_ABSOLUTE( h ); GET_ABSOLUTE( hue ); GET_ABSOLUTE( id ); GET_ABSOLUTE( charLimit ); SKIP_ALL( pszArgs ) uint iText = GumpAddText( *pszArgs ? pszArgs : "" ); m_sControls[m_uiControls].Format( "textentrylimited %d %d %d %d %d %d %u %d", x, y, w, h, hue, id, iText, charLimit ); ++m_uiControls; return true; } case GUMPCTL_CHECKBOX: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( down ); GET_ABSOLUTE( up ); GET_ABSOLUTE( state ); GET_ABSOLUTE( id ); m_sControls[m_uiControls].Format( "checkbox %d %d %d %d %d %d", x, y, down, up, state, id ); ++m_uiControls; return true; } case GUMPCTL_RADIO: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( down ); GET_ABSOLUTE( up ); GET_ABSOLUTE( state ); GET_ABSOLUTE( id ); m_sControls[m_uiControls].Format( "radio %d %d %d %d %d %d", x, y, down, up, state, id ); ++m_uiControls; return true; } case GUMPCTL_CHECKERTRANS: { if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( width ); GET_ABSOLUTE( height ); m_sControls[m_uiControls].Format( "checkertrans %d %d %d %d", x, y, width, height ); ++m_uiControls; return true; } case GUMPCTL_DORIGIN: { // GET_RELATIVE( x, m_iOriginX ); // GET_RELATIVE( y, m_iOriginY ); // m_iOriginX = x; // m_iOriginY = y; SKIP_ALL( pszArgs ); if ( *pszArgs == '-' && (IsSpace( pszArgs[1] ) || !pszArgs[1]) ) pszArgs++; else if ( *pszArgs == '*' ) m_iOriginX += Exp_GetSingle( ++pszArgs ); else m_iOriginX = Exp_GetSingle( pszArgs ); SKIP_ALL( pszArgs ); if ( *pszArgs == '-' && (IsSpace( pszArgs[1] ) || !pszArgs[1]) ) pszArgs++; else if ( *pszArgs == '*' ) m_iOriginY += Exp_GetSingle( ++pszArgs ); else m_iOriginY = Exp_GetSingle( pszArgs ); return true; } case GUMPCTL_NODISPOSE: m_fNoDispose = true; break; case GUMPCTL_CROPPEDTEXT: case GUMPCTL_TEXT: case GUMPCTL_TEXTENTRY: case GUMPCTL_TEXTENTRYLIMITED: break; case GUMPCTL_XMFHTMLGUMP: // 7 = x,y,sx,sy, cliloc(1003000) hasBack canScroll case GUMPCTL_XMFHTMLGUMPCOLOR: // 7 + color. { GET_RELATIVE( x, m_iOriginX ); GET_RELATIVE( y, m_iOriginY ); GET_ABSOLUTE( sX ); GET_ABSOLUTE( sY ); GET_ABSOLUTE( cliloc ); GET_ABSOLUTE( hasBack ); GET_ABSOLUTE( canScroll ); //SKIP_ALL( pszArgs ) if ( index == GUMPCTL_XMFHTMLGUMP ) // xmfhtmlgump doesn't use color m_sControls[m_uiControls].Format( "xmfhtmlgump %d %d %d %d %d %d %d" , x, y, sX, sY, cliloc, hasBack, canScroll ); else m_sControls[m_uiControls].Format( "xmfhtmlgumpcolor %d %d %d %d %d %d %d%s%s", x, y, sX, sY, cliloc, hasBack, canScroll, *pszArgs ? " " : "", *pszArgs ? pszArgs : "" ); ++m_uiControls; return true; } case GUMPCTL_XMFHTMLTOK: // 9 = x y width height has_background has_scrollbar color cliloc_id @args { GET_RELATIVE(x, m_iOriginX); GET_RELATIVE(y, m_iOriginY); GET_ABSOLUTE(sX); GET_ABSOLUTE(sY); GET_ABSOLUTE(hasBack); GET_ABSOLUTE(canScroll); GET_ABSOLUTE(color); GET_ABSOLUTE(cliloc); SKIP_ALL(pszArgs); m_sControls[m_uiControls].Format("xmfhtmltok %d %d %d %d %d %d %d %d %s", x, y, sX, sY, hasBack, canScroll, color, cliloc, *pszArgs ? pszArgs : ""); ++m_uiControls; return true; } default: break; } if ( m_uiControls >= (CountOf(m_sControls) - 1) ) return false; m_sControls[m_uiControls].Format("%s %s", pszKey, pszArgs); ++m_uiControls; return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPTSRC; EXC_DEBUG_END; return false; }
bool CScriptTriggerArgs::r_WriteVal( LPCTSTR pszKey, CGString &sVal, CTextConsole * pSrc ) { EXC_TRY(("r_WriteVal('%s',,%x)", pszKey, pSrc)); if ( IsSetEF( EF_Intrinsic_Locals ) ) { CVarDefBase * pVar = m_VarsLocal.GetKey( pszKey ); if ( pVar ) { sVal = pVar->GetValStr(); return true; } } else if ( !strnicmp( "LOCAL.", pszKey, 6 ) ) { pszKey += 6; sVal = m_VarsLocal.GetKeyStr( pszKey, true ); return( true ); } if ( !strnicmp( pszKey, "ARGV", 4 )) { pszKey+=4; SKIP_SEPERATORS(pszKey); int iQty = m_v.GetCount(); if ( iQty == 0 ) { // PARSE IT HERE TCHAR * pszArg = m_s1_raw.GetBuffer(); TCHAR * s = pszArg; bool fQuotes = false; while ( *s ) { if ( isspace(*s ) ) { s++; continue; } if ( *s == '"' ) { s++; fQuotes = true; }; pszArg = s; // arg starts here s++; while (*s) { if ( *s == '"' ) { if ( fQuotes ) { *s = '\0'; fQuotes = false; break; } *s = '\0'; s++; fQuotes = true; // maintain break; } if ( !fQuotes && (*s == ',') ) { *s = '\0'; s++; break; } s++; } m_v.Add( pszArg ); } iQty = m_v.GetCount(); } if ( *pszKey == '\0' ) { sVal.FormatVal(iQty); return( true ); } int iNum = Exp_GetSingle( pszKey ); SKIP_SEPERATORS(pszKey); if ( !m_v.IsValidIndex(iNum) ) { sVal.Format( "" ); return true; } sVal.Format( m_v.GetAt(iNum) ); return( true ); } int index = FindTableSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 ); switch (index) { case AGC_N: case AGC_N1: sVal.FormatVal( m_iN1 ); break; case AGC_N2: sVal.FormatVal( m_iN2 ); break; case AGC_N3: sVal.FormatVal( m_iN3 ); break; case AGC_S: sVal = m_s1; break; default: return( CScriptObj::r_WriteVal( pszKey, sVal, pSrc )); } return true; EXC_CATCH("CScriptTriggerArgs"); return false; }
TRIGRET_TYPE CScriptObj::OnTriggerForLoop( CScript &s, int iType, CTextConsole * pSrc, CScriptTriggerArgs * pArgs, CGString * pResult ) { // loop from start here to the ENDFOR // See WebPageScriptList for dealing with Arrays. CScriptLineContext StartContext = s.GetContext(); CScriptLineContext EndContext = StartContext; int LoopsMade = 0; if ( iType & 8 ) // WHILE { TCHAR * pszCond; TCHAR *pszOrig = Str_GetTemp(); TCHAR *pszTemp = Str_GetTemp(); int iWhile = 0; strcpy( pszOrig, s.GetArgStr() ); while(true) { LoopsMade++; if ( g_Cfg.m_iMaxLoopTimes && ( LoopsMade >= g_Cfg.m_iMaxLoopTimes )) goto toomanyloops; pArgs->m_VarsLocal.SetNum( "_WHILE", iWhile, false ); iWhile++; strcpy( pszTemp, pszOrig ); pszCond = pszTemp; ParseText( pszCond, pSrc, 0, pArgs ); if ( !Exp_GetVal( pszCond ) ) break; TRIGRET_TYPE iRet = OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } EndContext = s.GetContext(); s.SeekContext( StartContext ); } } else ParseText( s.GetArgStr(), pSrc, 0, pArgs ); if ( iType & 4 ) // FOR { int fCountDown = FALSE; int iMin = 0; int iMax = 0; int i; TCHAR * ppArgs[3]; int iQty = Str_ParseCmds( s.GetArgStr(), ppArgs, 3, ", " ); CGString sLoopVar = "_FOR"; switch( iQty ) { case 1: // FOR x iMin = 1; iMax = Exp_GetSingle( ppArgs[0] ); break; case 2: if ( isdigit( *ppArgs[0] ) ) { iMin = Exp_GetSingle( ppArgs[0] ); iMax = Exp_GetSingle( ppArgs[1] ); } else { iMin = 1; iMax = Exp_GetSingle( ppArgs[1] ); sLoopVar = ppArgs[0]; } break; case 3: sLoopVar = ppArgs[0]; iMin = Exp_GetSingle( ppArgs[1] );; iMax = Exp_GetSingle( ppArgs[2] ); break; default: iMin = iMax = 1; break; } if ( iMin > iMax ) fCountDown = true; if ( fCountDown ) for ( i = iMin; i >= iMax; --i ) { LoopsMade++; if ( g_Cfg.m_iMaxLoopTimes && ( LoopsMade >= g_Cfg.m_iMaxLoopTimes )) goto toomanyloops; pArgs->m_VarsLocal.SetNum( sLoopVar, i, false ); TRIGRET_TYPE iRet = OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } EndContext = s.GetContext(); s.SeekContext( StartContext ); } else for ( i = iMin; i <= iMax; ++i ) { LoopsMade++; if ( g_Cfg.m_iMaxLoopTimes && ( LoopsMade >= g_Cfg.m_iMaxLoopTimes )) goto toomanyloops; pArgs->m_VarsLocal.SetNum( sLoopVar, i, false ); TRIGRET_TYPE iRet = OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } EndContext = s.GetContext(); s.SeekContext( StartContext ); } } if ( (iType & 1) || (iType & 2) ) { int iDist; if ( s.HasArgs() ) iDist = s.GetArgVal(); else iDist = UO_MAP_VIEW_SIZE; CObjBaseTemplate * pObj = dynamic_cast <CObjBaseTemplate *>(this); if ( pObj == NULL ) { iType = 0; DEBUG_ERR(( "FOR Loop trigger on non-world object '%s'\n", GetName())); } CObjBaseTemplate * pObjTop = pObj->GetTopLevelObj(); CPointMap pt = pObjTop->GetTopPoint(); if ( iType & 1 ) // FORITEM, FOROBJ { CWorldSearch AreaItems( pt, iDist ); while(true) { LoopsMade++; if ( g_Cfg.m_iMaxLoopTimes && ( LoopsMade >= g_Cfg.m_iMaxLoopTimes )) goto toomanyloops; CItem * pItem = AreaItems.GetItem(); if ( pItem == NULL ) break; TRIGRET_TYPE iRet = pItem->OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } EndContext = s.GetContext(); s.SeekContext( StartContext ); } } if ( iType & 2 ) // FORCHAR, FOROBJ { CWorldSearch AreaChars( pt, iDist ); while(true) { LoopsMade++; if ( g_Cfg.m_iMaxLoopTimes && ( LoopsMade >= g_Cfg.m_iMaxLoopTimes )) goto toomanyloops; CChar * pChar = AreaChars.GetChar(); if ( pChar == NULL ) break; if ( ( iType & 0x10 ) && ( ! pChar->IsClient() ) ) // FORCLIENTS continue; if ( ( iType & 0x20 ) && ( pChar->m_pPlayer == NULL ) ) // FORPLAYERS continue; TRIGRET_TYPE iRet = pChar->OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } EndContext = s.GetContext(); s.SeekContext( StartContext ); } } } if ( g_Cfg.m_iMaxLoopTimes ) { toomanyloops: if ( LoopsMade >= g_Cfg.m_iMaxLoopTimes ) { g_Log.EventError("Terminating loop cycle since it seems being dead-locked (%d iterations already passed)" DEBUG_CR, LoopsMade); } } if ( EndContext.m_lOffset <= StartContext.m_lOffset ) { // just skip to the end. TRIGRET_TYPE iRet = OnTriggerRun( s, TRIGRUN_SECTION_FALSE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } } else { s.SeekContext( EndContext ); } return( TRIGRET_ENDIF ); }