void SceneArchitecture::ArchitecTimer(const zRTime& ctv) { if(this->scene->IsGangScene()) { if(((GangScene *)scene)->GetGameStart() == 1) { //sky 刷兵倒记时间递减 SummonCountdown++; if(SummonCountdown >= SummonTime) { SummonCountdown = 0; if(!SummonNpc.empty()) { //sky 召唤 for(int i=0; i<3; i++) { summonSoldiers(SummonNpc[SummonLevel].id[i], Cmd::PET_TYPE_NOTPET, SummonNpc[SummonLevel].num[i], SummonAI); } } } if(_one_min(ctv)) { LevelUpCountdown++; if(LevelUpCountdown >= LevelUpTime) { LevelUpCountdown = 0; //sky 判断召唤等级是否是容器的极限 if(SummonLevel < (SummonNpc.size()-1)) SummonLevel++; //sky 否 把召唤等级提升 } } } } }
//sky 战场场景定时处理函数 void GangScene::GangSceneTime(const zRTime& ctv) { //sky 倒计时状态 if(GameStart == 2) { StartTime -= 1; //sky 时间结束 if(StartTime == 0) GameStart = 1; //sky 战场正式开始 } //sky 只有战场开始状态下才执行以下的处理 if(GameStart == 1) { //sky 处理用户的复活状况 reliveRun(); if(_one_min(ctv) && GameStart == 1) //sky 每过一分钟把时间流逝+1 passTime++; //sky 检测胜负状况 GetCampVictory(); //sky 处理胜负 CampVictoryRun(); } if(GameStart == 3) { //sky 开始战场结束倒计时 OverTime -= 1; if(OverTime == 0) { //sky 结束战场处理 OverBattGame(); } } }
/** * \brief 时间循环,发送定时事件,处理受影响npc ai等 */ void SceneTimeTick::run() { const int timeout_value = 500; const int timeout_value2 = 300; DWORD step = 0; int t = 0; while(!isFinal()) { zThread::msleep((10-t)>0?(10-t):1); //获取当前时间 currentTime.now(); //sky 一秒记时器循环遍历队伍处理Roll事宜 if(_one_sec(currentTime)) { SceneManager::getInstance().TeamRollItme(); } if (_five_sec(currentTime)) { OnTimer event(1); EventTable::instance().execute(event); ScenesService::getInstance().checkAndReloadConfig(); } sessionClient->doCmd(); recordClient->doCmd(); SceneTaskManager::getInstance().execEvery(); //specialNpc //MonkeyNpcs affectNpc; //AddSpecialNpcCallBack asncb(affectNpc,step,t > timeout_value2); //SceneNpcManager::getMe().execAllSpecialNpc(asncb); SceneNpc::AI(currentTime,SceneNpcManager::getMe().getSepcialNpc(),step,t > timeout_value2); //250 usec EverySceneEntryAction esea(step); //对所有地图调用回调函数 SceneManager::getInstance().execEveryScene(esea); #if 0 if (0==step) { //20-25 usec sessionClient->doCmd(); recordClient->doCmd(); SceneTaskManager::getInstance().execEvery(); } #endif if (_one_min(currentTime)) {//竞赛处理,一分钟判断一次全国竞赛 CountryDareM::getMe().timer(); //刷新所有全局变量 if (GlobalVar::server_id()) { //ugly,TO BE FIXED ALLVARS(update); ALLVARS(save); } SceneManager::getInstance().checkUnloadOneScene(); } step = (++step) % MAX_NPC_GROUP; zRTime e; t = currentTime.elapse(e); if (t > timeout_value) { Xlogger->debug("---------- 1次循环用时 %u 毫秒----------",t); } scriptTaskManagement::getInstance().execAll(); duplicateManager::getInstance().doClear(); /*scriptTaskManagement::iterator it = _tasklist->begin(); scriptTaskManagement::iterator end = _tasklist->end(); for( ; it != end; ++it) { time_t t = (time(NULL) - it->second->lastTime); if(it->second->doTask(t)) { it->second->lastTime = time(NULL); } }*/ } }
/** * \brief 时间循环,发送定时事件,处理受影响npc ai等 */ void SceneTimeTick::run() { const int timeout_value = 500; // const int timeout_value2 = 300; DWORD step = 0; int t = 0; while(!isFinal()) { zThread::msleep((10-t)>0?(10-t):1); //获取当前时间 currentTime.now(); #if 0 //sky 一秒记时器循环遍历队伍处理Roll事宜 if(_one_sec(currentTime)) { SceneManager::getInstance().TeamRollItme(); } #endif #if 0 if (_five_sec(currentTime)) { OnTimer event(1); EventTable::instance().execute(event); ScenesService::getInstance().checkAndReloadConfig(); } #endif if(_one_sec(currentTime)) { ChallengeGameManager::getMe().timer(); } sessionClient->doCmd(); recordClient->doCmd(); SceneTaskManager::getInstance().execEvery(); #ifndef _MOBILE SceneNpc::AI(currentTime, SceneNpcManager::getMe().getSepcialNpc(), step, false); #endif //250 usec EverySceneEntryAction esea(step); //对所有地图调用回调函数 SceneManager::getInstance().execEveryScene(esea); #if 0 if (0==step) { //20-25 usec sessionClient->doCmd(); recordClient->doCmd(); SceneTaskManager::getInstance().execEvery(); } #endif if (_one_min(currentTime)) { #if 0 //竞赛处理,一分钟判断一次全国竞赛 CountryDareM::getMe().timer(); if (Zebra::global["world_quiz"] == "true") { struct tm tv1; time_t timValue = time(NULL); zRTime::getLocalTime(tv1,timValue); if (tv1.tm_hour==19) { if (tv1.tm_min==5 || tv1.tm_min == 10 || tv1.tm_min==15) { for (SceneManager::CountryMap_iter iter=SceneManager::getInstance(). country_info.begin(); iter!=SceneManager::getInstance().country_info.end(); iter++) { Cmd::Session::t_countryNotify_SceneSession send; bzero(send.info,sizeof(send.info)); sprintf(send.info,"%d 分钟后举办智力竞赛",abs(20-tv1.tm_min)); send.dwCountryID = iter->second.id; sessionClient->sendCmd(&send,sizeof(send)); } } if (!quiz && tv1.tm_min>=20 && tv1.tm_min<25) { quiz = true; Cmd::Session::t_createQuiz_SceneSession send; send.active_time = 30; send.ready_time = 1; send.type = 0; send.subject_type = 0; sessionClient->sendCmd(&send,sizeof(send)); } } if (tv1.tm_hour==12) { if (tv1.tm_min==5 || tv1.tm_min==10 || tv1.tm_min == 15) { for (SceneManager::CountryMap_iter iter=SceneManager::getInstance(). country_info.begin(); iter!=SceneManager::getInstance().country_info.end(); iter++) { Cmd::Session::t_countryNotify_SceneSession send; bzero(send.info,sizeof(send.info)); sprintf(send.info,"%d 分钟后举办智力竞赛",abs(20-tv1.tm_min)); send.dwCountryID = iter->second.id; sessionClient->sendCmd(&send,sizeof(send)); } } if (!quiz && tv1.tm_min>=20 && tv1.tm_min<25) { quiz = true; Cmd::Session::t_createQuiz_SceneSession send; send.active_time = 30; send.ready_time = 1; send.type = 0; send.subject_type = 0; sessionClient->sendCmd(&send,sizeof(send)); } } if (tv1.tm_hour==22) { if (tv1.tm_min==35 || tv1.tm_min==40 || tv1.tm_min == 45) { for (SceneManager::CountryMap_iter iter=SceneManager::getInstance(). country_info.begin(); iter!=SceneManager::getInstance().country_info.end(); iter++) { Cmd::Session::t_countryNotify_SceneSession send; bzero(send.info,sizeof(send.info)); sprintf(send.info,"%d 分钟后举办智力竞赛",abs(50-tv1.tm_min)); send.dwCountryID = iter->second.id; sessionClient->sendCmd(&send,sizeof(send)); } } if (!quiz && tv1.tm_min>=50 && tv1.tm_min<55) { quiz = true; Cmd::Session::t_createQuiz_SceneSession send; send.active_time = 30; send.ready_time = 1; send.type = 0; send.subject_type = 0; sessionClient->sendCmd(&send,sizeof(send)); } } if (tv1.tm_hour==13 || tv1.tm_hour==20 || tv1.tm_hour==0) { quiz = false; } } #endif //刷新所有全局变量 if (GlobalVar::server_id()) { //ugly,TO BE FIXED ALLVARS(update); ALLVARS(save); } SceneManager::getInstance().checkUnloadOneScene(); } ++step; step %= MAX_NPC_GROUP; zRTime e; t = currentTime.elapse(e); if (t > timeout_value) { Zebra::logger->debug("---------- 1次循环用时 %u 毫秒----------",t); } //scriptTaskManagement::getInstance().execAll(); //duplicateManager::getInstance().doClear(); /*scriptTaskManagement::iterator it = _tasklist->begin(); scriptTaskManagement::iterator end = _tasklist->end(); for( ; it != end; ++it) { time_t t = (time(NULL) - it->second->lastTime); if(it->second->doTask(t)) { it->second->lastTime = time(NULL); } }*/ } }
void SessionTimeTick::run() { //int rush = 0; while(!isFinal()) { zThread::msleep(50); //获取当前时间 currentTime.now(); recordClient->doCmd(); SessionTaskManager::getInstance().execEvery(); if (_five_sec(currentTime)) { HeroCardManager::getMe().timer(); //��������ƥ�� } #if 0 if (_five_sec(currentTime)) { CDareM::getMe().timer(); CNpcDareM::getMe().timer(); CCityM::getMe().timer(); CArmyM::getMe().timer(); } if (_one_sec(currentTime)) { CQuizM::getMe().timer(); CUnionM::getMe().timer(); CAllyM::getMe().timer(); CArenaManager::getInstance().Arena_timer(); } if (_ten_min(currentTime)) { AuctionService::getMe().checkDB(); } #endif // [ranqd Add] Session每五分钟同步一次服务器在线状态 if( _five_min(currentTime) ) { UserSessionManager::getInstance()->notifyOnlineToGate(); } if (_one_min(currentTime)) { SessionService::getInstance().checkShutdown(); #if 0 //SessionService::getInstance().checkGumu(); CCountryM::getMe().timer(); //CGemM::getMe().timer(); CartoonPetService::getMe().writeAllToDB(); EmperorForbid::getMe().timer(); #endif //定时动作 time_t timValue = time(NULL); struct tm tmValue; zRTime::getLocalTime(tmValue,timValue); SessionService::getInstance().checkCountry(tmValue); //GM公告 for (int i=0; i<=5; i++) { if (SessionService::wMsg[i].time) { if (SessionService::wMsg[i].count) SessionService::wMsg[i].count--; else { if (SessionService::wMsg[i].country) if (SessionService::wMsg[i].mapID)//区域公告 { SceneSession *scene = SceneSessionManager::getInstance() ->getSceneByID((SessionService::wMsg[i].country<<16)+SessionService::wMsg[i].mapID); if (scene) { Cmd::Session::t_broadcastScene_SceneSession send; strncpy(send.info,SessionService::wMsg[i].msg,MAX_CHATINFO); strncpy(send.GM,SessionService::wMsg[i].GM,MAX_NAMESIZE); send.mapID = (SessionService::wMsg[i].country<<16)+SessionService::wMsg[i].mapID; scene->sendCmd(&send,sizeof(send)); #ifdef _DEBUG Zebra::logger->debug("GM公告:%s:%s mapID=%u",send.GM,send.info,send.mapID); #endif } } else//国家公告 SessionChannel::sendCountryInfo(Cmd::INFO_TYPE_SCROLL,SessionService::wMsg[i].country,SessionService::wMsg[i].msg); else//世界公告 SessionChannel::sendAllInfo(Cmd::INFO_TYPE_SCROLL,SessionService::wMsg[i].msg); SessionService::wMsg[i].count = SessionService::wMsg[i].interval; SessionService::wMsg[i].time--; } } if (0==SessionService::wMsg[i].time) SessionService::wMsg.erase(i); } } #if 0 if (_one_hour(currentTime)) { MailService::getMe().checkDB(); CVoteM::getMe().timer(); CCountryM::getMe().timerPerHour(); CCountryM::getMe().save(); } #endif } }