⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 warscheduler.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 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 + -