📄 warscheduler.cpp
字号:
#include "WarSchedule.h"#include "WarScheduler.h"#include "Assert.h"#include "DB.h"#include "Zone.h"#include "Properties.h"#include "GuildWar.h"#include "VariableManager.h"#include <stdio.h>#include "Gpackets/GCWarScheduleList.h"#include "WarSystem.h"// dt 捞饶狼 岿, 荐, 陛 坷饶 8矫(~9矫)// dt 捞饶狼 老夸老 7矫(~9矫)const int NextWarDay [2][8] ={ { 0, 1, 3, 2, 1, 4, 3, 2 }, // 辨靛傈 { 0, 6, 5, 4, 3, 2, 1, 0 } // 辆练傈};// 抛胶飘 辑滚俊辑..const int NextWarHour [2][24] ={ // * * * * // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 1, 5, 4, 3, 2, 1, 2, 1, 15, 14, 13, 12, 11 }, // 辨靛傈 // * * // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 { 14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, 1, 16, 15 } // 辆练傈};WarScheduler::WarScheduler( Zone* pZone ) throw (Error): m_pZone(pZone) { // Zone俊 嘿绢辑 倒酒埃促. // 弊繁单, cancelGuildSchedules()绰 寇何俊辑 阂赴促. m_Mutex.setName("WarSheduler");}WarScheduler::~WarScheduler() throw (Error){}bool WarScheduler::makeGCWarScheduleList(GCWarScheduleList* pGCWarScheduleList) const throw (Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) const RecentSchedules::container_type& Schedules = m_RecentSchedules.getSchedules(); RecentSchedules::const_iterator itr = Schedules.begin(); for (; itr!=Schedules.end(); itr++) { const WarSchedule* pWarSchedule = dynamic_cast<WarSchedule*>(*itr); Assert(pWarSchedule!=NULL); WarScheduleInfo* pWSI = new WarScheduleInfo; pWarSchedule->makeWarScheduleInfo( pWSI ); pGCWarScheduleList->addWarScheduleInfo( pWSI ); } // 磊悼栏肺 矫累窍绰 扁瓷捞 汲沥登绢 乐促搁, 辆练 傈里 沥焊绰 公炼扒 持绢霖促. if (g_pVariableManager->isAutoStartRaceWar()) { WarScheduleInfo* pWSI = new WarScheduleInfo; if (g_pWarSystem->addRaceWarScheduleInfo( pWSI )) { pGCWarScheduleList->addWarScheduleInfo( pWSI ); } else { SAFE_DELETE(pWSI); } } __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH return true;}Work* WarScheduler::heartbeat() throw(Error){ __BEGIN_TRY Work* pWork = NULL; __ENTER_CRITICAL_SECTION(m_Mutex) pWork = Scheduler::heartbeat(); __LEAVE_CRITICAL_SECTION(m_Mutex) // 辆练 傈里牢 版快绰 促矫 1林老 饶 胶纳领阑 持绢霖促. /* if (pWork != NULL) { War* pWar = dynamic_cast<War*>(pWork); Assert(pWar!=NULL); if (pWar->getWarType()==WAR_RACE && getWarTypeCount( WAR_RACE )==0) { War* pNewWar = new War( m_pZone->getZoneID(), WAR_RACE, 0, War::WAR_STATE_WAIT ); addWar( pNewWar ); filelog("WarLog.txt", "[%d][WarID=%d] 辆练 傈里捞 矫累登菌栏骨肺 促澜 辆练 傈里阑 眠啊钦聪促.", (int)m_pZone->getZoneID(), (int)pWar->getWarID()); } } */ return pWork; __END_CATCH}void WarScheduler::load() throw(Error){ __BEGIN_TRY Statement* pStmt = NULL; Result* pResult = NULL; __ENTER_CRITICAL_SECTION(m_Mutex) clear(); //int numRaceWar = 0; VSDateTime currentDateTime( VSDateTime::currentDateTime() ); BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery( "SELECT WarID, WarType, AttackGuildID, WarFee, StartTime FROM WarScheduleInfo \ WHERE ServerID = %u AND ZoneID = %u AND ( Status = 'WAIT' OR Status = 'START' ) \ ORDER BY StartTime", g_pConfig->getPropertyInt("ServerID"), (int)m_pZone->getZoneID() ); if( pResult->getRowCount() > 0 ) { WarID_t warID; WarType_t warType; GuildID_t challengerGuildID; Gold_t warRegistrationFee; string dateTemp; VSDateTime warStartTime; while( pResult->next() ) { int i=0; warID = (WarID_t) pResult->getInt( ++i ); string warTypeStr = pResult->getString( ++i ); if (warTypeStr=="GUILD") warType = WAR_GUILD; else if (warTypeStr=="RACE") continue;//warType = WAR_RACE; else Assert(false); challengerGuildID = (GuildID_t) pResult->getInt( ++i ); warRegistrationFee = (Gold_t) pResult->getInt( ++i ); dateTemp = pResult->getString( ++i ); warStartTime = VSDateTime(dateTemp); // 捞固 矫累登菌绢具且 傈里捞扼搁 矫累矫埃阑 官层霖促. if (warStartTime < currentDateTime) { warStartTime = currentDateTime; } GuildWar* pWar = new GuildWar( m_pZone->getZoneID(), challengerGuildID, War::WAR_STATE_WAIT, warID ); pWar->setWarStartTime( warStartTime ); pWar->setRegistrationFee( warRegistrationFee ); WarSchedule* pWarSchedule = new WarSchedule( pWar, warStartTime, Schedule::SCHEDULE_TYPE_ONCE ); addSchedule( pWarSchedule ); //cout << "WarScheduler: loading [" << pWarSchedule->toString().c_str() << "]" << endl; filelog("WarLog.txt", "[LOAD] %s", pWar->toString().c_str()); //if (warType==WAR_RACE) numRaceWar++; } } SAFE_DELETE( pStmt ); } END_DB( pStmt ) // 辆练 傈里 汲沥等霸 绝栏搁 汲沥茄促. /* if (numRaceWar==0) { VSDateTime warStartTime = getNextWarDateTime( WAR_RACE ); War* pRaceWar = new War( m_pZone->getZoneID(), WAR_RACE, 0, War::WAR_STATE_WAIT ); WarSchedule* pWarSchedule = new WarSchedule( pRaceWar, warStartTime, Schedule::SCHEDULE_TYPE_PERIODIC ); addSchedule( pWarSchedule ); filelog("WarLog.txt", "[%d][WarID=%d] 辆练 傈里捞 绝栏骨肺 辆练 傈里阑 眠啊钦聪促.", (int)m_pZone->getZoneID(), (int)pRaceWar->getWarID()); pWarSchedule->create(); } */ __LEAVE_CRITICAL_SECTION(m_Mutex) __END_CATCH}int WarScheduler::getWarTypeCount(WarType_t warType) throw(Error){ __BEGIN_TRY int raceWarCount = 0; __ENTER_CRITICAL_SECTION(m_Mutex) RecentSchedules::const_iterator itr = m_RecentSchedules.getSchedules().begin(); for( ; itr != m_RecentSchedules.getSchedules().end() ; itr++ ) { WarSchedule* pWarSchedule = dynamic_cast<WarSchedule*>( (*itr) ); Assert(pWarSchedule!=NULL); War* pWar = dynamic_cast<War*>(pWarSchedule->getWork()); Assert(pWar!=NULL); if (pWar->getWarType()==warType) { raceWarCount ++; } } __LEAVE_CRITICAL_SECTION(m_Mutex) return raceWarCount; __END_CATCH}void WarScheduler::tinysave( WarID_t warID, const string& query ) throw(Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) RecentSchedules::const_iterator itr = m_RecentSchedules.getSchedules().begin(); for( ; itr != m_RecentSchedules.getSchedules().end() ; itr++ ) { WarSchedule* pWarSchedule = dynamic_cast<WarSchedule*>( (*itr) ); if( pWarSchedule->getWarID() == warID ) { pWarSchedule->tinysave( query ); m_Mutex.unlock(); return; } } __LEAVE_CRITICAL_SECTION(m_Mutex) filelog( "WarError.log", "WarScheduler::tinySave() DB俊 WarID:%d 牢 WarSchedule捞 绝嚼聪促.", warID ); __END_CATCH}VSDateTimeWarScheduler::getLastWarDateTime( WarType_t warType ) const{ const RecentSchedules::container_type& schedules = m_RecentSchedules.getSchedules(); RecentSchedules::const_iterator itr = schedules.begin(); bool bFound = false; VSDateTime dt = VSDateTime::currentDateTime(); for( ; itr != schedules.end(); itr++ ) { WarSchedule* pSchedule = dynamic_cast<WarSchedule*>(*itr); if( pSchedule->getWar()->getWarType() == warType ) { if (bFound) { if ( dt < pSchedule->getScheduledTime() ) dt = pSchedule->getScheduledTime(); } else { dt = pSchedule->getScheduledTime(); bFound = true; } } } return dt;}// dt 捞饶狼 傈里 矫埃阑 舅酒柯促.VSDateTimeWarScheduler::getNextWarDateTime( WarType_t warType, const VSDateTime& dt ){ int startHour = 0; VSDateTime nextWarDateTime; VSTime nextWarTime; if (g_pVariableManager->isWarPeriodWeek()) // 酒 呈公窍磊唱 ぬぬ { switch (warType) { case WAR_GUILD : // dt 捞饶狼 岿, 荐, 陛 坷饶 8矫(~9矫) startHour = 20; break; case WAR_RACE : // dt 捞饶狼 老夸老 7矫(~9矫) startHour = 19; break; } nextWarDateTime = dt.addDays( NextWarDay[warType][dt.date().dayOfWeek()] ); nextWarTime = VSTime(startHour, 0, 0); nextWarDateTime.setTime( nextWarTime ); if ( nextWarDateTime < VSDateTime::currentDateTime() ) { //nextWarDateTime = nextWarDateTime.addDays( NextWarDay[warType][dt.addDays(1).date().dayOfWeek()] ); nextWarDateTime = nextWarDateTime.addDays( 1 ); nextWarDateTime = nextWarDateTime.addDays( NextWarDay[warType][nextWarDateTime.date().dayOfWeek()] ); } } else { nextWarDateTime = dt.addSecs( NextWarHour[warType][dt.time().hour()]*60*60 ); nextWarTime = VSTime(nextWarDateTime.time().hour(), 0, 0); nextWarDateTime.setTime( nextWarTime ); } return nextWarDateTime;}VSDateTimeWarScheduler::getNextWarDateTime( WarType_t warType ) const{ return getNextWarDateTime( warType, getLastWarDateTime(warType) );}bool WarScheduler::addWar( War* pWar ) throw(Error){ __BEGIN_TRY WarType_t warType = pWar->getWarType(); VSDateTime warStartTime = getNextWarDateTime( warType ); pWar->setWarStartTime( warStartTime ); Schedule::ScheduleType scheduleType; if (warType==WAR_GUILD) { scheduleType = Schedule::SCHEDULE_TYPE_ONCE; } else// if (warType==WAR_RACE) { scheduleType = Schedule::SCHEDULE_TYPE_PERIODIC; } WarSchedule* pWarSchedule = new WarSchedule( pWar, warStartTime, scheduleType); __ENTER_CRITICAL_SECTION(m_Mutex) addSchedule( pWarSchedule ); filelog("WarLog.txt", "[%d][WarID=%d] %s 傈里阑 脚没沁栏骨肺 胶纳领俊 眠啊钦聪促.", (int)m_pZone->getZoneID(), (int)pWar->getWarID(), (pWar->getWarType()==WAR_GUILD? "辨靛":"辆练") ); pWarSchedule->create(); __LEAVE_CRITICAL_SECTION(m_Mutex) return true; __END_CATCH}bool WarScheduler::canAddWar( WarType_t warType ) throw(Error){ __BEGIN_TRY return getSize() < MaxWarSchedule; __END_CATCH}voidWarScheduler::cancelGuildSchedules() throw (Error){ __BEGIN_TRY Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery( "UPDATE WarScheduleInfo SET Status='CANCEL' WHERE ServerID = %d AND ZoneID = %d \ AND WarType='GUILD' AND (Status='WAIT' OR Status='START')", g_pConfig->getPropertyInt("ServerID"), m_pZone->getZoneID()); //pStmt->getAffectedRowCount() SAFE_DELETE(pStmt); } END_DB(pStmt) // 促矫 肺靛茄促. せせ - -; load(); __END_CATCH}bool WarScheduler::hasSchedule( GuildID_t gID ) throw(Error){ __BEGIN_TRY const RecentSchedules::container_type& schedules = m_RecentSchedules.getSchedules(); RecentSchedules::const_iterator itr = schedules.begin(); for( ; itr != schedules.end(); itr++ ) { WarSchedule* pSchedule = dynamic_cast<WarSchedule*>(*itr); if ( pSchedule == NULL ) continue; War* pWar = dynamic_cast<War*>(pSchedule->getWork()); if ( pWar != NULL && pWar->getWarType() == WAR_GUILD ) { GuildWar* pGuildWar = dynamic_cast<GuildWar*>(pWar); if ( pGuildWar != NULL && pGuildWar->getChallangerGuildID() == gID && pGuildWar->getState() == War::WAR_STATE_WAIT ) { return true; } } } return false; __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -