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

📄 levelwarmanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
#include <stdio.h>#include "DB.h"#include "Properties.h"#include "Player.h"#include "PlayerCreature.h"#include "ZoneGroupManager.h"#include "StringPool.h"#include "LevelWar.h"#include "LevelWarInfo.h"#include "LevelWarManager.h"#include "LevelWarZoneInfoManager.h"#include "SweeperBonusManager.h"#include "VariableManager.h"#include "Gpackets/GCNoticeEvent.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCSweeperBonusInfo.h"#include "Cpackets/CGSay.h"// 傈里 窍绰 朝楼int LevelWarTime[4][3] = {	{ 2,20, 0 }, // 拳夸老 8矫	{ 4,20, 0 }, // 格夸老 8矫	{ 2,21, 0 }, // 拳夸老 9矫	{ 4,21, 0 }, // 格夸老 9矫};void LevelWarManager::init() { 	m_SweeperSetManager.load( m_Level, m_pZone ); 	SAFE_DELETE(m_pLevelWarSchedule);	VSDateTime warStartTime = getNextLevelWarTime();	m_pLevelWarSchedule = new Schedule( new LevelWar( this ), warStartTime );	filelog("WarLog.txt", "[Level=%d, Time=%s] 饭骇喊 傈里阑 眠啊钦聪促.", m_Level, warStartTime.toString().c_str() );	addSchedule( m_pLevelWarSchedule );}Work* LevelWarManager::heartbeat() 	throw(Error){	Work* pWork = NULL;	pWork = Scheduler::heartbeat();	if ( m_pLevelWarSchedule!=NULL 		&& !m_bHasWar		&& g_pVariableManager->isActiveLevelWar() )	{		m_bHasWarToDay = VSDateTime::currentDateTime().daysTo( m_pLevelWarSchedule->getScheduledTime() ) <= 3;	}	if ( m_bHasWar )	{		// 傈里捞 乐栏搁 GCWarList 甫 盎脚秦霖促		makeGCWarList();	}	return pWork;}void LevelWarManager::startWar(){ 	m_bHasWar = true;	// 泅犁 矫埃阑 start time 栏肺 扁废秦敌促. 	// startTime 苞 Level 捞 扁废阑 巢辨 锭 怖 鞘夸窍促.	setLevelWarStartTime(VSDateTime::currentDateTime());	int year = VSDate::currentDate().year() - 2000;	int month = VSDate::currentDate().month();	int day = VSDate::currentDate().day();	int hour = VSTime::currentTime().hour();	int level = 0; 	if (m_pZone->getZoneID() == 1131)		level = 1;	else if (m_pZone->getZoneID() == 1132)		level = 2;	else if (m_pZone->getZoneID() == 1133)		level = 3;	else if (m_pZone->getZoneID() == 1134)		level = 4;	fixTimeband( g_pVariableManager->getVariable( RACE_WAR_TIMEBAND ) );	killAllMonsters();	GCNoticeEvent gcNoticeEvent;	gcNoticeEvent.setCode( NOTICE_EVENT_LEVEL_WAR_STARTED );//	gcNoticeEvent.setParameter( ((DWORD)((DWORD)month << 24)) | ((DWORD)((DWORD)day << 16)) | ((DWORD)((DWORD)hour << 8)) | ((DWORD)((DWORD)level)) );	gcNoticeEvent.setParameter( (level * 100000000) + (year * 1000000) + (month * 10000) + (day * 100) + hour );	g_pZoneGroupManager->broadcast( &gcNoticeEvent );	GCSweeperBonusInfo gcSweeperBonusInfo;	g_pSweeperBonusManager->makeVoidSweeperBonusInfo( gcSweeperBonusInfo );	g_pLevelWarZoneInfoManager->broadcast( m_pZone->getZoneID(), &gcSweeperBonusInfo );	// 扁废 巢变促.	recordLevelWarStart();}void LevelWarManager::recordLevelWarStart(){	Statement* pStmt = NULL;    Result* pResult  = NULL;	BEGIN_DB    {		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		pResult = pStmt->executeQuery("SELECT SweeperType, OwnerRace FROM SweeperOwnerInfo WHERE ZoneID = %d", m_pZone->getZoneID());		string slayerOld;		string vampireOld;		string oustersOld;		string defaultOld;		while (pResult->next())		{			uint id 		= pResult->getInt(1);			uint ownerRace 	= pResult->getInt(2);			if ( ownerRace == 0 )				slayerOld = slayerOld + itos(id) + "|";			else if ( ownerRace == 1 )				vampireOld = vampireOld + itos(id) + "|";			else if ( ownerRace == 2 )				oustersOld = oustersOld + itos(id) + "|";			else				defaultOld = defaultOld + itos(id) + "|";		}		pStmt->executeQuery("INSERT INTO LevelWarHistory (Level, LevelWarID, SlayerOldSweeper, VampireOldSweeper, OustersOldSweeper, DefaultOldSweeper) VALUES (%d, '%s', '%s', '%s', '%s', '%s')",					m_Level,					getLevelWarStartTime().toStringforWeb().c_str(),					slayerOld.c_str(),					vampireOld.c_str(),					oustersOld.c_str(),					defaultOld.c_str() );			}	END_DB(pStmt)}void LevelWarManager::manualStart(){	if ( !isEmpty() )	{		addSchedule(new Schedule( popRecentWork(), VSDateTime::currentDateTime() ) );	}	else	{		m_pLevelWarSchedule = new Schedule( new LevelWar( this ), VSDateTime::currentDateTime() );		addSchedule( m_pLevelWarSchedule );	}}void LevelWarManager::endWar(){ 	m_bHasWar = false; 	m_SweeperSetManager.returnAllSweeper();	resumeTimeband();	GCSweeperBonusInfo gcSweeperBonusInfo;	g_pSweeperBonusManager->makeSweeperBonusInfo( gcSweeperBonusInfo );	g_pLevelWarZoneInfoManager->broadcast( m_pZone->getZoneID(), &gcSweeperBonusInfo );	GCNoticeEvent gcNoticeEvent;	gcNoticeEvent.setCode( NOTICE_EVENT_LEVEL_WAR_OVER );	m_pZone->broadcastPacket( &gcNoticeEvent );	VSDateTime warStartTime = getNextLevelWarTime();	m_pLevelWarSchedule = new Schedule( new LevelWar( this ), warStartTime );	filelog("WarLog.txt", "[Level=%d, Time=%s] 饭骇喊 傈里阑 眠啊钦聪促.", m_Level, warStartTime.toString().c_str() );	addSchedule( m_pLevelWarSchedule );	char sLoad[100];	sprintf( sLoad , "*world *load sweeper_owner %d", m_Level);	CGSayHandler::opworld( NULL , sLoad, 0, true );	// 扁废 巢变促	recordLevelWarEnd();}void LevelWarManager::recordLevelWarEnd(){	Statement* pStmt = NULL;    Result* pResult  = NULL;	BEGIN_DB    {		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		pResult = pStmt->executeQuery("SELECT SweeperType, OwnerRace FROM SweeperOwnerInfo WHERE ZoneID = %d", m_pZone->getZoneID());		string slayerNew;		string vampireNew;		string oustersNew;		string defaultNew;		while (pResult->next())		{			uint id 		= pResult->getInt(1);			uint ownerRace 	= pResult->getInt(2);			if ( ownerRace == 0 )				slayerNew = slayerNew + itos(id) + "|";			else if ( ownerRace == 1 )				vampireNew = vampireNew + itos(id) + "|";			else if ( ownerRace == 2 )				oustersNew = oustersNew + itos(id) + "|";			else				defaultNew = defaultNew + itos(id) + "|";		}		pStmt->executeQuery("UPDATE LevelWarHistory SET SlayerSweeper = '%s', VampireSweeper = '%s', OustersSweeper = '%s', DefaultSweeper = '%s' WHERE Level = %d AND LevelWarID = '%s'",					slayerNew.c_str(),					vampireNew.c_str(),					oustersNew.c_str(),					defaultNew.c_str(), 					m_Level,					getLevelWarStartTime().toStringforWeb().c_str());			}	END_DB(pStmt)	// script 倒府扁 ぱ.,ぱ system 窃荐甫 静霸 瞪 临捞具 !_!	char cmd[100];	sprintf(cmd, "/home/darkeden/vs/bin/script/recordLevelWarHistory.py %d %s %d %d ",					m_Level,					getLevelWarStartTime().toStringforWeb().c_str(),					g_pConfig->getPropertyInt("Dimension"),					g_pConfig->getPropertyInt("WorldID") );	filelog("script.log", cmd);	system(cmd);}bool LevelWarManager::putSweeper( PlayerCreature* pPC, Item* pItem , MonsterCorpse* pCorpse){	int race = m_SweeperSetManager.getSafeIndex( pCorpse );	if ( pPC->isSlayer() && race != 0) return false;	if ( pPC->isVampire() && race != 1) return false;	if ( pPC->isOusters() && race != 2) return false;		return m_SweeperSetManager.putSweeper( pItem, pCorpse );}VSDateTime LevelWarManager::getNextLevelWarTime() const{	VSDateTime now = VSDateTime::currentDateTime();	int dayOfWeek = now.date().dayOfWeek();	bool isSameDay = false;	if ( dayOfWeek == LevelWarTime[m_Level-1][0] )		isSameDay = now.time() < VSTime( LevelWarTime[m_Level-1][1], LevelWarTime[m_Level-1][2] );	if ( isSameDay ) return VSDateTime( now.date(), VSTime( LevelWarTime[m_Level-1][1], LevelWarTime[m_Level-1][2] ) );	int lastDays = LevelWarTime[m_Level-1][0] - dayOfWeek;	if ( lastDays <= 0 ) lastDays += 7;		return VSDateTime( now.date().addDays(lastDays), VSTime( LevelWarTime[m_Level-1][1], LevelWarTime[m_Level-1][2] ) );}void LevelWarManager::fixTimeband( uint timeband )	throw(Error){	__BEGIN_TRY	Assert( m_pZone != NULL );	m_pZone->stopTime();	m_pZone->setTimeband( timeband );	m_pZone->resetDarkLightInfo();	__END_CATCH}void LevelWarManager::resumeTimeband()	throw(Error){	__BEGIN_TRY	Assert( m_pZone != NULL );	m_pZone->resumeTime();	m_pZone->resetDarkLightInfo();	__END_CATCH}void LevelWarManager::killAllMonsters()	throw(Error){	__BEGIN_TRY	Assert( m_pZone != NULL );	m_pZone->killAllMonsters_UNLOCK();	__END_CATCH}int LevelWarManager::getStartHour(){	__BEGIN_TRY	if ( m_pLevelWarSchedule == NULL ) return -1;		return m_pLevelWarSchedule->getScheduledTime().time().hour();	__END_CATCH}bool LevelWarManager::makeGCWarList()	throw(Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_MutexWarList)	m_GCWarList.clear();	if ( !hasWar() )	{		m_MutexWarList.unlock();		return false;	}	if ( isEmpty() )	{		m_MutexWarList.unlock();		return false;	}	const RecentSchedules::container_type& Schedules = m_RecentSchedules.getSchedules();	RecentSchedules::const_iterator itr = Schedules.begin();	RecentSchedules::const_iterator endItr = Schedules.end();	for (; itr != endItr ; itr++)	{		Schedule* pSchedule = *itr;		LevelWarInfo* pLevelWarInfo = new LevelWarInfo;		const Work* pWork = pSchedule->getWork();		Assert(pWork != NULL);		VSDateTime dt(VSDateTime::currentDateTime());		int endHour = pSchedule->getScheduledTime().time().hour();		int endMin = pSchedule->getScheduledTime().time().minute();		int endSec = pSchedule->getScheduledTime().time().second();		int curHour = dt.time().hour();		int curMin = dt.time().minute();		int curSec = dt.time().second();		int endSecs = endHour*60*60 + endMin*60 + endSec;		int curSecs = curHour*60*60 + curMin*60 + curSec;		int remainSec = 0;		if (endSecs > curSecs) remainSec = endSecs - curSecs;		pLevelWarInfo->setLevel( m_Level );		pLevelWarInfo->setRemainTime( remainSec );		if ( remainSec != 0 )			m_GCWarList.addWarInfo( pLevelWarInfo );	}	__LEAVE_CRITICAL_SECTION(m_MutexWarList)	return true;		__END_CATCH}void LevelWarManager::sendGCWarList(Player *pPlayer)	throw(Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_MutexWarList)	if ( !m_GCWarList.isEmpty() )	{		pPlayer->sendPacket( &m_GCWarList );	}	__LEAVE_CRITICAL_SECTION(m_MutexWarList)	__END_CATCH}void LevelWarManager::broadcastGCWarList()	throw(Error){	__BEGIN_TRY	__ENTER_CRITICAL_SECTION(m_MutexWarList)	m_pZone->broadcastPacket( &m_GCWarList );	__LEAVE_CRITICAL_SECTION(m_MutexWarList)	__END_CATCH}void LevelWarManager::freeUserTimeCheck()	throw(Error){	__BEGIN_TRY	int hour = VSTime::currentTime().hour();	if ( m_bCanEnterFreeUser && hour != LevelWarTime[m_Level-1][1] )	{		m_bCanEnterFreeUser = false;		// Zone 俊 乐绰 荤恩 促 屁败林磊.		m_pZone->remainPayPlayer();	}	else if ( !m_bCanEnterFreeUser && hour == LevelWarTime[m_Level-1][1] )	{		m_bCanEnterFreeUser = true;		GCSystemMessage gcSystemMessage;		char msg[100];		sprintf(msg, g_pStringPool->c_str( STRID_LEVEL_WAR_ZONE_FREE_OPEN ), m_Level, hour, hour+1);		gcSystemMessage.setMessage( msg );	    g_pZoneGroupManager->broadcast( &gcSystemMessage );	}	__END_CATCH}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -