DWORD CServerDef::StatGet(SERV_STAT_TYPE i) const { ADDTOCALLSTACK("CServerDef::StatGet"); ASSERT( i >= 0 && i <= SERV_STAT_QTY ); DWORD d = m_dwStat[i]; EXC_TRY("StatGet"); if ( i == SERV_STAT_MEM ) // memory information { d = 0; if ( m_bPmemory ) { #ifdef _WIN32 if ( !m_hmPsapiDll ) // try to load psapi.dll if not loaded yet { EXC_SET("load process info"); m_hmPsapiDll = LoadLibrary(TEXT("psapi.dll")); if (m_hmPsapiDll == NULL) { m_bPmemory = false; g_Log.EventError(("Unable to load process information PSAPI.DLL library. Memory information will be not available.\n")); } else { m_GetProcessMemoryInfo = reinterpret_cast<pGetProcessMemoryInfo>(::GetProcAddress(m_hmPsapiDll,"GetProcessMemoryInfo")); } } if ( m_GetProcessMemoryInfo ) { EXC_SET("open process"); HANDLE hProcess = GetCurrentProcess(); if ( hProcess ) { ASSERT( hProcess == (HANDLE)-1 ); EXC_SET("get memory info"); if ( m_GetProcessMemoryInfo(hProcess, &pcnt, sizeof(pcnt)) ) { EXC_SET("read memory info"); d = pcnt.WorkingSetSize; } CloseHandle(hProcess); } } #else struct rusage usage; int res = getrusage(RUSAGE_SELF, &usage); if ( res == 0 && usage.ru_idrss ) d = usage.ru_idrss; else { CFileText inf; TCHAR * buf = Str_GetTemp(), * head; sprintf(buf, "/proc/%d/status", getpid()); if ( inf.Open(buf, OF_READ|OF_TEXT) ) { for (;;) { if ( !inf.ReadString(buf, SCRIPT_MAX_LINE_LEN) ) break; if ( (head = strstr(buf, "VmSize:")) != NULL ) { head += 7; GETNONWHITESPACE(head) d = ATOI(head) * 1000; break; } } inf.Close(); } } if ( !d ) { g_Log.EventError(("Unable to load process information from getrusage() and procfs. Memory information will be not available.\n")); m_bPmemory = false; } #endif if ( d != 0 ) d /= 1024; } } return d; EXC_CATCH; EXC_DEBUG_START; g_Log.EventDebug("stat '%d', val '%lu'\n", i, d); EXC_DEBUG_END; return 0; }
size_t CGRect::Read( LPCTSTR pszVal ) { ADDTOCALLSTACK("CGRect::Read"); // parse reading the rectangle TCHAR *pszTemp = Str_GetTemp(); strcpy( pszTemp, pszVal ); TCHAR * ppVal[5]; size_t i = Str_ParseCmds( pszTemp, ppVal, COUNTOF( ppVal ), " ,\t"); switch (i) { case 5: m_map = ATOI(ppVal[4]); if (( m_map < 0 ) || ( m_map >= 256 ) || !g_MapList.m_maps[m_map] ) { g_Log.EventError("Unsupported map #%d specified. Auto-fixing that to 0.\n", m_map); m_map = 0; } m_bottom = ATOI(ppVal[3]); m_right = ATOI(ppVal[2]); m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 4: m_map = 0; m_bottom = ATOI(ppVal[3]); m_right = ATOI(ppVal[2]); m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 3: m_map = 0; m_bottom = 0; m_right = ATOI(ppVal[2]); m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 2: m_map = 0; m_bottom = 0; m_right = 0; m_top = ATOI(ppVal[1]); m_left = ATOI(ppVal[0]); break; case 1: m_map = 0; m_bottom = 0; m_right = 0; m_top = 0; m_left = ATOI(ppVal[0]); break; } NormalizeRect(); return( i ); }
void CSocketAddress::SetPortStr( LPCTSTR pszPort ) { m_port = static_cast<WORD>(ATOI(pszPort)); }
bool CRegionBase::MakeRegionName() { ADDTOCALLSTACK("CRegionBase::MakeRegionName"); if ( m_pDefName ) return true; TCHAR ch; LPCTSTR pszKey = NULL; // auxiliary, the key of a similar CVarDef, if any found TCHAR * pbuf = Str_GetTemp(); TCHAR * pszDef = pbuf + 2; strcpy(pbuf, "a_"); LPCTSTR pszName = GetName(); GETNONWHITESPACE( pszName ); if ( !strnicmp( "the ", pszName, 4 ) ) pszName += 4; else if ( !strnicmp( "a ", pszName, 2 ) ) pszName += 2; else if ( !strnicmp( "an ", pszName, 3 ) ) pszName += 3; else if ( !strnicmp( "ye ", pszName, 3 ) ) pszName += 3; for ( ; *pszName; pszName++ ) { if ( !strnicmp( " of ", pszName, 4 ) || !strnicmp( " in ", pszName, 4 ) ) { pszName += 4; continue; } if ( !strnicmp( " the ", pszName, 5 ) ) { pszName += 5; continue; } ch = *pszName; if ( ch == ' ' || ch == '\t' || ch == '-' ) ch = '_'; else if ( !isalnum( ch ) ) continue; // collapse multiple spaces together if ( ch == '_' && *(pszDef-1) == '_' ) continue; *pszDef = static_cast<TCHAR>(tolower(ch)); pszDef++; } *pszDef = '_'; *(++pszDef) = '\0'; size_t iMax = g_Cfg.m_RegionDefs.GetCount(); int iVar = 1; size_t iLen = strlen( pbuf ); for ( size_t i = 0; i < iMax; i++ ) { CRegionBase * pRegion = dynamic_cast <CRegionBase*> (g_Cfg.m_RegionDefs.GetAt(i)); if ( !pRegion ) continue; pszKey = pRegion->GetResourceName(); if ( !pszKey ) continue; // Is this a similar key? if ( strnicmp( pbuf, pszKey, iLen ) != 0 ) continue; // skip underscores pszKey = pszKey + iLen; while ( *pszKey == '_' ) pszKey++; // Is this is subsequent key with a number? Get the highest (plus one) if ( IsStrNumericDec( pszKey ) ) { int iVarThis = ATOI( pszKey ); if ( iVarThis >= iVar ) iVar = iVarThis + 1; } else iVar++; } // Only one, no need for the extra "_" sprintf( pszDef, "%i", iVar ); SetResourceName( pbuf ); // Assign name return true; }
int execute(char *p, bool isdown) // all evaluation happens here, recursively { const int MAXWORDS = 25; // limit, remove char *w[MAXWORDS]; int val = 0; for(bool cont = true; cont;) // for each ; seperated statement { int numargs = MAXWORDS; loopi(MAXWORDS) // collect all argument values { w[i] = (char*) ""; if(i>numargs) continue; char *s = parseword(p); // parse and evaluate exps if(!s) { numargs = i; s = (char*) ""; }; if(*s=='$') s = lookup(s); // substitute variables w[i] = s; }; p += strcspn(p, ";\n\0"); cont = *p++!=0; // more statements if this isn't the end of the string const char *c = w[0]; if(*c=='/') c++; // strip irc-style command prefix if(!*c) continue; // empty statement ident *id = idents->access(c); if(!id) { val = ATOI(c); if(!val && *c!='0') console::out("unknown command: %s", c); } else switch(id->type) { case ID_COMMAND: // game defined commands switch(id->narg) // use very ad-hoc function signature, and just call it { case ARG_1INT: if(isdown) ((void (__cdecl *)(int))id->fun)(ATOI(w[1])); break; case ARG_2INT: if(isdown) ((void (__cdecl *)(int, int))id->fun)(ATOI(w[1]), ATOI(w[2])); break; case ARG_3INT: if(isdown) ((void (__cdecl *)(int, int, int))id->fun)(ATOI(w[1]), ATOI(w[2]), ATOI(w[3])); break; case ARG_4INT: if(isdown) ((void (__cdecl *)(int, int, int, int))id->fun)(ATOI(w[1]), ATOI(w[2]), ATOI(w[3]), ATOI(w[4])); break; case ARG_NONE: if(isdown) ((void (__cdecl *)())id->fun)(); break; case ARG_1STR: if(isdown) ((void (__cdecl *)(char *))id->fun)(w[1]); break; case ARG_2STR: if(isdown) ((void (__cdecl *)(char *, char *))id->fun)(w[1], w[2]); break; case ARG_3STR: if(isdown) ((void (__cdecl *)(char *, char *, char*))id->fun)(w[1], w[2], w[3]); break; case ARG_5STR: if(isdown) ((void (__cdecl *)(char *, char *, char*, char*, char*))id->fun)(w[1], w[2], w[3], w[4], w[5]); break; case ARG_DOWN: ((void (__cdecl *)(bool))id->fun)(isdown); break; case ARG_DWN1: ((void (__cdecl *)(bool, char *))id->fun)(isdown, w[1]); break; case ARG_1EXP: if(isdown) val = ((int (__cdecl *)(int))id->fun)(execute(w[1])); break; case ARG_2EXP: if(isdown) val = ((int (__cdecl *)(int, int))id->fun)(execute(w[1]), execute(w[2])); break; case ARG_1EST: if(isdown) val = ((int (__cdecl *)(char *))id->fun)(w[1]); break; case ARG_2EST: if(isdown) val = ((int (__cdecl *)(char *, char *))id->fun)(w[1], w[2]); break; case ARG_VARI: if(isdown) { string r; // limit, remove r[0] = 0; for(int i = 1; i<numargs; i++) { strcat_s(r, w[i]); // make string-list out of all arguments if(i==numargs-1) break; strcat_s(r, " "); }; ((void (__cdecl *)(char *))id->fun)(r); break; } }; break; case ID_VAR: // game defined variabled if(isdown) { if(!w[1][0]) console::out("%s = %d", c, *id->storage); // var with no value just prints its current value else { if(id->min>id->max) { console::out("variable is read-only"); } else { int i1 = ATOI(w[1]); if(i1<id->min || i1>id->max) { i1 = i1<id->min ? id->min : id->max; // clamp to valid range console::out("valid range for %s is %d..%d", c, id->min, id->max); } *id->storage = i1; }; if(id->fun) ((void (__cdecl *)())id->fun)(); // call trigger function if available }; }; break; case ID_ALIAS: // alias, also used as functions and (global) variables for(int i = 1; i<numargs; i++) { sprintf_sd(t)("arg%d", i); // set any arguments as (global) arg values so functions can access them alias(t, w[i]); }; char *action = newstring(id->action); // create new string here because alias could rebind itself val = execute(action, isdown); gp()->deallocstr(action); break; }; loopj(numargs) gp()->deallocstr(w[j]); }; return val; };
const CoinPresolveAction *OsiPresolve::presolve(CoinPresolveMatrix *prob) { paction_ = 0; prob->status_=0; // say feasible # if PRESOLVE_DEBUG const CoinPresolveAction *pactiond = 0 ; presolve_check_sol(prob) ; # endif if ((presolveActions_&4)!=0) transferCosts(prob); /* Fix variables before we get into the main transform loop. */ paction_ = make_fixed(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif // if integers then switch off dual stuff // later just do individually bool doDualStuff = true; if ((presolveActions_&1)==0) { int i; int ncol = presolvedModel_->getNumCols(); for (i=0;i<ncol;i++) if (presolvedModel_->isInteger(i)) doDualStuff=false; } # if CHECK_CONSISTENCY presolve_links_ok(prob->rlink_, prob->mrstrt_, prob->hinrow_, prob->nrows_); # endif /* If we're feasible, set up for the main presolve transform loop. */ if (!prob->status_) { # if 0 /* This block is used during debugging. See ATOI to see how it works. Some editing will be required to turn it all on. */ bool slackd = ATOI("SLACKD")!=0; //bool forcing = ATOI("FORCING")!=0; bool doubleton = ATOI("DOUBLETON")!=0; bool forcing = ATOI("off")!=0; bool ifree = ATOI("off")!=0; bool zerocost = ATOI("off")!=0; bool dupcol = ATOI("off")!=0; bool duprow = ATOI("off")!=0; bool dual = ATOI("off")!=0; # else # if 1 // normal operation --- all transforms enabled bool slackSingleton = true; bool slackd = true; bool doubleton = true; bool tripleton = true; //#define NO_FORCING #ifndef NO_FORCING bool forcing = true; #endif bool ifree = true; bool zerocost = true; bool dupcol = true; bool duprow = true; bool dual = doDualStuff; # else // compile time selection of transforms. bool slackd = false; bool doubleton = true; bool tripleton = true; bool forcing = true; bool ifree = false; bool zerocost = false; bool dupcol = false; bool duprow = false; bool dual = false; # endif # endif // Switch off some stuff if would annoy set partitioning etc if ((presolveActions_&2)!=0) { doubleton = false; tripleton = false; ifree = false; } // stop x+y+z==1 if ((presolveActions_&8)!=0) prob->setPresolveOptions(prob->presolveOptions()|4); // switch on stuff which can't be unrolled easily if ((presolveActions_&16)!=0) prob->setPresolveOptions(prob->presolveOptions()|16); // switch on gub stuff if ((presolveActions_&32)!=0) prob->setPresolveOptions(prob->presolveOptions()|32); /* The main loop (just below) starts with a minor loop that does inexpensive presolve transforms until convergence. At each iteration of this loop, next[Rows,Cols]ToDo is copied over to [rows,cols]ToDo. Then there's a block like the one here, which sets [rows,cols]ToDo for all rows & cols, followed by executions of a set of expensive transforms. Then we come back around for another iteration of the main loop. [rows,cols]ToDo is not reset as we come back around, so we dive into the inexpensive loop set up to process all. */ int i; // say look at all if (!prob->anyProhibited()) { for (i=0;i<nrows_;i++) prob->rowsToDo_[i]=i; prob->numberRowsToDo_=nrows_; for (i=0;i<ncols_;i++) prob->colsToDo_[i]=i; prob->numberColsToDo_=ncols_; } else { // some stuff must be left alone prob->numberRowsToDo_=0; for (i=0;i<nrows_;i++) if (!prob->rowProhibited(i)) prob->rowsToDo_[prob->numberRowsToDo_++]=i; prob->numberColsToDo_=0; for (i=0;i<ncols_;i++) if (!prob->colProhibited(i)) prob->colsToDo_[prob->numberColsToDo_++]=i; } int iLoop; if (dupcol) { // maybe allow integer columns to be checked if ((presolveActions_&1)!=0) prob->setPresolveOptions(prob->presolveOptions()|1); possibleSkip; paction_ = dupcol_action::presolve(prob, paction_); } if (duprow) { possibleSkip; paction_ = duprow_action::presolve(prob, paction_); } // Check number rows dropped int lastDropped=0; /* Note that pass_ is incremented in testRedundant, evoked from implied_free_action. The bulk of testRedundant is executed every other pass. */ prob->pass_=0; for (iLoop=0;iLoop<numberPasses_;iLoop++) { # ifdef PRESOLVE_SUMMARY printf("Starting major pass %d\n",iLoop+1); # endif const CoinPresolveAction * const paction0 = paction_; // look for substitutions with no fill //#define IMPLIED 3 #ifdef IMPLIED int fill_level=3; #define IMPLIED2 1 #if IMPLIED!=3 #if IMPLIED>0&&IMPLIED<11 fill_level=IMPLIED; printf("** fill_level == %d !\n",fill_level); #endif #if IMPLIED>11&&IMPLIED<21 fill_level=-(IMPLIED-10); printf("** fill_level == %d !\n",fill_level); #endif #endif #else int fill_level=2; #endif int whichPass=0; /* Apply inexpensive transforms until convergence. */ while (1) { whichPass++; prob->pass_++; const CoinPresolveAction * const paction1 = paction_; if (slackd) { bool notFinished = true; while (notFinished) { possibleBreak; paction_ = slack_doubleton_action::presolve(prob, paction_, notFinished); } if (prob->status_) break; # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } if (dual&&whichPass==1) { possibleBreak; // this can also make E rows so do one bit here paction_ = remove_dual_action::presolve(prob, paction_); if (prob->status_) break; } if (doubleton) { possibleBreak; paction_ = doubleton_action::presolve(prob, paction_); if (prob->status_) break; # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } if (tripleton) { possibleBreak; paction_ = tripleton_action::presolve(prob, paction_); if (prob->status_) break; # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } if (zerocost) { possibleBreak; paction_ = do_tighten_action::presolve(prob, paction_); if (prob->status_) break; # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } #ifndef NO_FORCING if (forcing) { possibleBreak; paction_ = forcing_constraint_action::presolve(prob, paction_); if (prob->status_) break; # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } #endif if (ifree&&(whichPass%5)==1) { possibleBreak; paction_ = implied_free_action::presolve(prob, paction_,fill_level); if (prob->status_) break; # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } # if CHECK_CONSISTENCY presolve_links_ok(prob->rlink_,prob->mrstrt_, prob->hinrow_,prob->nrows_) ; # endif # if 0 && PRESOLVE_DEBUG /* For reasons that escape me just now, the linker is unable to find this function. Copying the code from CoinPresolvePsdebug to the head of this routine works just fine. Library loading order looks ok. Other routines from CoinPresolvePsdebug are found. I'm stumped. -- lh -- */ presolve_no_zeros(prob->mcstrt_, prob->colels_, prob->hincol_, prob->ncols_); # endif # if CHECK_CONSISTENCY prob->consistent(); # endif // set up for next pass // later do faster if many changes i.e. memset and memcpy prob->numberRowsToDo_ = prob->numberNextRowsToDo_; int kcheck; // debug? bool found=false; kcheck=-1; for (i=0;i<prob->numberNextRowsToDo_;i++) { int index = prob->nextRowsToDo_[i]; prob->unsetRowChanged(index); prob->rowsToDo_[i] = index; if (index==kcheck) { printf("row %d on list after pass %d\n",kcheck, whichPass); found=true; } } if (!found&&kcheck>=0) prob->rowsToDo_[prob->numberRowsToDo_++]=kcheck; prob->numberNextRowsToDo_=0; prob->numberColsToDo_ = prob->numberNextColsToDo_; kcheck=-1; found=false; for (i=0;i<prob->numberNextColsToDo_;i++) { int index = prob->nextColsToDo_[i]; prob->unsetColChanged(index); prob->colsToDo_[i] = index; if (index==kcheck) { printf("col %d on list after pass %d\n",kcheck, whichPass); found=true; } } if (!found&&kcheck>=0) prob->colsToDo_[prob->numberColsToDo_++]=kcheck; prob->numberNextColsToDo_=0; if (paction_ == paction1&&fill_level>0) break; } // End of inexpensive transform loop // say look at all int i; if (!prob->anyProhibited()) { for (i=0;i<nrows_;i++) prob->rowsToDo_[i]=i; prob->numberRowsToDo_=nrows_; for (i=0;i<ncols_;i++) prob->colsToDo_[i]=i; prob->numberColsToDo_=ncols_; } else { // some stuff must be left alone prob->numberRowsToDo_=0; for (i=0;i<nrows_;i++) if (!prob->rowProhibited(i)) prob->rowsToDo_[prob->numberRowsToDo_++]=i; prob->numberColsToDo_=0; for (i=0;i<ncols_;i++) if (!prob->colProhibited(i)) prob->colsToDo_[prob->numberColsToDo_++]=i; } // now expensive things // this caused world.mps to run into numerical difficulties # ifdef PRESOLVE_SUMMARY printf("Starting expensive\n"); # endif if (dual) { int itry; for (itry=0;itry<5;itry++) { const CoinPresolveAction * const paction2 = paction_; possibleBreak; paction_ = remove_dual_action::presolve(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif if (prob->status_) break; if (ifree) { #ifdef IMPLIED #if IMPLIED2 ==0 int fill_level=0; // switches off substitution #elif IMPLIED2!=99 int fill_level=IMPLIED2; #endif #endif if ((itry&1)==0) { possibleBreak; paction_ = implied_free_action::presolve(prob, paction_,fill_level); } # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif if (prob->status_) break; } if (paction_ == paction2) break; } } else if (ifree) { // just free #ifdef IMPLIED #if IMPLIED2 ==0 int fill_level=0; // switches off substitution #elif IMPLIED2!=99 int fill_level=IMPLIED2; #endif #endif possibleBreak; paction_ = implied_free_action::presolve(prob, paction_,fill_level); if (prob->status_) break; } if (dupcol) { // maybe allow integer columns to be checked if ((presolveActions_&1)!=0) prob->setPresolveOptions(prob->presolveOptions()|1); possibleBreak; paction_ = dupcol_action::presolve(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif if (prob->status_) break; } if (duprow) { possibleBreak; paction_ = duprow_action::presolve(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif if (prob->status_) break; } if ((presolveActions_&32)!=0) { possibleBreak; paction_ = gubrow_action::presolve(prob, paction_); } bool stopLoop=false; { int * hinrow = prob->hinrow_; int numberDropped=0; for (i=0;i<nrows_;i++) if (!hinrow[i]) numberDropped++; //printf("%d rows dropped after pass %d\n",numberDropped, // iLoop+1); if (numberDropped==lastDropped) stopLoop=true; else lastDropped = numberDropped; } // Do this here as not very loopy if (slackSingleton) { // On most passes do not touch costed slacks if (paction_ != paction0&&!stopLoop) { possibleBreak; paction_ = slack_singleton_action::presolve(prob, paction_,NULL); } else { // do costed if Clp (at end as ruins rest of presolve) possibleBreak; paction_ = slack_singleton_action::presolve(prob, paction_,NULL); stopLoop=true; } } #if PRESOLVE_DEBUG presolve_check_sol(prob,1); #endif if (paction_ == paction0||stopLoop) break; } // End of major pass loop } /* Final cleanup: drop zero coefficients from the matrix, then drop empty rows and columns. */ if (!prob->status_) { paction_ = drop_zero_coefficients(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif paction_ = drop_empty_cols_action::presolve(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif paction_ = drop_empty_rows_action::presolve(prob, paction_); # if PRESOLVE_DEBUG check_and_tell(prob,paction_,pactiond) ; # endif } // Messages CoinMessages messages = CoinMessage(prob->messages().language()); if (prob->status_) { if (prob->status_==1) prob->messageHandler()->message(COIN_PRESOLVE_INFEAS, messages) <<prob->feasibilityTolerance_ <<CoinMessageEol; else if (prob->status_==2) prob->messageHandler()->message(COIN_PRESOLVE_UNBOUND, messages) <<CoinMessageEol; else prob->messageHandler()->message(COIN_PRESOLVE_INFEASUNBOUND, messages) <<CoinMessageEol; // get rid of data gutsOfDestroy(); } return (paction_); }
bool CMapList::Load(int map, char *args) { if (( map < 0 ) || ( map > 255 )) { g_Log.EventError("Invalid map #%d couldn't be initialized.\n", map); return false; } else if ( !m_mapsinitalized[map] ) // disable double intialization { TCHAR * ppCmd[5]; // maxx,maxy,sectorsize,mapnum[like 0 for map0/statics0/staidx0],mapid size_t iCount = Str_ParseCmds(args, ppCmd, COUNTOF(ppCmd), ","); if ( iCount <= 0 ) // simple MAPX= same as disabling the map { m_maps[map] = false; } else { int maxx = 0, maxy = 0, sectorsize = 0, realmapnum = 0, mapid = -1; if ( ppCmd[0] ) maxx = ATOI(ppCmd[0]); if ( ppCmd[1] ) maxy = ATOI(ppCmd[1]); if ( ppCmd[2] ) sectorsize = ATOI(ppCmd[2]); if ( ppCmd[3] ) realmapnum = ATOI(ppCmd[3]); if ( ppCmd[4] ) mapid = ATOI(ppCmd[4]); // zero settings of anything except the real map num means if ( maxx ) // skipping the argument { if (( maxx < 8 ) || ( maxx % 8 )) { g_Log.EventError("MAP%d: X coord must be multiple of 8 (%d is invalid, %d is still effective).\n", map, maxx, m_sizex[map]); } else m_sizex[map] = maxx; } if ( maxy ) { if (( maxy < 8 ) || ( maxy % 8 )) { g_Log.EventError("MAP%d: Y coord must be multiple of 8 (%d is invalid, %d is still effective).\n", map, maxy, m_sizey[map]); } else m_sizey[map] = maxy; } if ( sectorsize > 0 ) { if (( sectorsize < 8 ) || ( sectorsize % 8 )) { g_Log.EventError("MAP%d: Sector size must be multiple of 8 (%d is invalid, %d is still effective).\n", map, sectorsize, m_sectorsize[map]); } else if (( m_sizex[map]%sectorsize ) || ( m_sizey[map]%sectorsize )) { g_Log.EventError("MAP%d: Map dimensions [%d,%d] must be multiple of sector size (%d is invalid, %d is still effective).\n", map, m_sizex[map], m_sizey[map], sectorsize, m_sectorsize[map]); } else m_sectorsize[map] = sectorsize; } if ( realmapnum >= 0 ) m_mapnum[map] = realmapnum; if ( mapid >= 0 ) m_mapid[map] = mapid; else m_mapid[map] = map; } m_mapsinitalized[map] = true; } return true; }
bool CChar::NPC_OnHearPetCmdTarg( int iCmd, CChar * pSrc, CObjBase * pObj, const CPointMap & pt, LPCTSTR pszArgs ) { ADDTOCALLSTACK("CChar::NPC_OnHearPetCmdTarg"); // Pet commands that required a target. if ( iCmd == PC_FOLLOW || iCmd == PC_STAY || iCmd == PC_STOP ) { // Pet friends can use only these commands if ( ! NPC_IsOwnedBy( pSrc ) && Memory_FindObjTypes( pSrc, MEMORY_FRIEND ) == NULL ) return false; } else { // All others commands are avaible only to pet owner if ( ! NPC_IsOwnedBy( pSrc, true ) ) return false; } if ( m_fIgnoreNextPetCmd == true ) { m_fIgnoreNextPetCmd = false; return(false); } bool fSuccess = false; // No they won't do it. // Could be NULL CItem * pItemTarg = dynamic_cast<CItem*>(pObj); CChar * pCharTarg = dynamic_cast<CChar*>(pObj); switch ( iCmd ) { case PC_GO: // Go to the location x,y if ( ! pt.IsValidPoint()) break; m_Act_p = pt; fSuccess = Skill_Start( NPCACT_GOTO ); break; case PC_GUARD: if ( pObj == NULL ) break; m_Act_Targ = pObj->GetUID(); fSuccess = Skill_Start( NPCACT_GUARD_TARG ); break; case PC_TRANSFER: // transfer ownership via the transfer command. if ( pCharTarg == NULL ) break; if ( pCharTarg->IsClient() ) { if ( IsSetOF(OF_PetSlots) ) { if ( !pCharTarg->FollowersUpdate(this, static_cast<short>(maximum(1, GetDefNum("FOLLOWERSLOTS", true, true))), true) ) { pSrc->SysMessageDefault( DEFMSG_PETSLOTS_TRY_TRANSFER ); break; } } fSuccess = NPC_PetSetOwner( pCharTarg ); } break; case PC_KILL: case PC_ATTACK: // Attack the target. if ( pCharTarg == NULL ) break; // refuse to attack friends. if ( NPC_IsOwnedBy( pCharTarg, true )) { fSuccess = false; // take no commands break; } fSuccess = pCharTarg->OnAttackedBy( pSrc, 1, true ); // we know who told them to do this. if ( fSuccess ) { fSuccess = Fight_Attack( pCharTarg, true ); } break; case PC_FOLLOW: if ( pCharTarg == NULL ) break; m_Act_Targ = pCharTarg->GetUID(); fSuccess = Skill_Start( NPCACT_FOLLOW_TARG ); break; case PC_FRIEND: // Not the same as owner, if ( pCharTarg == NULL ) break; Memory_AddObjTypes( pCharTarg, MEMORY_FRIEND ); break; case PC_PRICE: // "PRICE" the vendor item. if ( pItemTarg == NULL ) break; if ( ! NPC_IsVendor()) break; // did they name a price if ( IsDigit( pszArgs[0] )) { return NPC_SetVendorPrice( pItemTarg, ATOI(pszArgs) ); } // test if it is pricable. if ( ! NPC_SetVendorPrice( pItemTarg, -1 )) { return false; } // Now set it's price. if ( ! pSrc->IsClient()) break; pSrc->m_pClient->addPromptConsole( CLIMODE_PROMPT_VENDOR_PRICE, g_Cfg.GetDefaultMsg( DEFMSG_NPC_VENDOR_SETPRICE_2 ), pItemTarg->GetUID(), GetUID() ); return( true ); default: break; } // Make the yes/no noise. NPC_OnPetCommand( fSuccess, pSrc ); return fSuccess; }
void main(){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); setup_timer_1(T1_DISABLED); setup_oscillator (OSC_8MHZ); setup_adc_ports(NO_ANALOGS|VSS_VDD); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Software workaround for the power switch floating /* onewire_init(); onewire_sendbyte(0xCC); onewire_sendbyte(0x6C); //Write Data Command onewire_sendbyte(0x31); //Eeprom address but actually gets written to Shadow Ram onewire_sendbyte(0xE7); //Value to make PMOD1 SWEN=0 RNAOP=0 //Copy the shadow Ram written above over to actual EEPROM onewire_init(); onewire_sendbyte(0xCC); onewire_sendbyte(0x48); //send the copy command onewire_sendbyte(0x30); //copy shadow ram to the block containing 31 */ for (i=1;i<5;i++){ output_high(pin_A4); delay_ms(250); output_low(pin_A4); delay_ms(250); } while(true){ //Use the following to determine the state of the one wire net //Will report if device present, not, or shorted //Comment out rest of code //onewire_init_with_error_check(); //read_status(); //printf("status byte is ====>(%x)\n\r",status); //printf("Please enter a command (h for help):\n\r"); //Waits for a command to come in over the serial port //printf("Enter Command\n\r"); //Base commands are: //N = Print out the net address of one attached sensor //K = Return the current in micro volts //C = Return the chip temperature in celsius //F = Return the chip temperature in fahrenheit if (interactive == 1) printf("Enter Command:\n\r"); gets(command); //Check to see if controller is present if (command[0] == 'p'){ printf("Pyro Logger found and responding...\n\r"); printf("Firmware Version 1\n\r"); printf("N - Get Net address\n\r"); printf("Kaddress - Thermo uV's\n\r"); printf("Caddress - Temp in C\n\r"); printf("Faddress - Temp in F\n\r"); printf("i - toggle interactive\n\r"); interactive = 1; } if (command[0] == 'i'){ interactive = 0; } //Print out the Net address for configuring other software if (command[0] == 'N'){ printf("Reading Net Address...\r\n"); read_netaddress(); } //**************************************************** //READ Current from Sensor //**************************************************** if (command[0] == 'K'){ //Initialize the Temporary Buffer and make sure you have the null char tmp_buff[0]='0'; tmp_buff[1]='X'; tmp_buff[2]='0'; tmp_buff[3]='0'; tmp_buff[4]='\n'; i=0; for(j=1; j<=15; j+=2) { tmp_buff[2]=command[j]; tmp_buff[3]=command[j+1]; address_array[i]=ATOI(tmp_buff); i++; } onewire_init(); onewire_sendbyte(0x55); //Transmit skip Rom Command //Unique 64 Bit address for(j=0; j<=7; j++) { onewire_sendbyte(address_array[j]); } onewire_sendbyte(0x69); //0x69 Transmit Read RAM command onewire_sendbyte(0x0E); //Transmit Read start address data_MSB=onewire_readbyte(); data_LSB=onewire_readbyte(); //printf("MSB ====>(%x)\n\r",data_MSB); //printf("LSB ====>(%x)\n\r",data_LSB); current=make16(data_MSB,data_LSB); current=current >> 3; current_float=(current*.000015625); printf("%4.7f\r\n",current_float); blink(); } //*********************************************************** //Read Temperature of the on Chip Sensor //*********************************************************** //DS2760 can measure 0.125 deg C per bit //Whole number temperature values can be had by simpling taking the high byte //Or if high and low bytes are used shift right 5 places and multiply by .125 in a float if (command[0] == 'C' || command[0] == 'F'){ //Initialize the Temporary Buffer and make sure you have the null char tmp_buff[0]='0'; tmp_buff[1]='X'; tmp_buff[2]='0'; tmp_buff[3]='0'; tmp_buff[4]='\n'; //Pull the address out of the command 8 bytes of HEX //Changes it from a string to array stuffed in address_array i=0; for(j=1; j<=15; j+=2) { tmp_buff[2]=command[j]; tmp_buff[3]=command[j+1]; address_array[i]=ATOI(tmp_buff); i++; } //Send the addresss down the One Wire Buss onewire_init(); onewire_sendbyte(0x55); //Match Net Address Command for(j=0;j<=7;j++){ onewire_sendbyte(address_array[j]); } //Read Data onewire_sendbyte(0x69); //0x69 Transmit Read RAM command onewire_sendbyte(0x18); //Transmit Read start address data_MSB=onewire_readbyte(); data_LSB=onewire_readbyte(); temp=make16(data_MSB,data_LSB); //Check for a negative temperature for cold junction. Really cold junction //can only be positive or zero. Cold junction reference should never fall below zero //so if its below zero make it zero, about the best we could do aside throwing up errors //To force temperature negative for testing uncomment below //temp = temp + 32768; //The Check if (bit_test(temp,15) == 1) temp = 0; /* //Bit Shift Math For Whole Number Only temp=temp>>8; temp_float = temp; */ //Shift the data 5 bits to the right temp=temp >> 5; //Math for celsius temp_float=(temp *.125); //Math for fahrenheit temp_float_faren=((temp_float * 1.8) + 32); //Print out either celsius or fahrenheit //Over the serial Port if (command[0] == 'C' ) printf("%3.2f\r\n",temp_float); if (command[0] == 'F' ) printf("%3.2f\r\n",temp_float_faren); //Flash the leds to show there is communication blink(); }
bool CItemStone::r_WriteVal( LPCTSTR pszKey, CGString & sVal, CTextConsole * pSrc ) { ADDTOCALLSTACK("CItemStone::r_WriteVal"); EXC_TRY("WriteVal"); CChar * pCharSrc = pSrc->GetChar(); if ( !strnicmp("member.",pszKey,7) ) { LPCTSTR pszCmd = pszKey + 7; if ( !strnicmp("COUNT",pszCmd,5) ) { pszCmd = pszCmd + 5; int i = 0; CStoneMember * pMember = STATIC_CAST <CStoneMember *>(GetHead()); if ( *pszCmd ) { SKIP_ARGSEP(pszCmd); STONEPRIV_TYPE iPriv = static_cast<STONEPRIV_TYPE>(Exp_GetVal(pszCmd)); for (; pMember != NULL; pMember = pMember->GetNext()) { if ( !pMember->GetLinkUID().IsChar() ) continue; if ( pMember->GetPriv() != iPriv ) continue; i++; } } else { for (; pMember != NULL; pMember = pMember->GetNext()) { if (!pMember->GetLinkUID().IsChar()) continue; i++; } } sVal.FormatVal(i); return true; } int nNumber = Exp_GetVal(pszCmd); SKIP_SEPARATORS(pszCmd); CStoneMember * pMember = STATIC_CAST <CStoneMember *>(GetHead()); sVal.FormatVal(0); for ( int i = 0 ; pMember != NULL; pMember = pMember->GetNext() ) { if (!pMember->GetLinkUID().IsChar()) continue; if ( nNumber == i ) { if (!pszCmd[0]) return true; return pMember->r_WriteVal(pszCmd, sVal, pSrc); } i++; } return true; } else if ( !strnicmp("memberfromuid.", pszKey, 14) ) { LPCTSTR pszCmd = pszKey + 14; sVal.FormatVal(0); if ( !pszCmd[0] ) return true; CGrayUID pMemberUid = static_cast<DWORD>(Exp_GetVal(pszCmd)); SKIP_SEPARATORS(pszCmd); CChar * pMemberChar = pMemberUid.CharFind(); if ( pMemberChar ) { CStoneMember * pMemberGuild = GetMember( pMemberChar ); if ( pMemberGuild ) { return pMemberGuild->r_WriteVal(pszCmd, sVal, pSrc); } } return true; } else if ( !strnicmp("guild.",pszKey,6) ) { LPCTSTR pszCmd = pszKey + 6; if ( !strnicmp("COUNT",pszCmd,5) ) { pszCmd = pszCmd + 5; int i = 0; CStoneMember * pMember = STATIC_CAST <CStoneMember *>(GetHead()); if ( *pszCmd ) { SKIP_ARGSEP(pszCmd); int iToCheck = Exp_GetVal(pszCmd); for (; pMember != NULL; pMember = pMember->GetNext()) { if ( pMember->GetLinkUID().IsChar() ) continue; if ( ( iToCheck == 1 ) && ( pMember->GetWeDeclared() && !pMember->GetTheyDeclared() ) ) i++; else if ( ( iToCheck == 2 ) && ( !pMember->GetWeDeclared() && pMember->GetTheyDeclared() ) ) i++; else if ( ( iToCheck == 3 ) && ( pMember->GetWeDeclared() && pMember->GetTheyDeclared() ) ) i++; } } else { for (; pMember != NULL; pMember = pMember->GetNext()) { if (pMember->GetLinkUID().IsChar()) continue; i++; } } sVal.FormatVal(i); return true; } int nNumber = Exp_GetVal(pszCmd); SKIP_SEPARATORS(pszCmd); CStoneMember * pMember = STATIC_CAST <CStoneMember *>(GetHead()); sVal.FormatVal(0); for ( int i = 0 ; pMember != NULL; pMember = pMember->GetNext() ) { if (pMember->GetLinkUID().IsChar()) continue; if ( nNumber == i ) { if (!pszCmd[0]) return true; return pMember->r_WriteVal(pszCmd, sVal, pSrc); } i++; } return true; } else if ( !strnicmp("guildfromuid.", pszKey, 13) ) { LPCTSTR pszCmd = pszKey + 13; sVal.FormatVal(0); if ( !pszCmd[0] ) return true; CGrayUID pGuildUid = static_cast<DWORD>(Exp_GetVal(pszCmd)); SKIP_SEPARATORS(pszCmd); CItem * pMemberGuild = pGuildUid.ItemFind(); if ( pMemberGuild ) { CStoneMember * pGuild = GetMember( pMemberGuild ); if ( pGuild ) { return pGuild->r_WriteVal(pszCmd, sVal, pSrc); } } return true; } else if ( !strnicmp(sm_szLoadKeys[STC_CHARTER], pszKey, 7) ) { LPCTSTR pszCmd = pszKey + 7; unsigned int i = ATOI(pszCmd); if ( i >= COUNTOF(m_sCharter)) sVal = ""; else sVal = m_sCharter[i]; return( true ); } STC_TYPE iIndex = (STC_TYPE) FindTableSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 ); switch ( iIndex ) { case STC_ABBREV: // "ABBREV" sVal = m_sAbbrev; return true; case STC_ALIGN: sVal.FormatVal( GetAlignType()); return true; case STC_WEBPAGE: // "WEBPAGE" sVal = GetWebPageURL(); return true; case STC_AbbreviationToggle: { CStoneMember * pMember = GetMember(pCharSrc); CVarDefCont * pResult = NULL; if ( pMember == NULL ) { pResult = g_Exp.m_VarDefs.GetKey("STONECONFIG_VARIOUSNAME_NONMEMBER"); } else { pResult = pMember->IsAbbrevOn() ? g_Exp.m_VarDefs.GetKey("STONECONFIG_VARIOUSNAME_ABBREVON") : g_Exp.m_VarDefs.GetKey("STONECONFIG_VARIOUSNAME_ABBREVOFF"); } sVal = pResult ? pResult->GetValStr() : ""; } return true; case STC_AlignType: sVal = GetAlignName(); return true; case STC_LoyalTo: { CStoneMember * pMember = GetMember(pCharSrc); CVarDefCont * pResult = NULL; if ( pMember == NULL ) { pResult = g_Exp.m_VarDefs.GetKey("STONECONFIG_VARIOUSNAME_NONMEMBER"); } else { CChar * pLoyalTo = pMember->GetLoyalToUID().CharFind(); if ((pLoyalTo == NULL) || (pLoyalTo == pCharSrc )) { pResult = g_Exp.m_VarDefs.GetKey("STONECONFIG_VARIOUSNAME_YOURSELF"); } else { sVal = pLoyalTo->GetName(); return true; } } sVal = pResult ? pResult->GetValStr() : ""; } return( true ); case STC_Master: { CChar * pMaster = GetMaster(); sVal = (pMaster) ? pMaster->GetName() : g_Exp.m_VarDefs.GetKeyStr("STONECONFIG_VARIOUSNAME_PENDVOTE"); } return( true ); case STC_MasterGenderTitle: { CChar * pMaster = GetMaster(); if ( pMaster == NULL ) sVal = ""; // If no master (vote pending) else if ( pMaster->Char_GetDef()->IsFemale()) sVal = g_Exp.m_VarDefs.GetKeyStr("STONECONFIG_VARIOUSNAME_MASTERGENDERFEMALE"); else sVal = g_Exp.m_VarDefs.GetKeyStr("STONECONFIG_VARIOUSNAME_MASTERGENDERMALE"); } return( true ); case STC_MasterTitle: { CStoneMember * pMember = GetMasterMember(); sVal = (pMember) ? pMember->GetTitle() : ""; } return( true ); case STC_MasterUid: { CChar * pMaster = GetMaster(); if ( pMaster ) sVal.FormatHex( (DWORD) pMaster->GetUID() ); else sVal.FormatHex( (DWORD) 0 ); } return( true ); default: return( CItem::r_WriteVal( pszKey, sVal, pSrc )); } EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
bool CClient::r_Verb(CScript &s, CTextConsole *pSrc) // Execute command from script { ADDTOCALLSTACK("CClient::r_Verb"); EXC_TRY("Verb"); // NOTE: This can be called directly from a RES_WEBPAGE script. // So do not assume we are a game client ! // NOTE: Mostly called from CChar::r_Verb // NOTE: Little security here so watch out for dangerous scripts ! ASSERT(pSrc); LPCTSTR pszKey = s.GetKey(); // Old ver if ( s.IsKeyHead("SET", 3) && !g_Cfg.m_Functions.ContainsKey(pszKey) ) { PLEVEL_TYPE ilevel = g_Cfg.GetPrivCommandLevel("SET"); if ( ilevel > GetPrivLevel() ) return false; ASSERT(m_pChar); addTargetVerb(pszKey + 3, s.GetArgRaw()); return true; } if ( (toupper(pszKey[0]) == 'X') && !g_Cfg.m_Functions.ContainsKey(pszKey) ) { PLEVEL_TYPE ilevel = g_Cfg.GetPrivCommandLevel("SET"); if ( ilevel > GetPrivLevel() ) return false; // Target this command verb on some other object. ASSERT(m_pChar); addTargetVerb(pszKey + 1, s.GetArgRaw()); return true; } int index = FindTableSorted(s.GetKey(), sm_szVerbKeys, COUNTOF(sm_szVerbKeys) - 1); switch ( index ) { case CV_ADD: { if ( s.HasArgs() ) { TCHAR *ppArgs[2]; size_t iArgQty = Str_ParseCmds(s.GetArgStr(), ppArgs, COUNTOF(ppArgs)); if ( !IsValidGameObjDef(static_cast<LPCTSTR>(ppArgs[0])) ) { g_Log.EventWarn("Invalid ADD argument '%s'\n", ppArgs[0]); SysMessageDefault(DEFMSG_CMD_INVALID); return true; } RESOURCE_ID rid = g_Cfg.ResourceGetID(RES_QTY, const_cast<LPCTSTR &>(ppArgs[0])); m_tmAdd.m_id = rid.GetResIndex(); m_tmAdd.m_amount = (iArgQty > 1) ? static_cast<WORD>(maximum(ATOI(ppArgs[1]), 1)) : 1; if ( (rid.GetResType() == RES_CHARDEF) || (rid.GetResType() == RES_SPAWN) ) { m_Targ_PrvUID.InitUID(); return addTargetChars(CLIMODE_TARG_ADDCHAR, static_cast<CREID_TYPE>(m_tmAdd.m_id), false); } else return addTargetItems(CLIMODE_TARG_ADDITEM, static_cast<ITEMID_TYPE>(m_tmAdd.m_id)); break; } if ( IsValidDef("d_add") ) Dialog_Setup(CLIMODE_DIALOG, g_Cfg.ResourceGetIDType(RES_DIALOG, "d_add"), 0, m_pChar); else Menu_Setup(g_Cfg.ResourceGetIDType(RES_MENU, "MENU_ADDITEM")); break; } case CV_ADDBUFF: { TCHAR *ppArgs[11]; Str_ParseCmds(s.GetArgStr(), ppArgs, COUNTOF(ppArgs)); int iArgs[4]; for ( int i = 0; i < 4; ++i ) { if ( !IsStrNumeric(ppArgs[i]) ) { DEBUG_ERR(("Invalid AddBuff argument number %u\n", i + 1)); return true; } iArgs[i] = Exp_GetVal(ppArgs[i]); } if ( (iArgs[0] < 0) || (iArgs[0] > USHRT_MAX) ) { DEBUG_ERR(("Invalid AddBuff icon ID\n")); break; } LPCTSTR pszArgs[7]; size_t iArgQty = 0; for ( int i = 0; i < 7; ++i ) { pszArgs[i] = ppArgs[i + 4]; if ( pszArgs[i] != NULL ) ++iArgQty; } addBuff(static_cast<BUFF_ICONS>(iArgs[0]), static_cast<DWORD>(iArgs[1]), static_cast<DWORD>(iArgs[2]), static_cast<WORD>(iArgs[3]), pszArgs, iArgQty); break; } case CV_REMOVEBUFF: { BUFF_ICONS IconId = static_cast<BUFF_ICONS>(s.GetArgVal()); if ( (IconId < 0) || (IconId > USHRT_MAX) ) { DEBUG_ERR(("Invalid RemoveBuff icon ID\n")); break; } removeBuff(IconId); break; } case CV_ADDCLILOC: { // Add cliloc in @ClientTooltip trigger TCHAR *ppArgs[256]; size_t iArgQty = Str_ParseCmds(s.GetArgRaw(), ppArgs, COUNTOF(ppArgs), ","); DWORD dwClilocId = static_cast<DWORD>(Exp_GetLLVal(ppArgs[0])); CGString sVal; for ( size_t i = 1; i < iArgQty; ++i ) { if ( sVal.GetLength() ) sVal += "\t"; sVal += !strcmp(ppArgs[i], "NULL") ? " " : ppArgs[i]; } if ( g_Cfg.m_wDebugFlags & DEBUGF_SCRIPTS ) g_Log.EventDebug("SCRIPT: addcliloc(%lu,'%s')\n", dwClilocId, static_cast<LPCTSTR>(sVal)); m_TooltipData.Add(new CClientTooltip(dwClilocId, sVal)); break; } case CV_ADDCONTEXTENTRY: { TCHAR *ppArgs[20]; if ( Str_ParseCmds(s.GetArgRaw(), ppArgs, COUNTOF(ppArgs), ",") > 4 ) { DEBUG_ERR(("Bad AddContextEntry usage: Function takes maximum of 4 arguments!\n")); return true; } if ( !m_pPopupPacket ) { DEBUG_ERR(("Bad AddContextEntry usage: Not used under a @ContextMenuRequest/@itemContextMenuRequest trigger!\n")); return true; } for ( int i = 0; i < 4; ++i ) { if ( (i > 1) && IsStrEmpty(ppArgs[i]) ) continue; if ( !IsStrNumeric(ppArgs[i]) ) { DEBUG_ERR(("Bad AddContextEntry usage: Argument %d must be a number!\n", i + 1)); return true; } } int iTextEntry = Exp_GetVal(ppArgs[0]); if ( iTextEntry < 100 ) { DEBUG_ERR(("Bad AddContextEntry usage: TextEntry < 100 is reserved for server usage!\n")); return true; } m_pPopupPacket->addOption(static_cast<WORD>(iTextEntry), static_cast<DWORD>(Exp_GetLLVal(ppArgs[1])), static_cast<WORD>(Exp_GetLLVal(ppArgs[2])), static_cast<WORD>(Exp_GetLLVal(ppArgs[3]))); break; } case CV_ARROWQUEST: { INT64 piVal[3]; Str_ParseCmds(s.GetArgRaw(), piVal, COUNTOF(piVal)); addArrowQuest(static_cast<WORD>(piVal[0]), static_cast<WORD>(piVal[1]), static_cast<DWORD>(piVal[2])); break; } case CV_BADSPAWN: { // Loop the world searching for bad spawns bool fFound = false; CItem *pItem = NULL; CSector *pSector = NULL; CResourceDef *pSpawnDef = NULL; for ( int m = 0; (m < 256) && !fFound; ++m ) { if ( !g_MapList.m_maps[m] ) continue; for ( int s = 0; (s < g_MapList.GetSectorQty(m)) && !fFound; ++s ) { pSector = g_World.GetSector(m, s); if ( !pSector ) continue; for ( pItem = static_cast<CItem *>(pSector->m_Items_Timer.GetHead()); (pItem != NULL) && !fFound; pItem = pItem->GetNext() ) { if ( pItem->IsType(IT_SPAWN_ITEM) || pItem->IsType(IT_SPAWN_CHAR) ) { pSpawnDef = static_cast<CItemSpawn *>(pItem)->FixDef(); if ( !pSpawnDef ) { RESOURCE_ID_BASE rid = pItem->IsType(IT_SPAWN_ITEM) ? pItem->m_itSpawnItem.m_ItemID : pItem->m_itSpawnChar.m_CharID; CPointMap pt = pItem->GetTopPoint(); m_pChar->Spell_Teleport(pt, true, false); m_pChar->m_Act_Targ = pItem->GetUID(); SysMessagef("Bad spawn (0%lx, id=%s). Set as ACT", static_cast<DWORD>(pItem->GetUID()), g_Cfg.ResourceGetName(rid)); fFound = true; } } } } } if ( !fFound ) SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_NO_BAD_SPAWNS)); break; } case CV_BANKSELF: { addBankOpen(m_pChar, LAYER_BANKBOX); break; } case CV_CAST: { SPELL_TYPE spell = static_cast<SPELL_TYPE>(g_Cfg.ResourceGetIndexType(RES_SPELL, s.GetArgStr())); const CSpellDef *pSpellDef = g_Cfg.GetSpellDef(spell); if ( !pSpellDef ) return true; CObjBase *pObjSrc = dynamic_cast<CObjBase *>(pSrc); if ( IsSetMagicFlags(MAGICF_PRECAST) && !pSpellDef->IsSpellType(SPELLFLAG_NOPRECAST) ) { int iSkill; if ( !pSpellDef->GetPrimarySkill(&iSkill, NULL) ) return true; m_tmSkillMagery.m_Spell = spell; // m_atMagery.m_Spell m_pChar->m_atMagery.m_Spell = spell; if ( pObjSrc ) { m_Targ_UID = pObjSrc->GetUID(); // default target. m_Targ_PrvUID = pObjSrc->GetUID(); } else { m_Targ_UID.ClearUID(); m_Targ_PrvUID.ClearUID(); } m_pChar->Skill_Start(static_cast<SKILL_TYPE>(iSkill)); break; } else Cmd_Skill_Magery(spell, pObjSrc); break; } case CV_CHANGEFACE: // open 'face selection' dialog (enhanced clients only) { addGumpDialog(CLIMODE_DIALOG, NULL, 0, NULL, 0, 0, 0, m_pChar, CLIMODE_DIALOG_FACESELECTION); break; } case CV_CHARLIST: // usually just a gm command { if ( !PacketChangeCharacter::CanSendTo(m_NetState) ) break; new PacketChangeCharacter(this); CharDisconnect(); // since there is no undoing this in the client. SetTargMode(CLIMODE_SETUP_CHARLIST); break; } case CV_CTAGLIST: { if ( !strcmpi(s.GetArgStr(), "log") ) pSrc = &g_Serv; m_TagDefs.DumpKeys(pSrc, "CTAG."); break; } case CV_CLEARCTAGS: { if ( s.HasArgs() ) { LPCTSTR pszArgs = s.GetArgStr(); SKIP_SEPARATORS(pszArgs); m_TagDefs.ClearKeys(pszArgs); } else m_TagDefs.ClearKeys(); break; } case CV_CLOSEPAPERDOLL: { const CChar *pChar = s.HasArgs() ? static_cast<CGrayUID>(s.GetArgVal()).CharFind() : m_pChar; if ( pChar ) closeUIWindow(pChar, 0x1); break; } case CV_CLOSEPROFILE: { const CChar *pChar = s.HasArgs() ? static_cast<CGrayUID>(s.GetArgVal()).CharFind() : m_pChar; if ( pChar ) closeUIWindow(pChar, 0x8); break; } case CV_CLOSESTATUS: { const CChar *pChar = s.HasArgs() ? static_cast<CGrayUID>(s.GetArgVal()).CharFind() : m_pChar; if ( pChar ) closeUIWindow(pChar, 0x2); break; } case CV_CODEXOFWISDOM: { INT64 piArgs[2]; size_t iArgQty = Str_ParseCmds(s.GetArgStr(), piArgs, COUNTOF(piArgs)); if ( iArgQty < 1 ) { SysMessage("Usage: CODEXOFWISDOM TopicID [ForceOpen]"); break; } addCodexOfWisdom(static_cast<DWORD>(piArgs[0]), static_cast<bool>(piArgs[1])); break; } case CV_DYE: { const CObjBase *pObj = s.HasArgs() ? static_cast<CGrayUID>(s.GetArgVal()).ObjFind() : NULL; if ( pObj ) addDyeOption(pObj); break; } case CV_EVERBTARG: { m_Prompt_Text = s.GetArgStr(); addPromptConsole(CLIMODE_PROMPT_TARG_VERB, m_Targ_Text.IsEmpty() ? "Enter the verb" : "Enter the text", m_Targ_UID); break; } case CV_EXTRACT: { // sort of like EXPORT but for statics. // Opposite of the "UNEXTRACT" command TCHAR *ppArgs[2]; size_t iArgQty = Str_ParseCmds(s.GetArgStr(), ppArgs, COUNTOF(ppArgs)); if ( iArgQty < 2 ) { SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_EXTRACT_USAGE)); break; } m_Targ_Text = ppArgs[0]; // point at the options (if any) m_tmTile.m_ptFirst.InitPoint(); // clear this first m_tmTile.m_Code = CV_EXTRACT; // set extract code m_tmTile.m_id = Exp_GetVal(ppArgs[1]); // extract id addTarget(CLIMODE_TARG_TILE, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_EXTRACT_AREA), true); break; } case CV_UNEXTRACT: { // Create item from script. // Opposite of the "EXTRACT" command TCHAR *ppArgs[2]; size_t iArgQty = Str_ParseCmds(s.GetArgStr(), ppArgs, COUNTOF(ppArgs)); if ( iArgQty < 2 ) { SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_UNEXTRACT_USAGE)); break; } m_Targ_Text = ppArgs[0]; // point at the options (if any) m_tmTile.m_ptFirst.InitPoint(); // clear this first m_tmTile.m_Code = CV_UNEXTRACT; // set extract code m_tmTile.m_id = Exp_GetVal(ppArgs[1]); // extract id addTarget(CLIMODE_TARG_UNEXTRACT, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_MULTI_POS), true); break; } case CV_GMPAGE: { m_Targ_Text = s.GetArgStr(); if ( !m_Targ_Text.IsEmpty() && !strnicmp(m_Targ_Text, "ADD ", 4) ) { Cmd_GM_Page(m_Targ_Text + 4); break; } addPromptConsole(CLIMODE_PROMPT_GM_PAGE_TEXT, g_Cfg.GetDefaultMsg(DEFMSG_GMPAGE_PROMPT)); break; } case CV_GOTARG: // go to my (preselected) target. { ASSERT(m_pChar); CObjBase *pObj = m_Targ_UID.ObjFind(); if ( pObj ) { CPointMap pt = pObj->GetTopLevelObj()->GetTopPoint(); m_pChar->m_dirFace = m_pChar->GetDir(pObj, m_pChar->m_dirFace); m_pChar->Spell_Teleport(pt, true, false); } break; } case CV_INFO: { // We could also get ground tile info. addTarget(CLIMODE_TARG_OBJ_INFO, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_ITEM_INFO), true, false); break; } case CV_INFORMATION: { SysMessage(g_Serv.GetStatusString(0x22)); SysMessage(g_Serv.GetStatusString(0x24)); break; } case CV_LAST: // fake previous target { if ( GetTargMode() >= CLIMODE_MOUSE_TYPE ) { ASSERT(m_pChar); CObjBase *pObj = m_pChar->m_Act_Targ.ObjFind(); if ( pObj ) { Event_Target(GetTargMode(), pObj->GetUID(), pObj->GetTopPoint()); addTargetCancel(); } break; } return false; } case CV_LINK: // link doors { m_Targ_UID.InitUID(); addTarget(CLIMODE_TARG_LINK, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_LINK_ITEM)); break; } case CV_MAPWAYPOINT: { INT64 piVal[2]; size_t iArgQty = Str_ParseCmds(s.GetArgRaw(), piVal, COUNTOF(piVal)); if ( iArgQty < 2 ) { SysMessage("Usage: MAPWAYPOINT uid type"); break; } CObjBase *pObj = static_cast<CGrayUID>(piVal[0]).ObjFind(); addMapWaypoint(pObj, static_cast<MAPWAYPOINT_TYPE>(piVal[1])); break; } case CV_MENU: { Menu_Setup(g_Cfg.ResourceGetIDType(RES_MENU, s.GetArgStr())); break; } case CV_MIDILIST: { INT64 piMidi[64]; size_t iArgQty = Str_ParseCmds(s.GetArgStr(), piMidi, COUNTOF(piMidi)); if ( iArgQty > 0 ) addMusic(static_cast<MIDI_TYPE>(piMidi[Calc_GetRandVal(iArgQty)])); break; } case CV_NUDGE: { if ( !s.HasArgs() ) { SysMessage("Usage: NUDGE dx dy dz"); break; } m_Targ_Text = s.GetArgRaw(); m_tmTile.m_ptFirst.InitPoint(); // clear this first m_tmTile.m_Code = CV_NUDGE; addTarget(CLIMODE_TARG_TILE, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_NUDGE_AREA), true); break; } case CV_NUKE: { m_Targ_Text = s.GetArgRaw(); m_tmTile.m_ptFirst.InitPoint(); // clear this first m_tmTile.m_Code = CV_NUKE; // set nuke code addTarget(CLIMODE_TARG_TILE, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_NUKE_AREA), true); break; } case CV_NUKECHAR: { m_Targ_Text = s.GetArgRaw(); m_tmTile.m_ptFirst.InitPoint(); // clear this first m_tmTile.m_Code = CV_NUKECHAR; // set nuke code addTarget(CLIMODE_TARG_TILE, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_NUKE_CHAR_AREA), true); break; } case CV_OPENPAPERDOLL: { const CChar *pChar = s.HasArgs() ? static_cast<CGrayUID>(s.GetArgVal()).CharFind() : m_pChar; if ( pChar ) addCharPaperdoll(pChar); break; } case CV_OPENTRADEWINDOW: { TCHAR *ppArgs[2]; Str_ParseCmds(s.GetArgStr(), ppArgs, COUNTOF(ppArgs)); CChar *pChar = ppArgs[0] ? static_cast<CGrayUID>(Exp_GetLLVal(ppArgs[0])).CharFind() : NULL; if ( pChar ) { CItem *pItem = ppArgs[1] ? static_cast<CGrayUID>(Exp_GetLLVal(ppArgs[1])).ItemFind() : NULL; Cmd_SecureTrade(pChar, pItem); } break; } case CV_PAGE: Cmd_GM_PageCmd(s.GetArgStr()); break; case CV_REPAIR: addTarget(CLIMODE_TARG_REPAIR, g_Cfg.GetDefaultMsg(DEFMSG_SELECT_ITEM_REPAIR)); break; case CV_FLUSH: #ifndef _MTNETWORK g_NetworkOut.flush(this); #else g_NetworkManager.flush(m_NetState); #endif break; case CV_RESEND: addReSync(); break; case CV_SAVE: g_World.Save(s.GetArgVal() != 0); break; case CV_SCROLL: // put a scroll up. addScrollResource(s.GetArgStr(), SCROLL_TYPE_UPDATES); break; case CV_SENDPACKET: SendPacket(s.GetArgStr()); break; case CV_SELF: // fake self target if ( GetTargMode() >= CLIMODE_MOUSE_TYPE ) { ASSERT(m_pChar); Event_Target(GetTargMode(), m_pChar->GetUID(), m_pChar->GetTopPoint()); addTargetCancel(); break; } return false; case CV_SHOWSKILLS: addSkillWindow(static_cast<SKILL_TYPE>(g_Cfg.m_iMaxSkill)); // reload the real skills break; case CV_SKILLMENU: Cmd_Skill_Menu(g_Cfg.ResourceGetIDType(RES_SKILLMENU, s.GetArgStr())); break; case CV_SKILLSELECT: Event_Skill_Use(g_Cfg.FindSkillKey(s.GetArgStr())); break; case CV_SUMMON: { ASSERT(m_pChar); const CSpellDef *pSpellDef = g_Cfg.GetSpellDef(SPELL_Summon); if ( !pSpellDef ) return false; m_pChar->m_Act_Targ = m_pChar->GetUID(); m_pChar->m_Act_TargPrv = m_pChar->GetUID(); if ( pSpellDef->IsSpellType(SPELLFLAG_TARG_OBJ|SPELLFLAG_TARG_XYZ) ) { m_tmSkillMagery.m_Spell = SPELL_Summon; m_tmSkillMagery.m_SummonID = static_cast<CREID_TYPE>(g_Cfg.ResourceGetIndexType(RES_CHARDEF, s.GetArgStr())); LPCTSTR pszPrompt = g_Cfg.GetDefaultMsg(DEFMSG_SELECT_MAGIC_TARGET); if ( !pSpellDef->m_sTargetPrompt.IsEmpty() ) pszPrompt = pSpellDef->m_sTargetPrompt; int iSpellTimeout = static_cast<int>(GetDefNum("SPELLTIMEOUT")); if ( !iSpellTimeout ) iSpellTimeout = g_Cfg.m_iSpellTimeout * TICK_PER_SEC; addTarget(CLIMODE_TARG_SKILL_MAGERY, pszPrompt, pSpellDef->IsSpellType(SPELLFLAG_TARG_XYZ), pSpellDef->IsSpellType(SPELLFLAG_HARM), iSpellTimeout); break; } else { m_pChar->m_atMagery.m_Spell = SPELL_Summon; m_pChar->m_atMagery.m_SummonID = static_cast<CREID_TYPE>(g_Cfg.ResourceGetIndexType(RES_CHARDEF, s.GetArgStr())); if ( IsSetMagicFlags(MAGICF_PRECAST) && !pSpellDef->IsSpellType(SPELLFLAG_NOPRECAST) ) { m_pChar->Spell_CastDone(); break; } else { int iSkill; if ( !pSpellDef->GetPrimarySkill(&iSkill, NULL) ) return false; m_pChar->Skill_Start(static_cast<SKILL_TYPE>(iSkill)); } } break; } case CV_SMSG: case CV_SYSMESSAGE: SysMessage(s.GetArgStr()); break; case CV_SYSMESSAGEF: // there is still an issue with numbers not resolving properly when %i,%d,or other numeric format code is in use { TCHAR *ppArgs[4]; size_t iArgQty = Str_ParseCmds(s.GetArgRaw(), ppArgs, COUNTOF(ppArgs)); if ( iArgQty < 2 ) { g_Log.EventError("SysMessagef with less than 1 args for the given text\n"); return false; } if ( iArgQty > 4 ) { g_Log.EventError("Too many arguments given to SysMessagef (max = text + 3\n"); return false; } if ( *ppArgs[0] == '"' ) // skip quotes ++ppArgs[0]; for ( TCHAR *pEnd = ppArgs[0] + strlen(ppArgs[0]) - 1; pEnd >= ppArgs[0]; --pEnd ) { if ( *pEnd == '"' ) // skip quotes { *pEnd = '\0'; break; } } SysMessagef(ppArgs[0], ppArgs[1], ppArgs[2] ? ppArgs[2] : 0, ppArgs[3] ? ppArgs[3] : 0); break; } case CV_SMSGU: case CV_SYSMESSAGEUA: { TCHAR *ppArgs[5]; size_t iArgQty = Str_ParseCmds(s.GetArgRaw(), ppArgs, COUNTOF(ppArgs)); if ( iArgQty > 4 ) { // Font and mode are actually ignored here, but they never made a difference anyway.. I'd like to keep the syntax similar to SAYUA NCHAR szBuffer[MAX_TALK_BUFFER]; CvtSystemToNUNICODE(szBuffer, COUNTOF(szBuffer), ppArgs[4], -1); addBarkUNICODE(szBuffer, NULL, static_cast<HUE_TYPE>(Exp_GetLLVal(ppArgs[0])), TALKMODE_SYSTEM, FONT_NORMAL, ppArgs[3]); } break; } case CV_SMSGL: case CV_SYSMESSAGELOC: { TCHAR *ppArgs[256]; size_t iArgQty = Str_ParseCmds(s.GetArgRaw(), ppArgs, COUNTOF(ppArgs), ","); if ( iArgQty > 1 ) { HUE_TYPE hue = HUE_TEXT_DEF; if ( ATOI(ppArgs[0]) > 0 ) hue = static_cast<HUE_TYPE>(Exp_GetLLVal(ppArgs[0])); DWORD dwClilocId = static_cast<DWORD>(Exp_GetLLVal(ppArgs[1])); CGString sVal; for ( size_t i = 2; i < iArgQty; ++i ) { if ( sVal.GetLength() ) sVal += "\t"; sVal += !strcmp(ppArgs[i], "NULL") ? " " : ppArgs[i]; } addBarkLocalized(dwClilocId, NULL, hue, TALKMODE_SYSTEM, FONT_NORMAL, sVal.GetPtr()); } break; } case CV_SMSGLEX: case CV_SYSMESSAGELOCEX: { TCHAR *ppArgs[256]; size_t iArgQty = Str_ParseCmds(s.GetArgRaw(), ppArgs, COUNTOF(ppArgs), ","); if ( iArgQty > 2 ) { HUE_TYPE hue = HUE_TEXT_DEF; AFFIX_TYPE affix = AFFIX_APPEND; if ( ATOI(ppArgs[0]) > 0 ) hue = static_cast<HUE_TYPE>(Exp_GetLLVal(ppArgs[0])); DWORD dwClilocId = static_cast<DWORD>(Exp_GetLLVal(ppArgs[1])); if ( ppArgs[2] ) affix = static_cast<AFFIX_TYPE>(Exp_GetLLVal(ppArgs[2])); CGString sVal; for ( size_t i = 4; i < iArgQty; ++i ) { if ( sVal.GetLength() ) sVal += "\t"; sVal += !strcmp(ppArgs[i], "NULL") ? " " : ppArgs[i]; } addBarkLocalizedEx(dwClilocId, NULL, hue, TALKMODE_SYSTEM, FONT_NORMAL, affix, ppArgs[3], sVal.GetPtr()); } break; } case CV_TELE: Cmd_Skill_Magery(SPELL_Teleport, dynamic_cast<CObjBase *>(pSrc)); break; case CV_TILE: if ( !s.HasArgs() ) { SysMessage("Usage: TILE z-height item1 item2 itemX"); break; } m_Targ_Text = s.GetArgStr(); // point at the options m_tmTile.m_ptFirst.InitPoint(); // clear this first m_tmTile.m_Code = CV_TILE; addTarget(CLIMODE_TARG_TILE, "Pick 1st corner:", true); break; case CV_VERSION: SysMessage(g_szServerDescription); break; case CV_WEBLINK: addWebLaunch(s.GetArgStr()); break; default: if ( r_LoadVal(s) ) { CGString sVal; if ( r_WriteVal(s.GetKey(), sVal, pSrc) ) return true; } return CScriptObj::r_Verb(s, pSrc); // used in the case of web pages to access server level things } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPTSRC; EXC_DEBUG_END; return false; }
bool CItemStone::r_LoadVal( CScript & s ) // Load an item Script { ADDTOCALLSTACK("CItemStone::r_LoadVal"); EXC_TRY("LoadVal"); switch ( FindTableSorted( s.GetKey(), sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case STC_ABBREV: // "ABBREV" m_sAbbrev = s.GetArgStr(); return true; case STC_ALIGN: // "ALIGN" SetAlignType(static_cast<STONEALIGN_TYPE>(s.GetArgVal())); return true; case STC_MasterUid: { if ( s.HasArgs() ) { CGrayUID pNewMasterUid = (DWORD) s.GetArgVal(); CChar * pChar = pNewMasterUid.CharFind(); if ( !pChar ) { DEBUG_ERR(( "MASTERUID called on non char 0%lx uid.\n", (DWORD)pNewMasterUid )); return( false ); } CStoneMember * pNewMaster = GetMember( pChar ); if ( !pNewMaster ) { DEBUG_ERR(( "MASTERUID called on char 0%lx (%s) that is not a valid member of stone with 0x%lx uid.\n", (DWORD)pNewMasterUid, pChar->GetName(), (DWORD)GetUID() )); return( false ); } CStoneMember * pMaster = GetMasterMember(); if ( pMaster ) { if ( pMaster->GetLinkUID() == pNewMasterUid ) return( true ); pMaster->SetPriv(STONEPRIV_MEMBER); //pMaster->SetLoyalTo(pChar); } //pNewMaster->SetLoyalTo(pChar); pNewMaster->SetPriv(STONEPRIV_MASTER); } else { DEBUG_ERR(( "MASTERUID called without arguments.\n" )); return( false ); } } return( true ); case STC_MEMBER: // "MEMBER" { TCHAR *Arg_ppCmd[8]; // Maximum parameters in one line size_t Arg_Qty = Str_ParseCmds( s.GetArgStr(), Arg_ppCmd, COUNTOF( Arg_ppCmd ), "," ); if (Arg_Qty < 1) // must at least provide the member uid return false; new CStoneMember( this, ahextoi(Arg_ppCmd[0]), // Member's UID Arg_Qty > 2 ? static_cast<STONEPRIV_TYPE>(ATOI(Arg_ppCmd[2])) : STONEPRIV_CANDIDATE, // Members priv level (use as a type) Arg_Qty > 1 ? Arg_ppCmd[1] : "", // Title ahextoi(Arg_ppCmd[3]), // Member is loyal to this Arg_Qty > 4 ? (ATOI( Arg_ppCmd[4] ) != 0) : 0, // Paperdoll stone abbreviation (also if they declared war) Arg_Qty > 5 ? (ATOI( Arg_ppCmd[5] ) != 0) : 0, // If we declared war Arg_Qty > 6 ? ATOI( Arg_ppCmd[6] ) : 0); // AccountGold } return true; case STC_WEBPAGE: // "WEBPAGE" m_sWebPageURL = s.GetArgStr(); return true; } if ( s.IsKeyHead( sm_szLoadKeys[STC_CHARTER], 7 )) { unsigned int i = ATOI(s.GetKey() + 7); if ( i >= COUNTOF(m_sCharter)) return( false ); m_sCharter[i] = s.GetArgStr(); return( true ); } return CItem::r_LoadVal(s); EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
int gtmsource_get_opt(void) { boolean_t secondary, dotted_notation; int tries, index = 0; unsigned short secondary_len; char secondary_sys[MAX_SECONDARY_LEN], *c; struct hostent *sec_hostentry; boolean_t log, log_interval_specified; unsigned short log_file_len; boolean_t buffsize_status; boolean_t filter; unsigned short filter_cmd_len; int timeout_status; unsigned short statslog_val_len; char statslog_val[4]; /* "ON" or "OFF" */ unsigned short update_val_len; char update_val[SIZEOF("DISABLE")]; /* "ENABLE" or "DISABLE" */ unsigned short connect_parms_str_len; char *connect_parms_str, tmp_connect_parms_str[GTMSOURCE_CONN_PARMS_LEN + 1]; char *connect_parm_token_str, *connect_parm; int connect_parms_index; boolean_t connect_parms_badval; memset((char *)>msource_options, 0, SIZEOF(gtmsource_options)); gtmsource_options.start = (cli_present("START") == CLI_PRESENT); gtmsource_options.shut_down = (cli_present("SHUTDOWN") == CLI_PRESENT); gtmsource_options.activate = (cli_present("ACTIVATE") == CLI_PRESENT); gtmsource_options.deactivate = (cli_present("DEACTIVATE") == CLI_PRESENT); gtmsource_options.checkhealth = (cli_present("CHECKHEALTH") == CLI_PRESENT); gtmsource_options.statslog = (cli_present("STATSLOG") == CLI_PRESENT); gtmsource_options.showbacklog = (cli_present("SHOWBACKLOG") == CLI_PRESENT); gtmsource_options.changelog = (cli_present("CHANGELOG") == CLI_PRESENT); gtmsource_options.stopsourcefilter = (cli_present("STOPSOURCEFILTER") == CLI_PRESENT); gtmsource_options.update = (cli_present("UPDATE") == CLI_PRESENT); if (gtmsource_options.start || gtmsource_options.activate) { if (secondary = (CLI_PRESENT == cli_present("SECONDARY"))) { secondary_len = MAX_SECONDARY_LEN; if (!cli_get_str("SECONDARY", secondary_sys, &secondary_len)) { util_out_print("Error parsing SECONDARY qualifier", TRUE); return(-1); } /* Parse secondary_sys into secondary_host * and secondary_port */ c = secondary_sys; dotted_notation = TRUE; while(*c && *c != ':') { if ('.' != *c && !ISDIGIT(*c)) dotted_notation = FALSE; gtmsource_options.secondary_host[index++] = *c++; } gtmsource_options.secondary_host[index] = '\0'; if (':' != *c) { util_out_print("Secondary port number should be specified", TRUE); return(-1); } errno = 0; if (((0 == (gtmsource_options.secondary_port = ATOI(++c))) && (0 != errno)) || (0 >= gtmsource_options.secondary_port)) { util_out_print("Error parsing secondary port number !AD", TRUE, LEN_AND_STR(c)); return(-1); } /* Validate the specified secondary host name */ if (dotted_notation) { if ((in_addr_t)-1 == (gtmsource_options.sec_inet_addr = INET_ADDR(gtmsource_options.secondary_host))) { util_out_print("Invalid IP address !AD", TRUE, LEN_AND_STR(gtmsource_options.secondary_host)); return(-1); } } else { for (tries = 0; tries < MAX_GETHOST_TRIES && !(sec_hostentry = GETHOSTBYNAME(gtmsource_options.secondary_host)) && h_errno == TRY_AGAIN; tries++); if (NULL == sec_hostentry) { util_out_print("Could not find IP address for !AD", TRUE, LEN_AND_STR(gtmsource_options.secondary_host)); return(-1); } gtmsource_options.sec_inet_addr = ((struct in_addr *)sec_hostentry->h_addr_list[0])->s_addr; } } if (CLI_PRESENT == cli_present("CONNECTPARAMS")) { connect_parms_str_len = GTMSOURCE_CONN_PARMS_LEN + 1; if (!cli_get_str("CONNECTPARAMS", tmp_connect_parms_str, &connect_parms_str_len)) { util_out_print("Error parsing CONNECTPARAMS qualifier", TRUE); return(-1); } #ifdef VMS /* strip the quotes around the string. (DCL doesn't do it) */ assert('"' == tmp_connect_parms_str[0]); assert('"' == tmp_connect_parms_str[connect_parms_str_len - 1]); connect_parms_str = &tmp_connect_parms_str[1]; tmp_connect_parms_str[connect_parms_str_len - 1] = '\0'; #else connect_parms_str = &tmp_connect_parms_str[0]; #endif for (connect_parms_index = GTMSOURCE_CONN_HARD_TRIES_COUNT, connect_parms_badval = FALSE, connect_parm_token_str = connect_parms_str; !connect_parms_badval && connect_parms_index < GTMSOURCE_CONN_PARMS_COUNT && (connect_parm = strtok(connect_parm_token_str, GTMSOURCE_CONN_PARMS_DELIM)) != NULL; connect_parms_index++, connect_parm_token_str = NULL) { errno = 0; if ((0 == (gtmsource_options.connect_parms[connect_parms_index] = ATOI(connect_parm)) && 0 != errno) || 0 >= gtmsource_options.connect_parms[connect_parms_index]) connect_parms_badval = TRUE; } if (connect_parms_badval) { util_out_print("Error parsing or invalid value parameter in CONNECTPARAMS", TRUE); return(-1); } if (GTMSOURCE_CONN_PARMS_COUNT != connect_parms_index) { util_out_print( "All CONNECTPARAMS - HARD TRIES, HARD TRIES PERIOD, " "SOFT TRIES PERIOD, " "ALERT TIME, HEARTBEAT INTERVAL, " "MAX HEARBEAT WAIT should be specified", TRUE); return(-1); } } else { gtmsource_options.connect_parms[GTMSOURCE_CONN_HARD_TRIES_COUNT] = REPL_CONN_HARD_TRIES_COUNT; gtmsource_options.connect_parms[GTMSOURCE_CONN_HARD_TRIES_PERIOD] = REPL_CONN_HARD_TRIES_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_SOFT_TRIES_PERIOD] = REPL_CONN_SOFT_TRIES_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_ALERT_PERIOD] = REPL_CONN_ALERT_ALERT_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_PERIOD] = REPL_CONN_HEARTBEAT_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_MAX_WAIT] = REPL_CONN_HEARTBEAT_MAX_WAIT; } if (gtmsource_options.connect_parms[GTMSOURCE_CONN_ALERT_PERIOD]< gtmsource_options.connect_parms[GTMSOURCE_CONN_SOFT_TRIES_PERIOD]) gtmsource_options.connect_parms[GTMSOURCE_CONN_ALERT_PERIOD] = gtmsource_options.connect_parms[GTMSOURCE_CONN_SOFT_TRIES_PERIOD]; if (gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_MAX_WAIT] < gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_PERIOD]) gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_MAX_WAIT] = gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_PERIOD]; } if (gtmsource_options.start || gtmsource_options.statslog || gtmsource_options.changelog || gtmsource_options.activate || gtmsource_options.deactivate) { log = (cli_present("LOG") == CLI_PRESENT); log_interval_specified = (CLI_PRESENT == cli_present("LOG_INTERVAL")); if (log) { log_file_len = MAX_FN_LEN + 1; if (!cli_get_str("LOG", gtmsource_options.log_file, &log_file_len)) { util_out_print("Error parsing LOG qualifier", TRUE); return(-1); } } else gtmsource_options.log_file[0] = '\0'; gtmsource_options.src_log_interval = 0; if (log_interval_specified) { if (!cli_get_num("LOG_INTERVAL", (int4 *)>msource_options.src_log_interval)) { util_out_print("Error parsing LOG_INTERVAL qualifier", TRUE); return (-1); } } if (gtmsource_options.start && 0 == gtmsource_options.src_log_interval) gtmsource_options.src_log_interval = LOGTRNUM_INTERVAL; /* For changelog/activate/deactivate, interval == 0 implies don't change log interval already established */ /* We ignore interval specification for statslog, Vinaya 2005/02/07 */ } if (gtmsource_options.start) { assert(secondary || CLI_PRESENT == cli_present("PASSIVE")); gtmsource_options.mode = ((secondary) ? GTMSOURCE_MODE_ACTIVE : GTMSOURCE_MODE_PASSIVE); if (buffsize_status = (CLI_PRESENT == cli_present("BUFFSIZE"))) { if (!cli_get_int("BUFFSIZE", >msource_options.buffsize)) { util_out_print("Error parsing BUFFSIZE qualifier", TRUE); return(-1); } if (MIN_JNLPOOL_SIZE > gtmsource_options.buffsize) gtmsource_options.buffsize = MIN_JNLPOOL_SIZE; } else gtmsource_options.buffsize = DEFAULT_JNLPOOL_SIZE; /* Round up buffsize to the nearest (~JNL_WRT_END_MASK + 1) multiple */ gtmsource_options.buffsize = ((gtmsource_options.buffsize + ~JNL_WRT_END_MASK) & JNL_WRT_END_MASK); if (filter = (CLI_PRESENT == cli_present("FILTER"))) { filter_cmd_len = MAX_FILTER_CMD_LEN; if (!cli_get_str("FILTER", gtmsource_options.filter_cmd, &filter_cmd_len)) { util_out_print("Error parsing FILTER qualifier", TRUE); return(-1); } } else gtmsource_options.filter_cmd[0] = '\0'; } if (gtmsource_options.shut_down) { if ((timeout_status = cli_present("TIMEOUT")) == CLI_PRESENT) { if (!cli_get_int("TIMEOUT", >msource_options.shutdown_time)) { util_out_print("Error parsing TIMEOUT qualifier", TRUE); return(-1); } if (DEFAULT_SHUTDOWN_TIMEOUT < gtmsource_options.shutdown_time || 0 > gtmsource_options.shutdown_time) { gtmsource_options.shutdown_time = DEFAULT_SHUTDOWN_TIMEOUT; util_out_print("shutdown TIMEOUT changed to !UL", TRUE, gtmsource_options.shutdown_time); } } else if (CLI_NEGATED == timeout_status) gtmsource_options.shutdown_time = -1; else /* TIMEOUT not specified */ gtmsource_options.shutdown_time = DEFAULT_SHUTDOWN_TIMEOUT; } if (gtmsource_options.statslog) { statslog_val_len = 4; /* max(strlen("ON"), strlen("OFF")) + 1 */ if (!cli_get_str("STATSLOG", statslog_val, &statslog_val_len)) { util_out_print("Error parsing STATSLOG qualifier", TRUE); return(-1); } UNIX_ONLY(cli_strupper(statslog_val);) if (0 == strcmp(statslog_val, "ON"))
bool CImportFile::ImportWSC( CScript & s, word wModeFlags ) { ADDTOCALLSTACK("CImportFile::ImportWSC"); // This file is a WSC or UOX world script file. IMPFLAGS_TYPE mode = IMPFLAGS_NOTHING; CSString sName; CItem * pItem = NULL; CChar * pChar = NULL; while ( s.ReadTextLine(true)) { if ( s.IsKeyHead( "SECTION WORLDITEM", 17 )) { CheckLast(); mode = IMPFLAGS_ITEMS; continue; } else if ( s.IsKeyHead( "SECTION CHARACTER", 17 )) { CheckLast(); mode = ( wModeFlags & IMPFLAGS_CHARS ) ? IMPFLAGS_CHARS : IMPFLAGS_NOTHING; continue; } else if ( s.GetKey()[0] == '{' ) { CheckLast(); continue; } else if ( s.GetKey()[0] == '}' ) { CheckLast(); mode = IMPFLAGS_NOTHING; continue; } else if ( mode == IMPFLAGS_NOTHING ) continue; else if ( s.GetKey()[0] == '\\' ) continue; // Parse the line. tchar* pKey = const_cast<tchar*>(strchr(s.GetKey(), ' ')); lpctstr pArg = NULL; if (pKey != NULL) { *pKey++ = '\0'; GETNONWHITESPACE(pKey); pArg = pKey; } else { pArg = ""; } if ( s.IsKey("SERIAL" )) { if ( m_pCurSer != NULL ) return false; dword dwSerial = ATOI( pArg ); if ( dwSerial == UID_UNUSED ) { DEBUG_ERR(( "Import:Bad serial number\n" )); break; } m_pCurSer = new CImportSer( dwSerial ); m_ListSer.InsertHead( m_pCurSer ); continue; } if ( s.IsKey("NAME" )) { sName = ( pArg[0] == '#' ) ? "" : pArg; if ( mode == IMPFLAGS_ITEMS ) continue; } if ( m_pCurSer == NULL ) { DEBUG_ERR(( "Import:No serial number\n" )); break; } if ( mode == IMPFLAGS_ITEMS ) // CItem. { if ( s.IsKey("ID" )) { if ( m_pCurObj != NULL ) return false; pItem = CItem::CreateTemplate(static_cast<ITEMID_TYPE>(ATOI(pArg))); pItem->SetName( sName ); m_pCurObj = pItem; m_pCurSer->m_pObj = pItem; continue; } if ( m_pCurObj == NULL ) { DEBUG_ERR(( "Import:Bad Item Key '%s'\n", s.GetKey())); break; } else if ( s.IsKey("CONT" )) { m_pCurSer->m_dwContSer = ATOI(pArg); } else if ( s.IsKey("LAYER" )) { m_pCurSer->m_layer = static_cast<LAYER_TYPE>(ATOI(pArg)); continue; } else if (pItem == NULL) { DEBUG_ERR(( "Import:Found '%s' before ID.\n", s.GetKey())); continue; } if ( s.IsKey("X" )) { CPointMap pt = pItem->GetUnkPoint(); pt.m_x = (short)( ATOI(pArg) ); pItem->SetUnkPoint(pt); continue; } else if ( s.IsKey("Y" )) { CPointMap pt = pItem->GetUnkPoint(); pt.m_y = (short)( ATOI(pArg) ); pItem->SetUnkPoint(pt); continue; } else if ( s.IsKey("Z" )) { CPointMap pt = pItem->GetUnkPoint(); pt.m_z = (char)( ATOI(pArg) ); pItem->SetUnkPoint(pt); continue; } else if ( s.IsKey("COLOR" )) { pItem->SetHue( static_cast<HUE_TYPE>( ATOI(pArg) ) ); continue; } else if ( s.IsKey("AMOUNT" )) { pItem->SetAmount( (word)ATOI(pArg) ); continue; } else if ( s.IsKey("MOREX" )) { pItem->m_itNormal.m_morep.m_x = (short)(ATOI(pArg)); continue; } else if ( s.IsKey("MOREY" )) { pItem->m_itNormal.m_morep.m_y = (short)(ATOI(pArg)); continue; } else if ( s.IsKey("MOREZ" )) { pItem->m_itNormal.m_morep.m_z = (char)( ATOI(pArg) ); continue; } else if ( s.IsKey("MORE" )) { pItem->m_itNormal.m_more1 = ATOI(pArg); continue; } else if ( s.IsKey("MORE2" )) { pItem->m_itNormal.m_more2 = ATOI(pArg); continue; } else if ( s.IsKey("DYEABLE" )) { //if ( ATOI(pArg)) // pItem->m_pDef->m_Can |= CAN_I_DYE; continue; } else if ( s.IsKey("ATT" )) { // pItem->m_pDef->m_attackBase = ATOI(pArg); } else if ( s.IsKey("TYPE" )) { // ??? translate the type field. //int i = ATOI(pArg); } } if ( mode == IMPFLAGS_CHARS ) { if ( s.IsKey("NAME" )) { if ( m_pCurObj != NULL ) return false; pChar = CChar::CreateBasic( CREID_MAN ); pChar->SetName( sName ); m_pCurObj = pChar; m_pCurSer->m_pObj = pChar; continue; } if ( m_pCurObj == NULL ) { DEBUG_ERR(( "Import:Bad Item Key '%s'\n", s.GetKey())); break; } else if (pChar == NULL) { DEBUG_ERR(( "Import:Found '%s' before NAME.\n", s.GetKey())); continue; } if ( s.IsKey("X" )) { CPointMap pt = pChar->GetUnkPoint(); pt.m_x = (short)(ATOI(pArg)); pChar->SetUnkPoint(pt); continue; } else if ( s.IsKey("Y" )) { CPointMap pt = pChar->GetUnkPoint(); pt.m_y = (short)(ATOI(pArg)); pChar->SetUnkPoint(pt); continue; } else if ( s.IsKey("Z" )) { CPointMap pt = pChar->GetUnkPoint(); pt.m_z = (char)(ATOI(pArg)); pChar->SetUnkPoint(pt); continue; } else if ( s.IsKey("BODY" )) { pChar->SetID(static_cast<CREID_TYPE>(ATOI(pArg))); continue; } else if ( s.IsKey("SKIN" )) { pChar->SetHue( static_cast<HUE_TYPE>( ATOI(pArg) )); continue; } else if ( s.IsKey("DIR" )) { pChar->m_dirFace = static_cast<DIR_TYPE>(ATOI(pArg)); if ( pChar->m_dirFace < 0 || pChar->m_dirFace >= DIR_QTY ) pChar->m_dirFace = DIR_SE; continue; } else if ( s.IsKey("XBODY" )) { pChar->m_prev_id = static_cast<CREID_TYPE>(ATOI(pArg)); continue; } else if ( s.IsKey("XSKIN" )) { pChar->m_prev_Hue = static_cast<HUE_TYPE>( ATOI(pArg) ); continue; } else if ( s.IsKey("FONT" )) { pChar->m_fonttype = static_cast<FONT_TYPE>(ATOI(pArg)); continue; } else if ( s.IsKey("KARMA" )) { pChar->Stat_SetBase(STAT_KARMA, (short)(ATOI(pArg))); continue; } else if ( s.IsKey("FAME" )) { pChar->Stat_SetBase(STAT_FAME, (short)(ATOI(pArg))); continue; } else if ( s.IsKey("TITLE" )) { pChar->m_sTitle = pArg; continue; } else if ( s.IsKey("STRENGTH" )) { pChar->Stat_SetBase(STAT_STR, (short)(ATOI(pArg))); } else if ( s.IsKey("DEXTERITY" )) { pChar->Stat_SetBase(STAT_DEX, (short)(ATOI(pArg))); } else if ( s.IsKey("INTELLIGENCE" )) { pChar->Stat_SetBase(STAT_INT, (short)(ATOI(pArg))); } else if ( s.IsKey("HITPOINTS" )) { pChar->Stat_SetVal(STAT_STR,(short)(ATOI(pArg))); } else if ( s.IsKey("STAMINA" )) { pChar->Stat_SetVal(STAT_DEX,(short)(ATOI(pArg))); } else if ( s.IsKey( "MANA" )) { pChar->Stat_SetVal(STAT_INT,(short)(ATOI(pArg))); } else if ( s.IsKeyHead( "SKILL", 5 )) { SKILL_TYPE skill = static_cast<SKILL_TYPE>(ATOI( &(s.GetKey()[5]))); if ( pChar->IsSkillBase(skill) && g_Cfg.m_SkillIndexDefs.IsValidIndex(skill) ) { pChar->Skill_SetBase( skill, ATOI(pArg)); } } else if ( s.IsKey("ACCOUNT" )) { // What if the account does not exist ? pChar->SetPlayerAccount( pArg ); } else if ( s.IsKey("KILLS" ) && pChar->m_pPlayer ) { pChar->m_pPlayer->m_wMurders = (word)(ATOI(pArg)); } else if ( s.IsKey("NPCAITYPE" )) { // Convert to proper NPC type. int i = ATOI( pArg ); switch ( i ) { case 0x01: pChar->SetNPCBrain( NPCBRAIN_HEALER ); break; case 0x02: pChar->SetNPCBrain( NPCBRAIN_MONSTER ); break; case 0x04: case 0x40: pChar->SetNPCBrain( NPCBRAIN_GUARD ); break; case 0x08: pChar->SetNPCBrain( NPCBRAIN_BANKER ); break; default: pChar->SetNPCBrain( pChar->GetNPCBrain( false )); break; } } continue; } } return true; }
bool CChar::NPC_OnHearPetCmdTarg( int iCmd, CChar *pSrc, CObjBase *pObj, const CPointMap &pt, LPCTSTR pszArgs ) { ADDTOCALLSTACK("CChar::NPC_OnHearPetCmdTarg"); // Pet commands that required a target. if ( m_fIgnoreNextPetCmd ) { m_fIgnoreNextPetCmd = false; return false; } switch ( iCmd ) { case PC_FOLLOW: case PC_STAY: case PC_STOP: { // Pet friends can use only these commands if ( Memory_FindObjTypes(pSrc, MEMORY_FRIEND) ) break; } default: { // All others commands are avaible only to pet owner if ( !NPC_IsOwnedBy(pSrc, true) ) return false; } } if ( IsStatFlag(STATF_DEAD) ) { // Bonded NPCs still placed on world even when dead. // They can listen to commands, but not to these commands below if ( iCmd == PC_GUARD || iCmd == PC_GUARD_ME || iCmd == PC_ATTACK || iCmd == PC_KILL || iCmd == PC_TRANSFER || iCmd == PC_DROP || iCmd == PC_DROP_ALL ) return true; } bool bSuccess = false; CItem *pItemTarg = dynamic_cast<CItem *>(pObj); CChar *pCharTarg = dynamic_cast<CChar *>(pObj); switch ( iCmd ) { case PC_ATTACK: case PC_KILL: { if ( !pCharTarg || pCharTarg == pSrc ) break; bSuccess = pCharTarg->OnAttackedBy(pSrc, 1, true); // we know who told them to do this. if ( bSuccess ) bSuccess = Fight_Attack(pCharTarg, true); break; } case PC_FOLLOW: if ( !pCharTarg ) break; m_Act_Targ = pCharTarg->GetUID(); bSuccess = Skill_Start(NPCACT_FOLLOW_TARG); break; case PC_FRIEND: { if ( !pCharTarg || !pCharTarg->m_pPlayer || pCharTarg == pSrc ) { Speak(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_CONFUSED)); break; } CItemMemory *pMemory = Memory_FindObjTypes(pCharTarg, MEMORY_FRIEND); if ( pMemory ) { pSrc->SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_FRIEND_ALREADY)); break; } pSrc->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_FRIEND_SUCCESS1), GetName(), pCharTarg->GetName()); pCharTarg->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_FRIEND_SUCCESS2), pSrc->GetName(), GetName()); Memory_AddObjTypes(pCharTarg, MEMORY_FRIEND); m_Act_Targ = pCharTarg->GetUID(); bSuccess = Skill_Start(NPCACT_FOLLOW_TARG); break; } case PC_UNFRIEND: { if ( !pCharTarg || !pCharTarg->m_pPlayer ) { Speak(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_CONFUSED)); break; } CItemMemory *pMemory = Memory_FindObjTypes(pCharTarg, MEMORY_FRIEND); if ( !pMemory ) { pSrc->SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_UNFRIEND_NOTFRIEND)); break; } pSrc->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_UNFRIEND_SUCCESS1), GetName(), pCharTarg->GetName()); pCharTarg->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_UNFRIEND_SUCCESS2), pSrc->GetName(), GetName()); pMemory->Delete(); m_Act_Targ = pSrc->GetUID(); bSuccess = Skill_Start(NPCACT_FOLLOW_TARG); break; } case PC_GO: if ( !pt.IsValidPoint() ) break; m_Act_p = pt; bSuccess = Skill_Start(NPCACT_GOTO); break; case PC_GUARD: if ( !pCharTarg ) break; pCharTarg->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_GUARD_SUCCESS), GetName()); m_Act_Targ = pCharTarg->GetUID(); bSuccess = Skill_Start(NPCACT_GUARD_TARG); break; case PC_TRANSFER: if ( !pCharTarg || !pCharTarg->IsClient() ) break; if ( IsSetOF(OF_PetSlots) ) { if ( !pCharTarg->FollowersUpdate(this, static_cast<short>(maximum(1, GetDefNum("FOLLOWERSLOTS", true, true))), true) ) { pSrc->SysMessageDefault(DEFMSG_PETSLOTS_TRY_TRANSFER); break; } } bSuccess = NPC_PetSetOwner( pCharTarg ); break; case PC_PRICE: // "PRICE" the vendor item. if ( !pItemTarg || !NPC_IsVendor() || !pSrc->IsClient() ) break; if ( IsDigit(pszArgs[0]) ) // did they name a price return NPC_SetVendorPrice(pItemTarg, ATOI(pszArgs)); if ( !NPC_SetVendorPrice(pItemTarg, -1) ) // test if it can be priced return false; pSrc->m_pClient->addPromptConsole(CLIMODE_PROMPT_VENDOR_PRICE, g_Cfg.GetDefaultMsg(DEFMSG_NPC_VENDOR_SETPRICE_2), pItemTarg->GetUID(), GetUID()); return true; default: break; } // Make some sound to confirm we heard it NPC_OnPetCommand(bSuccess, pSrc); return bSuccess; }
static int SetSSIGap(unsigned int argc, unsigned char *argv[]) { UINT32 gap; struct nim_device *nim_dev = dev_get_by_id(HLD_DEV_TYPE_NIM, nim_id); if (argc != 2) { SH_PRINTF("Usage: SetPara <clk>\n"); return -1; } else if(nim_dev == NULL) { SH_PRINTF("Nim1 status error\n"); return -1; } if(strcasecmp("gap",argv[1])) { gap = ATOI(&(argv[1][3])); nim_io_control(nim_dev, NIM_DRIVER_CHANGE_TS_GAP, gap); } else { SH_PRINTF("parameter error\n"); return -3; } #if 1//path for lock delay UINT8 lock; UINT32 pre_tick = osal_get_tick(); while((osal_get_tick()-pre_tick)>=SSI_GAP_TIMEOUT) { nim_get_lock(nim_dev,&lock); if(lock) break; osal_delay(30); } #endif LIB_ASH_OC('S'); LIB_ASH_OC('e'); LIB_ASH_OC('t'); LIB_ASH_OC(' '); LIB_ASH_OC('S'); LIB_ASH_OC('S'); LIB_ASH_OC('I'); LIB_ASH_OC(' '); LIB_ASH_OC('G'); LIB_ASH_OC('a'); LIB_ASH_OC('p'); LIB_ASH_OC(' '); LIB_ASH_OC('t'); LIB_ASH_OC('o'); LIB_ASH_OC(' '); LIB_ASH_OC('g'); LIB_ASH_OC('a'); LIB_ASH_OC('p'); if(gap<10) { LIB_ASH_OC((gap + '0')); } else { LIB_ASH_OC(((UINT8)gap/10 + '0')); LIB_ASH_OC(((UINT8)gap%10 + '0')); } LIB_ASH_OC('\r'); LIB_ASH_OC('\n'); reset_perflag(); return 0; }
int gtmsource_get_opt(void) { char *connect_parm_token_str, *connect_parm; char *connect_parms_str, tmp_connect_parms_str[GTMSOURCE_CONN_PARMS_LEN + 1]; char secondary_sys[MAX_SECONDARY_LEN], *c, inst_name[MAX_FN_LEN + 1]; char statslog_val[SIZEOF("OFF")]; /* "ON" or "OFF" */ char update_val[SIZEOF("DISABLE")]; /* "ENABLE" or "DISABLE" */ char freeze_val[SIZEOF("OFF")]; /* "ON" or "OFF" */ char freeze_comment[SIZEOF(gtmsource_options.freeze_comment)]; int tries, index = 0, timeout_status, connect_parms_index, status, renegotiate_interval; struct hostent *sec_hostentry; unsigned short log_file_len, filter_cmd_len; unsigned short secondary_len, inst_name_len, statslog_val_len, update_val_len, connect_parms_str_len; unsigned short freeze_val_len, freeze_comment_len, tlsid_len; int errcode; int port_len; char *ip_end; mstr log_nam, trans_name; boolean_t secondary, dotted_notation, log, log_interval_specified, connect_parms_badval, plaintext_fallback; memset((char *)>msource_options, 0, SIZEOF(gtmsource_options)); gtmsource_options.start = (CLI_PRESENT == cli_present("START")); gtmsource_options.shut_down = (CLI_PRESENT == cli_present("SHUTDOWN")); gtmsource_options.activate = (CLI_PRESENT == cli_present("ACTIVATE")); gtmsource_options.deactivate = (CLI_PRESENT == cli_present("DEACTIVATE")); gtmsource_options.checkhealth = (CLI_PRESENT == cli_present("CHECKHEALTH")); gtmsource_options.statslog = (CLI_PRESENT == cli_present("STATSLOG")); gtmsource_options.showbacklog = (CLI_PRESENT == cli_present("SHOWBACKLOG")); gtmsource_options.changelog = (CLI_PRESENT == cli_present("CHANGELOG")); gtmsource_options.stopsourcefilter = (CLI_PRESENT == cli_present("STOPSOURCEFILTER")); gtmsource_options.needrestart = (CLI_PRESENT == cli_present("NEEDRESTART")); gtmsource_options.losttncomplete = (CLI_PRESENT == cli_present("LOSTTNCOMPLETE")); gtmsource_options.jnlpool = (CLI_PRESENT == cli_present("JNLPOOL")); secondary = (CLI_PRESENT == cli_present("SECONDARY")); gtmsource_options.rootprimary = ROOTPRIMARY_UNSPECIFIED; /* to indicate unspecified state */ if ((CLI_PRESENT == cli_present("ROOTPRIMARY")) || (CLI_PRESENT == cli_present("UPDOK"))) gtmsource_options.rootprimary = ROOTPRIMARY_SPECIFIED; else if ((CLI_PRESENT == cli_present("PROPAGATEPRIMARY")) || (CLI_PRESENT == cli_present("UPDNOTOK"))) gtmsource_options.rootprimary = PROPAGATEPRIMARY_SPECIFIED; else { /* Neither ROOTPRIMARY (or UPDOK) nor PROPAGATEPRIMARY (or UPDNOTOK) specified. Assume default values. * Assume ROOTPRIMARY for -START -SECONDARY (active source server start) and -ACTIVATE commands. * Assume PROPAGATEPRIMARY for -START -PASSIVE (passive source server start) and -DEACTIVATE commands. */ if ((gtmsource_options.start && secondary) || gtmsource_options.activate) gtmsource_options.rootprimary = ROOTPRIMARY_SPECIFIED; if ((gtmsource_options.start && !secondary) || gtmsource_options.deactivate) gtmsource_options.rootprimary = PROPAGATEPRIMARY_SPECIFIED; } gtmsource_options.instsecondary = (CLI_PRESENT == cli_present("INSTSECONDARY")); if (gtmsource_options.instsecondary) { /* -INSTSECONDARY is specified in the command line. */ inst_name_len = SIZEOF(inst_name);; if (!cli_get_str("INSTSECONDARY", &inst_name[0], &inst_name_len)) { util_out_print("Error parsing INSTSECONDARY qualifier", TRUE); return(-1); } } else { /* Check if environment variable "gtm_repl_instsecondary" is defined. * Do that only if any of the following qualifiers is present as these are the only ones that honour it. * Mandatory : START, ACTIVATE, DEACTIVATE, STOPSOURCEFILTER, CHANGELOG, STATSLOG, NEEDRESTART, * Optional : CHECKHEALTH, SHOWBACKLOG or SHUTDOWN */ if (gtmsource_options.start || gtmsource_options.activate || gtmsource_options.deactivate || gtmsource_options.stopsourcefilter || gtmsource_options.changelog || gtmsource_options.statslog || gtmsource_options.needrestart || gtmsource_options.checkhealth || gtmsource_options.showbacklog || gtmsource_options.shut_down) { log_nam.addr = GTM_REPL_INSTSECONDARY; log_nam.len = SIZEOF(GTM_REPL_INSTSECONDARY) - 1; trans_name.addr = &inst_name[0]; if (SS_NORMAL == (status = TRANS_LOG_NAME(&log_nam, &trans_name, inst_name, SIZEOF(inst_name), do_sendmsg_on_log2long))) { gtmsource_options.instsecondary = TRUE; inst_name_len = trans_name.len; } else if (!gtmsource_options.checkhealth && !gtmsource_options.showbacklog && !gtmsource_options.shut_down) { if (SS_LOG2LONG == status) gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(5) ERR_LOGTOOLONG, 3, log_nam.len, log_nam.addr, SIZEOF(inst_name) - 1); gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(1) ERR_REPLINSTSECUNDF); return (-1); } } } if (gtmsource_options.instsecondary) { /* Secondary instance name specified either through -INSTSECONDARY or "gtm_repl_instsecondary" */ inst_name[inst_name_len] = '\0'; if ((MAX_INSTNAME_LEN <= inst_name_len) || (0 == inst_name_len)) { gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(4) ERR_REPLINSTSECLEN, 2, inst_name_len, inst_name); return (-1); } assert((inst_name_len + 1) <= MAX_INSTNAME_LEN); memcpy(gtmsource_options.secondary_instname, inst_name, inst_name_len + 1); /* copy terminating '\0' as well */ } if (gtmsource_options.start || gtmsource_options.activate) { if (secondary) { secondary_len = MAX_SECONDARY_LEN; if (!cli_get_str("SECONDARY", secondary_sys, &secondary_len)) { util_out_print("Error parsing SECONDARY qualifier", TRUE); return(-1); } /* Parse secondary_sys into secondary_host * and secondary_port */ c = secondary_sys; dotted_notation = TRUE; if ('[' == *c) { ip_end = strchr(++c, ']'); if (NULL == ip_end || 0 == (index = ip_end - c)) { util_out_print("Invalid IP address !AD", TRUE, LEN_AND_STR(secondary_sys)); return(-1); } memcpy(gtmsource_options.secondary_host, c, index); gtmsource_options.secondary_host[index] = '\0'; c = ip_end + 1; } else { while(*c && (':' != *c)) gtmsource_options.secondary_host[index++] = *c++; gtmsource_options.secondary_host[index] = '\0'; } if (':' != *c) { util_out_print("Secondary port number should be specified", TRUE); return(-1); } port_len = strlen(++c); errno = 0; if (((0 == (gtmsource_options.secondary_port = ATOI(c))) && (0 != errno)) || (0 >= gtmsource_options.secondary_port)) { util_out_print("Error parsing secondary port number !AD", TRUE, LEN_AND_STR(c)); return(-1); } } if (CLI_PRESENT == cli_present("CONNECTPARAMS")) { connect_parms_str_len = GTMSOURCE_CONN_PARMS_LEN + 1; if (!cli_get_str("CONNECTPARAMS", tmp_connect_parms_str, &connect_parms_str_len)) { util_out_print("Error parsing CONNECTPARAMS qualifier", TRUE); return(-1); } #ifdef VMS /* strip the quotes around the string. (DCL doesn't do it) */ assert('"' == tmp_connect_parms_str[0]); assert('"' == tmp_connect_parms_str[connect_parms_str_len - 1]); connect_parms_str = &tmp_connect_parms_str[1]; tmp_connect_parms_str[connect_parms_str_len - 1] = '\0'; #else connect_parms_str = &tmp_connect_parms_str[0]; #endif for (connect_parms_index = GTMSOURCE_CONN_HARD_TRIES_COUNT, connect_parms_badval = FALSE, connect_parm_token_str = connect_parms_str; !connect_parms_badval && connect_parms_index < GTMSOURCE_CONN_PARMS_COUNT && (connect_parm = strtok(connect_parm_token_str, GTMSOURCE_CONN_PARMS_DELIM)) != NULL; connect_parms_index++, connect_parm_token_str = NULL) { errno = 0; if ((0 == (gtmsource_options.connect_parms[connect_parms_index] = ATOI(connect_parm)) && 0 != errno) || 0 >= gtmsource_options.connect_parms[connect_parms_index]) connect_parms_badval = TRUE; } if (connect_parms_badval) { util_out_print("Error parsing or invalid value parameter in CONNECTPARAMS", TRUE); return(-1); } if (GTMSOURCE_CONN_PARMS_COUNT != connect_parms_index) { util_out_print( "All CONNECTPARAMS - HARD TRIES, HARD TRIES PERIOD, " "SOFT TRIES PERIOD, " "ALERT TIME, HEARTBEAT INTERVAL, " "MAX HEARBEAT WAIT should be specified", TRUE); return(-1); } } else { gtmsource_options.connect_parms[GTMSOURCE_CONN_HARD_TRIES_COUNT] = REPL_CONN_HARD_TRIES_COUNT; gtmsource_options.connect_parms[GTMSOURCE_CONN_HARD_TRIES_PERIOD] = REPL_CONN_HARD_TRIES_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_SOFT_TRIES_PERIOD] = REPL_CONN_SOFT_TRIES_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_ALERT_PERIOD] = REPL_CONN_ALERT_ALERT_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_PERIOD] = REPL_CONN_HEARTBEAT_PERIOD; gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_MAX_WAIT] = REPL_CONN_HEARTBEAT_MAX_WAIT; } if (gtmsource_options.connect_parms[GTMSOURCE_CONN_ALERT_PERIOD]< gtmsource_options.connect_parms[GTMSOURCE_CONN_SOFT_TRIES_PERIOD]) gtmsource_options.connect_parms[GTMSOURCE_CONN_ALERT_PERIOD] = gtmsource_options.connect_parms[GTMSOURCE_CONN_SOFT_TRIES_PERIOD]; if (gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_MAX_WAIT] < gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_PERIOD]) gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_MAX_WAIT] = gtmsource_options.connect_parms[GTMSOURCE_CONN_HEARTBEAT_PERIOD]; } if (gtmsource_options.start || gtmsource_options.statslog || gtmsource_options.changelog || gtmsource_options.activate) { log = (cli_present("LOG") == CLI_PRESENT); log_interval_specified = (CLI_PRESENT == cli_present("LOG_INTERVAL")); if (log) { log_file_len = MAX_FN_LEN + 1; if (!cli_get_str("LOG", gtmsource_options.log_file, &log_file_len)) { util_out_print("Error parsing LOG qualifier", TRUE); return(-1); } } else gtmsource_options.log_file[0] = '\0'; gtmsource_options.src_log_interval = 0; if (log_interval_specified) { if (!cli_get_num("LOG_INTERVAL", (int4 *)>msource_options.src_log_interval)) { util_out_print("Error parsing LOG_INTERVAL qualifier", TRUE); return (-1); } } if (gtmsource_options.start && 0 == gtmsource_options.src_log_interval) gtmsource_options.src_log_interval = LOGTRNUM_INTERVAL; /* For changelog/activate, interval == 0 implies don't change log interval already established */ /* We ignore interval specification for statslog, Vinaya 2005/02/07 */ } if (gtmsource_options.start) { assert(secondary || CLI_PRESENT == cli_present("PASSIVE")); gtmsource_options.mode = ((secondary) ? GTMSOURCE_MODE_ACTIVE : GTMSOURCE_MODE_PASSIVE); if (CLI_PRESENT == cli_present("BUFFSIZE")) { if (!cli_get_int("BUFFSIZE", >msource_options.buffsize)) { util_out_print("Error parsing BUFFSIZE qualifier", TRUE); return(-1); } if (MIN_JNLPOOL_SIZE > gtmsource_options.buffsize) gtmsource_options.buffsize = MIN_JNLPOOL_SIZE; } else gtmsource_options.buffsize = DEFAULT_JNLPOOL_SIZE; /* Round up buffsize to the nearest (~JNL_WRT_END_MASK + 1) multiple */ gtmsource_options.buffsize = ((gtmsource_options.buffsize + ~JNL_WRT_END_MASK) & JNL_WRT_END_MASK); if (CLI_PRESENT == cli_present("FILTER")) { filter_cmd_len = MAX_FILTER_CMD_LEN; if (!cli_get_str("FILTER", gtmsource_options.filter_cmd, &filter_cmd_len)) { util_out_print("Error parsing FILTER qualifier", TRUE); return(-1); } } else gtmsource_options.filter_cmd[0] = '\0'; /* Check if compression level is specified */ if (CLI_PRESENT == cli_present("CMPLVL")) { if (!cli_get_int("CMPLVL", >msource_options.cmplvl)) { util_out_print("Error parsing CMPLVL qualifier", TRUE); return(-1); } if (GTM_CMPLVL_OUT_OF_RANGE(gtmsource_options.cmplvl)) gtmsource_options.cmplvl = ZLIB_CMPLVL_MIN; /* no compression in this case */ /* CMPLVL qualifier should override any value specified in the environment variable gtm_zlib_cmp_level */ gtm_zlib_cmp_level = gtmsource_options.cmplvl; } else gtmsource_options.cmplvl = ZLIB_CMPLVL_MIN; /* no compression in this case */ /* Check if SSL/TLS secure communication is requested. */ # ifdef GTM_TLS if (CLI_PRESENT == cli_present("TLSID")) { tlsid_len = MAX_TLSID_LEN; if (!cli_get_str("TLSID", repl_tls.id, &tlsid_len)) { util_out_print("Error parsing TLSID qualifier", TRUE); return -1; } assert(0 < tlsid_len); if (CLI_PRESENT == cli_present("RENEGOTIATE_INTERVAL")) { if (!cli_get_int("RENEGOTIATE_INTERVAL", &renegotiate_interval)) { util_out_print("Error parsing RENEGOTIATE_INTERVAL qualifier", TRUE); return -1; } if (0 > renegotiate_interval) { util_out_print("Negative values are not allowed for RENEGOTIATE_INTERVAL qualifier", TRUE); return -1; } else if ((0 < renegotiate_interval) && (renegotiate_interval < MIN_RENEGOTIATE_TIMEOUT)) renegotiate_interval = MIN_RENEGOTIATE_TIMEOUT; renegotiate_interval = renegotiate_interval * 60; /* Convert to seconds. */ } else renegotiate_interval = DEFAULT_RENEGOTIATE_TIMEOUT * 60; /* Convert to seconds. */ /* Convert renegotiate_interval to heartbeat units (# of 8 second intervals). */ renegotiate_interval = DIVIDE_ROUND_UP(renegotiate_interval, HEARTBEAT_INTERVAL_IN_SECS); gtmsource_options.renegotiate_interval = renegotiate_interval; /* Check if plaintext-fallback mode is specified. Default option is NOPLAINTEXTFALLBACK. */ if (CLI_PRESENT == (plaintext_fallback = cli_present("PLAINTEXTFALLBACK"))) repl_tls.plaintext_fallback = (plaintext_fallback != CLI_NEGATED); else repl_tls.plaintext_fallback = FALSE; } # endif } if (gtmsource_options.shut_down) { if ((timeout_status = cli_present("TIMEOUT")) == CLI_PRESENT) { if (!cli_get_int("TIMEOUT", >msource_options.shutdown_time)) { util_out_print("Error parsing TIMEOUT qualifier", TRUE); return(-1); } if (DEFAULT_SHUTDOWN_TIMEOUT < gtmsource_options.shutdown_time || 0 > gtmsource_options.shutdown_time) { gtmsource_options.shutdown_time = DEFAULT_SHUTDOWN_TIMEOUT; util_out_print("shutdown TIMEOUT changed to !UL", TRUE, gtmsource_options.shutdown_time); } } else if (CLI_NEGATED == timeout_status) gtmsource_options.shutdown_time = -1; else /* TIMEOUT not specified */ gtmsource_options.shutdown_time = DEFAULT_SHUTDOWN_TIMEOUT; } if (gtmsource_options.statslog) { statslog_val_len = 4; /* max(strlen("ON"), strlen("OFF")) + 1 */ if (!cli_get_str("STATSLOG", statslog_val, &statslog_val_len)) { util_out_print("Error parsing STATSLOG qualifier", TRUE); return(-1); } UNIX_ONLY(cli_strupper(statslog_val);) if (0 == STRCMP(statslog_val, "ON"))
bool CChar::NPC_OnHearPetCmdTarg(int iCmd, CChar *pSrc, CObjBase *pObj, const CPointMap &pt, LPCTSTR pszArgs) { ADDTOCALLSTACK("CChar::NPC_OnHearPetCmdTarg"); // Pet commands that required a target. if ( m_fIgnoreNextPetCmd ) { m_fIgnoreNextPetCmd = false; return false; } if ( !NPC_PetCheckAccess(iCmd, pSrc) ) return true; bool bSuccess = false; CItem *pItemTarg = dynamic_cast<CItem *>(pObj); CChar *pCharTarg = dynamic_cast<CChar *>(pObj); switch ( iCmd ) { case PC_ATTACK: case PC_KILL: { if ( !pCharTarg || (pCharTarg == this) || (pCharTarg == pSrc) ) break; bSuccess = pCharTarg->OnAttackedBy(pSrc, true); if ( bSuccess ) bSuccess = Fight_Attack(pCharTarg, true); break; } case PC_FOLLOW: if ( !pCharTarg || (pCharTarg == this) ) break; m_Act_Targ = pCharTarg->GetUID(); bSuccess = Skill_Start(NPCACT_FOLLOW_TARG); break; case PC_FRIEND: { if ( !pCharTarg || !pCharTarg->m_pPlayer || (pCharTarg == pSrc) ) { Speak(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_CONFUSED)); break; } CItemMemory *pMemory = Memory_FindObjTypes(pCharTarg, MEMORY_FRIEND); if ( pMemory ) { pSrc->SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_FRIEND_ALREADY)); break; } pSrc->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_FRIEND_SUCCESS1), GetName(), pCharTarg->GetName()); pCharTarg->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_FRIEND_SUCCESS2), pSrc->GetName(), GetName()); Memory_AddObjTypes(pCharTarg, MEMORY_FRIEND); m_Act_Targ = pCharTarg->GetUID(); bSuccess = Skill_Start(NPCACT_FOLLOW_TARG); break; } case PC_UNFRIEND: { if ( !pCharTarg || !pCharTarg->m_pPlayer ) { Speak(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_CONFUSED)); break; } CItemMemory *pMemory = Memory_FindObjTypes(pCharTarg, MEMORY_FRIEND); if ( !pMemory ) { pSrc->SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_UNFRIEND_NOTFRIEND)); break; } pSrc->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_UNFRIEND_SUCCESS1), GetName(), pCharTarg->GetName()); pCharTarg->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_UNFRIEND_SUCCESS2), pSrc->GetName(), GetName()); pMemory->Delete(); m_Act_Targ = pSrc->GetUID(); bSuccess = Skill_Start(NPCACT_FOLLOW_TARG); break; } case PC_GO: if ( !pt.IsValidPoint() ) break; m_Act_p = pt; bSuccess = Skill_Start(NPCACT_GOTO); break; case PC_GUARD: if ( !pCharTarg || (pCharTarg == this) ) break; pCharTarg->SysMessagef(g_Cfg.GetDefaultMsg(DEFMSG_NPC_PET_TARG_GUARD_SUCCESS), GetName()); m_Act_Targ = pCharTarg->GetUID(); bSuccess = Skill_Start(NPCACT_GUARD_TARG); break; case PC_TRANSFER: if ( !pCharTarg || !pCharTarg->m_pClient ) break; if ( IsSetOF(OF_PetSlots) ) { if ( !pCharTarg->FollowersUpdate(this, static_cast<short>(maximum(1, GetDefNum("FOLLOWERSLOTS", true))), true) ) { pSrc->SysMessageDefault(DEFMSG_PETSLOTS_TRY_TRANSFER); break; } } bSuccess = NPC_PetSetOwner(pCharTarg); break; case PC_PRICE: if ( !pItemTarg || !NPC_IsVendor() || !pSrc->m_pClient ) break; if ( IsDigit(pszArgs[0]) ) // did they name a price return NPC_SetVendorPrice(pItemTarg, ATOI(pszArgs)); if ( !NPC_SetVendorPrice(pItemTarg, -1) ) // test if it can be priced return false; pSrc->m_pClient->addPromptConsole(CLIMODE_PROMPT_VENDOR_PRICE, g_Cfg.GetDefaultMsg(DEFMSG_NPC_VENDOR_SETPRICE_2), pItemTarg->GetUID(), GetUID()); return true; default: break; } // Make some sound to confirm we heard it NPC_PetConfirmCommand(bSuccess, pSrc); return bSuccess; }
int main (int argc, char *argv[]) { int i, j; char s[81]; int sem, semval, semncnt, semzcnt, sempid; struct sembuf sop; struct semid_ds semstat; union semun semarg; if (argc == 1) { usage(argv[0]); exit(1); } semarg.buf = &semstat; for(i=1; i< argc; i++) { sem = ATOI(argv[i]); if ( semctl(sem, 0, IPC_STAT, semarg) == -1 ) { FPRINTF(stderr, "Error obtaining semaphore status.\n"); SPRINTF(s, "semctl(%d)", sem); PERROR(s); continue; } PRINTF("semid %d: %hu semaphores in the set\n", sem, (unsigned short int)semarg.buf->sem_nsems); for(j=0; j < semarg.buf->sem_nsems; j++) { if ( (semval = semctl(sem, j, GETVAL)) == -1 ) { FPRINTF(stderr, "Error obtaining semaphore %d value.\n", j); SPRINTF(s, "semctl(%d)", sem); PERROR(s); continue; } PRINTF("sem %d: (semval=%d, ", j, semval); if ( (semncnt = semctl(sem, j, GETNCNT)) == -1 ) { FPRINTF(stderr, "\nError obtaining semaphore %d ncnt.\n", j); SPRINTF(s, "semctl(%d)", sem); PERROR(s); continue; } PRINTF("semncnt=%d, ", semncnt); if ( (semzcnt = semctl(sem, j, GETZCNT)) == -1 ) { FPRINTF(stderr, "\nError obtaining semaphore %d zcnt.\n", j); SPRINTF(s, "semctl(%d)", sem); PERROR(s); continue; } PRINTF("semzcnt=%d, ", semzcnt); if ( (sempid= semctl(sem, j, GETPID)) == -1 ) { FPRINTF(stderr, "\nError obtaining semaphore %d PID.\n", j); SPRINTF(s, "semctl(%d)", sem); PERROR(s); continue; } PRINTF("sempid=%d)\n", sempid); } } exit(0); }
rc_t MYSQLRecord::get_data(uint32_t idx, float_t* val) { CHECK_FIELD; (*val) = (float_t)ATOI(*(m_row + idx)); return RC_S_OK; }
bool CResourceDef::MakeResourceName() { ADDTOCALLSTACK("CResourceDef::MakeResourceName"); if ( m_pDefName ) return true; LPCTSTR pszName = GetName(); GETNONWHITESPACE( pszName ); TCHAR * pbuf = Str_GetTemp(); TCHAR ch; TCHAR * pszDef; strcpy(pbuf, "a_"); LPCTSTR pszKey = NULL; // auxiliary, the key of a similar CVarDef, if any found pszDef = pbuf + 2; for ( ; *pszName; pszName++ ) { ch = *pszName; if ( ch == ' ' || ch == '\t' || ch == '-' ) ch = '_'; else if ( !isalnum( ch ) ) continue; // collapse multiple spaces together if ( ch == '_' && *(pszDef-1) == '_' ) continue; *pszDef = ch; pszDef++; } *pszDef = '_'; *(++pszDef) = '\0'; size_t iMax = g_Exp.m_VarDefs.GetCount(); int iVar = 1; size_t iLen = strlen( pbuf ); for ( size_t i = 0; i < iMax; i++ ) { // Is this a similar key? pszKey = g_Exp.m_VarDefs.GetAt(i)->GetKey(); if ( strnicmp( pbuf, pszKey, iLen ) != 0 ) continue; // skip underscores pszKey = pszKey + iLen; while ( *pszKey == '_' ) pszKey++; // Is this is subsequent key with a number? Get the highest (plus one) if ( IsStrNumericDec( pszKey ) ) { int iVarThis = ATOI( pszKey ); if ( iVarThis >= iVar ) iVar = iVarThis + 1; } else iVar++; } // add an extra _, hopefully won't conflict with named areas sprintf( pszDef, "_%i", iVar ); SetResourceName( pbuf ); // Assign name return true; }
/* parse given command line and initialize NaClApp object */ static void ParseCommandLine(struct NaClApp *nap, int argc, char **argv) { int opt; char *manifest_name = NULL; /* set defaults */ nap->skip_qualification = 0; nap->quit_after_load = 0; nap->handle_signals = 1; nap->storage_limit = ZEROVM_IO_LIMIT; /* construct zlog with default verbosity */ ZLogCtor(LOG_ERROR); /* todo(d'b): revise switches and rename them */ while((opt = getopt(argc, argv, "+FeQsSv:M:l:")) != -1) { switch(opt) { case 'M': manifest_name = optarg; break; case 's': nap->skip_validator = 1; ZLOG(LOG_ERROR, "validation disabled by -s"); break; case 'F': nap->quit_after_load = 1; break; case 'e': TagEngineCtor(); nap->user_tag = TagCtor(); break; case 'S': /* d'b: disable signals handling */ nap->handle_signals = 0; break; case 'l': /* calculate hard limit in Gb and don't allow it less then "big enough" */ nap->storage_limit = ATOI(optarg) * ZEROVM_IO_LIMIT_UNIT; ZLOGFAIL(nap->storage_limit < ZEROVM_IO_LIMIT_UNIT, EFAULT, "invalid storage limit: %d", nap->storage_limit); break; case 'v': ZLogDtor(); ZLogCtor(ATOI(optarg)); break; case 'Q': nap->skip_qualification = 1; ZLOGS(LOG_ERROR, "PLATFORM QUALIFICATION DISABLED BY -Q - " "Native Client's sandbox will be unreliable!"); break; default: ZLOGS(LOG_ERROR, "ERROR: unknown option: [%c]", opt); puts(HELP_SCREEN); exit(EINVAL); break; } } /* show zerovm command line */ ZVMCommandLine(argc, argv); /* parse manifest file specified in cmdline */ if(manifest_name == NULL) { puts(HELP_SCREEN); exit(EINVAL); } ZLOGFAIL(ManifestCtor(manifest_name), EFAULT, "Invalid manifest '%s'", manifest_name); /* set available nap and manifest fields */ assert(nap->system_manifest != NULL); nap->system_manifest->nexe = GetValueByKey("Nexe"); ZLOGFAIL(GetFileSize(nap->system_manifest->nexe) < 0, ENOENT, "nexe open error"); syscallback = 0; }
int WasabiVersion::versionStringToInt(const char *str) { if (str == NULL) return 0; PathParser pp(str, ","); return ATOI(pp.enumString(3)); }
int http_transfer(UrlResource *rsrc, libnet_callback notify) { FILE *out = NULL; Url *u = NULL; Url *proxy_url = NULL; Url *redir_u = NULL; char *request = NULL; //char *raw_header = NULL; HttpHeader *header = NULL; //char *len_string = NULL; //char *new_location = NULL; char *tmp_string = NULL; //char buf[BUFSIZE]; int sock = -1; ssize_t bytes_read = 0; int msg_code = 0; int retval = 0; int i; char *buf = MALLOC(BUFSIZE); if (!buf) { LIBNET_DEBUG("No enough memory!\n"); return 0; } /* make sure we haven't recursed too much */ if ( redirect_count > REDIRECT_MAX ) { LIBNET_DEBUG("redirection max count exceeded (looping redirect?)"); redirect_count = 0; msg_code = -NET_ERR_CONNECT_FAILED; goto cleanup; } /* make sure everything's initialized to something useful */ u = rsrc->url; if ( !u->host ) { LIBNET_DEBUG("no host specified"); msg_code = -NET_ERR_CONNECT_FAILED; goto cleanup; } /* fill in proxyness */ if ( !rsrc->proxy ) { rsrc->proxy = get_proxy("HTTP_PROXY"); } if (( NULL == rsrc->outfile ) && (NULL == rsrc->buffer)) { if ( u->file ) rsrc->outfile = strdup(u->file); else rsrc->outfile = strdup("index.html"); } if ( !u->path ) u->path = strdup("/"); if ( !u->file ) u->file = strdup(""); /* funny looking */ if ( !u->port ) u->port = 80; rsrc->options |= default_opts; /* send the request to either the proxy or the remote host */ if ( rsrc->proxy ) { proxy_url = url_new(); url_init(proxy_url, rsrc->proxy); if ( !proxy_url->port ) proxy_url->port = 80; if ( !proxy_url->host ) { LIBNET_DEBUG( "bad proxy `%s'", rsrc->proxy); msg_code = -NET_ERR_CONNECT_FAILED; goto cleanup; } if ( proxy_url->username ) rsrc->proxy_username = strdup(proxy_url->username); if ( proxy_url->password ) rsrc->proxy_password = strdup(proxy_url->password); #ifdef LIB_W5300 sock = w5300_tcp_connect(proxy_url->host, proxy_url->port, rsrc->srcip, rsrc->srcport); #else sock = util_tcp_connect(proxy_url->host, proxy_url->port); #endif if (sock < 0) { msg_code = -NET_ERR_CONNECT_FAILED; goto cleanup; } safe_free(u->path); safe_free(u->file); u->path = strdup(""); u->file = strdup(u->full_url); request = get_request(rsrc); LIBNET_DEBUG("sending request:\n%s", request); S_WRITE(sock, request, STRLEN(request)); FREE(request); } else /* no proxy */ { #ifdef LIB_W5300 sock = w5300_tcp_connect(u->host, u->port, rsrc->srcip, rsrc->srcport); #else sock = util_tcp_connect(u->host, u->port); #endif if (sock < 0) { msg_code = -NET_ERR_CONNECT_FAILED; goto cleanup; } request = get_request(rsrc); LIBNET_DEBUG("sending request:\n%s", request); S_WRITE(sock, request, STRLEN(request)); FREE(request); } if (rsrc->outfile) { if ((get_file_size(rsrc->outfile) > 0) && (rsrc->options & OPT_RESUME)) out = fopen(rsrc->outfile, "rb+"); else out = fopen(rsrc->outfile, "wb"); if ( !out ) { LIBNET_DEBUG( "opening %s: %s", rsrc->outfile, ""); msg_code = -NET_ERR_FILE_SAVE_ERROR; goto cleanup; } } /* check to see if it returned a HTTP 1.x response */ MEMSET(buf, '\0', 5); #ifdef LIB_W5300 bytes_read = S_READ(sock, buf, BUFSIZE); buf[bytes_read] = '\0'; LIBNET_DEBUG("receive respond:(%d)\n%s", bytes_read, buf); #else bytes_read = S_READ(sock, buf, 8); #endif if ( bytes_read <= 0 ) { msg_code = -NET_ERR_HTTP_SERVER_ERROR; goto cleanup; } if ( ! (buf[0] == 'H' && buf[1] == 'T' && buf[2] == 'T' && buf[3] == 'P') ) { if((rsrc->options & OPT_RESUME) && rsrc->outfile_offset) { LIBNET_DEBUG("server does not support resume!"); msg_code = -NET_ERR_OPERATION_NOT_PERMIT; goto cleanup; } //fwrite(buf, bytes_read, 1,out); } else { /* skip the header */ #ifdef LIB_W5300 buf[bytes_read] = '\0'; #else char *raw_header1 = NULL; buf[bytes_read] = '\0'; raw_header1 = get_raw_header(sock); strconcat2(buf, raw_header1, NULL); FREE(raw_header1); LIBNET_DEBUG("receive respond:(%d)\n%s", bytes_read, buf); #endif header = make_http_header(buf); /* check for redirects */ tmp_string = get_header_value("location", header); if (buf[9] == '3' && tmp_string ) { #if 1 //diable redirec function redir_u = url_new(); /* make sure we still send user/password along */ redir_u->username = safe_strdup(u->username); redir_u->password = safe_strdup(u->password); url_init(redir_u, tmp_string); rsrc->url = redir_u; redirect_count++; //retval = transfer(rsrc, notify); transfer((UINT32)rsrc, (UINT32)notify); rsrc->url =u; redirect_count--; if(redirect_count<0) redirect_count=0; if (redir_u) { url_destroy(redir_u); FREE(redir_u); } #endif FREE(tmp_string); tmp_string = NULL; //msg_code = -NET_ERR_OPERATION_NOT_PERMIT;//we can support redirect now, remove this line. goto cleanup; } if (tmp_string) { FREE(tmp_string); tmp_string = NULL; } if (buf[9] == '4' || buf[9] == '5') { for (i = 0; buf[i] && buf[i] != '\n'; i++); buf[i] = '\0'; LIBNET_DEBUG("HTTP error from server: %s\n", buf); if( buf[9] == '4' && buf[10] == '0' && buf[11] == '4') msg_code = -NET_ERR_FILE_NOT_FOUND; else msg_code = -NET_ERR_HTTP_SERVER_ERROR; goto cleanup; } tmp_string = get_header_value("content-length", header); if (tmp_string) { rsrc->outfile_size = (off_t )ATOI(tmp_string); FREE(tmp_string); tmp_string = NULL; if(rsrc->use_pecache ==0) { if ((rsrc->buffer) && (rsrc->buffer_len < rsrc->outfile_size)) { LIBNET_DEBUG("the buffer length less than the file fize (%d < %d)\n", rsrc->buffer, (int)rsrc->outfile_size); msg_code = -NET_ERR_FILE_SAVE_ERROR; goto cleanup; } } } tmp_string = get_header_value("content-range", header); if (tmp_string) { FREE(tmp_string); tmp_string = NULL; rsrc->outfile_size += rsrc->outfile_offset; } if ((!rsrc->outfile_size) && (rsrc->options & OPT_RESUME) && !(rsrc->options & OPT_NORESUME) && rsrc->outfile_offset ) { LIBNET_DEBUG("unable to determine remote file size"); msg_code = -NET_ERR_FILE_SAVE_ERROR; goto cleanup; } } if(rsrc->use_pecache ==0) retval = dump_data(rsrc, sock, out, notify); else retval = dump_data_to_pecache(rsrc, sock, out, notify); cleanup: free_http_header(header); //if (raw_header) // FREE(raw_header); if (proxy_url) { url_destroy(proxy_url); FREE(proxy_url); } if (sock >= 0) { S_CLOSE(sock); } if (out) fclose(out); if (buf) { FREE(buf); } #ifndef WIN32 if (rsrc->outfile) fs_sync(rsrc->outfile); #endif if (msg_code < 0 && rsrc->running) { notify(NET_MSG_DOWNLOAD_FINISH, (UINT32)msg_code); libnet_abort_url_read(TRUE);//to break url_open while loop //retval!=1 means transfer fail } return retval; }
bool CWebPageDef::ServPagePost( CClient * pClient, LPCTSTR pszURLArgs, TCHAR * pContentData, int iContentLength ) { ADDTOCALLSTACK("CWebPageDef::ServPagePost"); UNREFERENCED_PARAMETER(pszURLArgs); // RETURN: true = this was the page of interest. ASSERT(pClient); if ( pContentData == NULL || iContentLength <= 0 ) return( false ); if ( ! HasTrigger(XTRIG_UNKNOWN)) // this form has no triggers. return( false ); // Parse the data. pContentData[iContentLength] = 0; TCHAR * ppArgs[64]; size_t iArgs = Str_ParseCmds(pContentData, ppArgs, COUNTOF(ppArgs), "&"); if (( iArgs <= 0 ) || ( iArgs >= 63 )) return false; // T or TXT or TEXT = the text fields. // B or BTN or BUTTON = the buttons // C or CHK or CHECK = the check boxes CDialogResponseArgs resp; DWORD dwButtonID = ULONG_MAX; for ( size_t i = 0; i < iArgs; i++ ) { TCHAR * pszNum = ppArgs[i]; while ( IsAlpha(*pszNum) ) pszNum++; int iNum = ATOI(pszNum); while ( *pszNum ) { if ( *pszNum == '=' ) { pszNum++; break; } pszNum++; } switch ( toupper(ppArgs[i][0]) ) { case 'B': dwButtonID = iNum; break; case 'C': if ( !iNum ) continue; if ( ATOI(pszNum) ) { resp.m_CheckArray.Add( iNum ); } break; case 'T': if ( iNum > 0 ) { TCHAR *pszData = Str_GetTemp(); HtmlDeCode( pszData, pszNum ); resp.AddText(static_cast<WORD>(iNum), pszData); } break; } } // Use the data in RES_WEBPAGE block. CResourceLock s; if ( !ResourceLock(s) ) return false; // Find the correct entry point. while ( s.ReadKeyParse()) { if ( !s.IsKeyHead("ON", 2) || ( (DWORD)s.GetArgVal() != dwButtonID )) continue; OnTriggerRunVal(s, TRIGRUN_SECTION_TRUE, pClient, &resp); return true; } // Put up some sort of failure page ? return( false ); }
/** * @brief This function processes the add port to IGD(Internet Gateway Device). * @return 0: success, -2: Invalid UPnP Step, -1: reply packet timeout, 1: received xml parse error, other: UPnP error code */ signed short AddPortProcess( SOCKET sockfd, /**< a socket number. */ const char* protocol, /**< a procotol name. "TCP" or "UDP" */ const unsigned int extertnal_port, /**< an external port number. */ const char* internal_ip, /**< an internal ip address. */ const unsigned int internal_port, /**< an internal port number. */ const char* description /**< a description of this portforward. */ ) { short len=0; long endTime=0; uint32 ipaddr; uint16 port; // Check UPnP Step if(UPnP_Step < 2) return -2; // Make "Add Port" XML(SOAP) memset(content, '\0', MAX_BUFFER); MakeSOAPAddControl(content, protocol, extertnal_port, internal_ip, internal_port, description); // Make HTTP POST Header memset(send_buffer, '\0', MAX_BUFFER); len = strlen(content); MakePOSTHeader(send_buffer, len, ADD_PORT); strcat(send_buffer, content); #ifdef UPNP_DEBUG printf("%s\r\n", send_buffer); #endif ipaddr = inet_addr((uint8*)descIP); ipaddr = swapl(ipaddr); port = ATOI(descPORT, 10); // Connect to IGD(Internet Gateway Device) if(TCPClientOpen(sockfd, PORT_UPNP, (uint8*)&ipaddr, port) == FAIL) printf("TCP Socket Error!!\r\n"); // Send "Add Port" Message while(GetTCPSocketStatus(sockfd) != STATUS_ESTABLISHED); TCPSend(sockfd, (void *)send_buffer, strlen(send_buffer)); // Receive Reply memset(recv_buffer, '\0', MAX_BUFFER); Delay_ms(500); endTime = my_time + 3; while (TCPRecv(sockfd, (void *)recv_buffer, MAX_BUFFER) <= 0 && my_time < endTime); // Check Receive Buffer of W5200 if(my_time >= endTime){ // Check Timeout TCPClose(sockfd); return -1; } // TCP Socket Close TCPClose(sockfd); #ifdef UPNP_DEBUG printf("\r\nReceiveData\r\n%s\r\n", recv_buffer); #endif // Parse Replied Message return parseAddPort(recv_buffer); }