void VtkColorLookupTable::Build() { double range[2]; this->GetTableRange(range); const double interval = range[1]-range[0]; this->SetNumberOfTableValues(ceil(interval)+1); // const vtkIdType nColours = this->GetNumberOfTableValues(); if (!_dict.empty()) { // make sure that color map starts with the first color in the dictionary unsigned char startcolor[4] = { 0, 0 , 0 , 0 }; std::pair<std::size_t, unsigned char*> lastValue(0, startcolor); std::size_t nextIndex(0); for (std::map<double, unsigned char*>::const_iterator it = _dict.begin(); it != _dict.end(); ++it) { double val = (it->first < range[0]) ? range[0] : ((it->first > range[1]) ? range[1] : it->first); nextIndex = static_cast<std::size_t>( std::floor(val-range[0]) ); this->SetTableValueRGBA(nextIndex, it->second); if ( nextIndex - lastValue.first > 0 ) for (std::size_t i = lastValue.first + 1; i < nextIndex; i++) { unsigned char int_rgba[4]; double pos = (i - lastValue.first) / (static_cast<double>(nextIndex - lastValue.first)); if (_type == VtkColorLookupTable::LUTType::LINEAR) for (std::size_t j = 0; j < 4; j++) int_rgba[j] = linInterpolation( (lastValue.second)[j], (it->second)[j], pos); else if (_type == VtkColorLookupTable::LUTType::EXPONENTIAL) for (std::size_t j = 0; j < 4; j++) int_rgba[j] = expInterpolation((lastValue.second)[j], (it->second)[j], 0.2, pos); else // no interpolation for (std::size_t j = 0; j < 4; j++) int_rgba[j] = (lastValue.second)[j]; this->SetTableValueRGBA(i, int_rgba); } lastValue.first = nextIndex; lastValue.second = it->second; } } else vtkLookupTable::Build(); }
void checkauto() // Check automatic/timer controlled stuff (Like fighting and regeneration) { // static TIMERVAL checkspawnregions=0; static TIMERVAL checktempfx=0; static TIMERVAL checknpcs=0; static TIMERVAL checktamednpcs=0; static TIMERVAL checknpcfollow=0; static TIMERVAL checkitemstime=0; static TIMERVAL lighttime=0; static TIMERVAL htmltime=0; static TIMERVAL housedecaytimer=0; LOGICAL lightChanged = false; // // Accounts // if (SrvParms->auto_a_reload > 0 && TIMEOUT( Accounts->lasttimecheck + (SrvParms->auto_a_reload*60*MY_CLOCKS_PER_SEC) ) ) Accounts->CheckAccountFile(); // // Weather (change is handled by crontab) // // Calendar // if ( TIMEOUT( uotickcount ) ) { if (Calendar::advanceMinute()) day++; uotickcount=uiCurrentTime+secondsperuominute*MY_CLOCKS_PER_SEC; if (Calendar::g_nMinute%8==0) moon1=(UI08)((moon1+1)%8); if (Calendar::g_nMinute%3==0) moon2=(UI08)((moon2+1)%8); } // // Light // if( TIMEOUT( lighttime ) ) { UI08 lightLevel = worldcurlevel; SI32 timenow = (Calendar::g_nHour * 60) + Calendar::g_nMinute; SI32 dawntime = (Calendar::g_nCurDawnHour * 60) + Calendar::g_nCurDawnMin; SI32 sunsettime = (Calendar::g_nCurSunsetHour * 60) + Calendar::g_nCurSunsetMin; SI32 nighttime = qmin((sunsettime+120), (1439)); SI32 morntime = qmax((dawntime-120), (0)); SI32 const middaytime = 750; // SI32 const midnighttime = 0; // unused variable UI08 dawnlight = (UI08)((((worlddarklevel - worldbrightlevel))/3) + worldbrightlevel); // // default lights at dawn and sunset // if ( timenow == dawntime || timenow==sunsettime ) lightLevel = dawnlight; // // highest light at midday // else if( timenow == middaytime ) lightLevel = (UI08) qmax(worldbrightlevel-1, 0); // // darkest light during night // else if( timenow >= nighttime ) lightLevel = worlddarklevel; // else if( timenow <= morntime ) lightLevel = worlddarklevel; // // fading light slight before dawn // else if( timenow > morntime && timenow < dawntime ) lightLevel = (UI08)linInterpolation(morntime, worlddarklevel, dawntime, dawnlight, timenow); // // fading light slight from dawn to midday else if( timenow > dawntime && timenow < middaytime ) lightLevel = (UI08)linInterpolation(dawntime, dawnlight, middaytime, worldbrightlevel, timenow); // // fading light slight from midday to sunset // else if( timenow > middaytime && timenow < sunsettime ) lightLevel = (UI08)linInterpolation(middaytime, worldbrightlevel, sunsettime, dawnlight, timenow); // // fading light slight from sunset to night // else if( timenow > sunsettime && timenow < nighttime ) lightLevel = (UI08)linInterpolation(sunsettime, dawnlight, nighttime, worlddarklevel, timenow); if (wtype) lightLevel += 2; if (moon1+moon2<4) ++lightLevel; if (moon1+moon2<10) ++lightLevel; if (lightLevel != worldcurlevel) { worldcurlevel = lightLevel; lightChanged = true; } lighttime=uiCurrentTime+secondsperuominute*5*MY_CLOCKS_PER_SEC; } // // Housedecay and stabling // if ( TIMEOUT( housedecaytimer ) ) { ////////////////////// ///// check_houses ///////////////////// if( SrvParms->housedecay_secs != UINVALID ) cHouses::check_house_decay(); housedecaytimer = uiCurrentTime+MY_CLOCKS_PER_SEC*60*60; // check only each hour } // // Spawns // if( TIMEOUT( Spawns->check ) ) { Spawns->doSpawn(); } // // Shoprestock // Restocks->doRestock(); // // Prison release // prison::checkForFree(); // // Temporary effects // if( TIMEOUT( checktempfx ) ) tempfx::checktempeffects(); // // Characters & items // NxwSocketWrapper sw; sw.fillOnline(); for( sw.rewind(); !sw.isEmpty(); sw++ ) { NXWCLIENT ps = sw.getClient(); if( ps == NULL ) continue; P_CHAR pc=ps->currChar(); if( !ISVALIDPC( pc ) ) continue; if( lightChanged ) dolight(ps->toInt(),worldcurlevel); pc->heartbeat(); if( TIMEOUT( checknpcs ) || TIMEOUT( checktamednpcs ) || TIMEOUT( checknpcfollow ) ) { #ifdef SPAR_C_LOCATION_MAP PCHAR_VECTOR *pCV = pointers::getNearbyChars( pc, VISRANGE, pointers::NPC ); PCHAR_VECTOR it( pCV->begin() ), end( pCV->end() ); P_CHAR pNpc = 0; while( it != end ) { pNpc = (*it); if( pNpc->lastNpcCheck != uiCurrentTime && (TIMEOUT( checknpcs ) || (TIMEOUT( checktamednpcs ) && pNpc->tamed) || (TIMEOUT( checknpcfollow ) && pNpc->npcWander == WANDER_FOLLOW ) ) ) { pNpc->heartbeat(); pNpc->lastNpcCheck = uiCurrentTime; } ++it; } #else NxwCharWrapper sc; sc.fillCharsNearXYZ( pc->getPosition(), VISRANGE, true, false ); for( sc.rewind(); !sc.isEmpty(); sc++ ) { P_CHAR npc=sc.getChar(); if(!ISVALIDPC(npc) || !npc->npc ) continue; if( npc->lastNpcCheck != uiCurrentTime && (TIMEOUT( checknpcs ) || (TIMEOUT( checktamednpcs ) && npc->tamed) || (TIMEOUT( checknpcfollow ) && npc->npcWander == WANDER_FOLLOW ) ) ) { npc->heartbeat(); npc->lastNpcCheck = uiCurrentTime; } } #endif } if( TIMEOUT( checkitemstime ) ) { NxwItemWrapper si; si.fillItemsNearXYZ( pc->getPosition(), 2*VISRANGE, false ); for( si.rewind(); !si.isEmpty(); si++ ) { P_ITEM pi=si.getItem(); if( !ISVALIDPI( pi ) ) continue; pi->doDecay(); switch( pi->type ) { case 51 : case 52 : //if( TIMEOUT( pi->gatetime ) ) //for (int k=0;k<2;++k) Sparhawk what's this???? Let's comment it out for now // pi->deleteItem(); // bugfix for items disappearing //pi->deleteItem(); break; case 61 : case 62 : case 63 : case 64 : case 65 : case 69 : case 125 : break; //SPAWNERS may not decay!!! --> Sparhawk then don't use the decay tag in the script case 88 : if( pi->morey >= 0 && pi->morey < 25 ) if (pc->distFrom(pi)<=pi->morey) if( (UI32)RandomNum(1,100) <= pi->morez ) soundeffect4(ps->toInt(), pi, (UI16)pi->morex); break; } } } // Check boats extra, or else they will only be updated every CHECK_ITEMS time std::map<int,P_BOAT>::iterator iter_boat; for ( iter_boat= s_boat.begin();iter_boat != s_boat.end();iter_boat++) { P_BOAT boat=iter_boat->second; P_ITEM pi=boat->getShipLink(); if( pi->type2 == 1 || pi->type2 == 2 ) if( TIMEOUT( pi->gatetime ) ) { if (pi->type2==1) Boats->Move(ps->toInt(),pi->dir,pi); else { int dir=pi->dir+4; dir%=8; Boats->Move(ps->toInt(),dir,pi); } pi->gatetime=(TIMERVAL)(uiCurrentTime + (R64)(SrvParms->boatspeed*MY_CLOCKS_PER_SEC)); } } }//for i<now if( TIMEOUT( checkitemstime ) ) checkitemstime = (TIMERVAL)((R64) uiCurrentTime+(speed.itemtime*MY_CLOCKS_PER_SEC)); if( TIMEOUT( checknpcs ) ) checknpcs = (TIMERVAL)((R64) uiCurrentTime+(speed.npctime*MY_CLOCKS_PER_SEC)); if( TIMEOUT( checktamednpcs ) ) checktamednpcs=(TIMERVAL)((R64) uiCurrentTime+(speed.tamednpctime*MY_CLOCKS_PER_SEC)); if( TIMEOUT( checknpcfollow ) ) checknpcfollow=(TIMERVAL)((R64) uiCurrentTime+(speed.npcfollowtime*MY_CLOCKS_PER_SEC)); // // Html // if(SrvParms->html>0 && (htmltime<=uiCurrentTime )) { updatehtml(); htmltime=uiCurrentTime+(SrvParms->html*MY_CLOCKS_PER_SEC); } // // Finish // if ( TIMEOUT( nextfieldeffecttime ) ) nextfieldeffecttime = (TIMERVAL)((R64) uiCurrentTime + (0.5*MY_CLOCKS_PER_SEC)); if ( TIMEOUT( nextdecaytime ) ) nextdecaytime = uiCurrentTime + (15*MY_CLOCKS_PER_SEC); if( TIMEOUT( checktempfx ) ) checktempfx = (TIMERVAL)((R64) uiCurrentTime+(0.5*MY_CLOCKS_PER_SEC)); }