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

📄 zonegroupmanager.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if (minLoadValue >= loadBoundary			|| maxLoadValue-minLoadValue <= minLoadGap)		{			// load甫 促矫 炼荤秦具 茄促.			for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 			{				ZoneGroup* pZoneGroup = itr->second;				// loadValue甫 檬扁拳 矫难霖促.				const hash_map< ZoneID_t, Zone* >& zones = pZoneGroup->getZones();				hash_map< ZoneID_t, Zone* >::const_iterator iZone;				// 阿 Zone狼 loadValue甫 备茄促.				for (iZone=zones.begin(); iZone!=zones.end(); iZone++)				{					Zone* pZone = iZone->second;					pZone->initLoadValue();				}			}			return false;		}	}	// 乞闭 load	//int avgLoad = totalLoad / maxGroups;	// average甫 90%肺 棱篮 版快	int avgLoad = totalLoad * averageLoadPercent / maxGroup / 100;	// 货肺款 弊缝狼 load甫 拌魂窍扁 困秦辑	groups.reserve( maxGroup );	for (i=0; i<maxGroup; i++)	{		groups[i] = 0;	}	// balancing窍扁 傈狼 惑怕 免仿	//outputLoadValue();	//------------------------------------------------------------------	//	// load balancing	//	// 距埃狼 函拳甫 霖? FirstFit 荤侩.	//------------------------------------------------------------------	LOAD_INFOS::const_iterator iInfo = loadInfos.begin();	int index = 0;	for (; iInfo!=loadInfos.end(); iInfo++)	{		LoadInfo* pInfo = iInfo->second;		// 甸绢哎 货 group阑 茫绰促.		int newGroupID = -1;		for (int k=0; k<maxGroup; k++)		{			int groupLoad = groups[index];			if (groupLoad+pInfo->load <= avgLoad)			{				newGroupID = index;					if (++index>=maxGroup) index = 0;				break;			}			if (++index>=maxGroup) index = 0;		}		// 利例茄 group阑 给 茫疽栏搁 俩 蔼捞 利篮 group俊 持绰促.		if (newGroupID==-1)		{			newGroupID = 0;			for (int k=1; k<maxGroup; k++)			{				if (groups[k] < groups[newGroupID])				{					newGroupID = k;				}			}		}		// newGroupID俊促啊 Info甫 眠啊茄促.		pInfo->groupID = newGroupID + 1;		// 1阑 刘啊矫难拎具 茄促. -_-;		groups[newGroupID] += pInfo->load;	}	return true;}//---------------------------------------------------------------------------// make DefaultLoadInfo//---------------------------------------------------------------------------// DB俊 汲沥等 扁夯 ZoneGroup栏肺 汲沥茄促.//---------------------------------------------------------------------------bool	ZoneGroupManager::makeDefaultLoadInfo( LOAD_INFOS& loadInfos )	throw (Error){	__BEGIN_TRY	__BEGIN_DEBUG	Statement* pStmt = NULL;	list<ZoneGroupID_t> ZoneGroupIDList;	// 刚历 粮 弊缝 酒捞叼甸阑 佬绰促.	BEGIN_DB	{		pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();		Result* pResult = pStmt->executeQuery("SELECT ZoneGroupID FROM ZoneGroupInfo");		while (pResult->next())		{			ZoneGroupID_t ID = pResult->getInt(1);			ZoneGroupIDList.push_back(ID);		}		SAFE_DELETE(pStmt);	}	END_DB(pStmt)	list<ZoneGroupID_t>::iterator itr = ZoneGroupIDList.begin();	for (; itr != ZoneGroupIDList.end(); itr++)	{		ZoneGroupID_t ID = *itr;		BEGIN_DB		{			pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement();			//Result* pResult = pStmt->executeQuery("SELECT ZoneID FROM ZoneInfo WHERE ZoneGroupID = %d", ID);			Result* pResult = pStmt->executeQuery(					"SELECT ZoneID FROM ZoneInfo WHERE ZoneGroupID = %d", ID);			while (pResult->next())			{				ZoneID_t zoneID = pResult->getInt(1);				LoadInfo* pInfo 	= new LoadInfo;				pInfo->id 			= zoneID;				try {					pInfo->oldGroupID 	= g_pZoneInfoManager->getZoneInfo(zoneID)->getZoneGroupID();				} catch (NoSuchElementException& ) {					filelog("makeDefaultLoadInfoError.txt", "NoSuch ZoneInfo : %d", zoneID);					pInfo->oldGroupID 	= ID;	// 弊成 逞绢啊霸 茄促.				}				pInfo->groupID 		= ID;				pInfo->load 		= 0;	// 狼固绝促.				loadInfos[zoneID] = pInfo;			}			SAFE_DELETE(pStmt);		}		END_DB(pStmt)	}	ZoneGroupIDList.clear();	__END_DEBUG	__END_CATCH	return true;}//---------------------------------------------------------------------------// balance ZoneGroup ( bForce )//---------------------------------------------------------------------------//// bForce : balacing且 鞘夸啊 绝促绊 魄窜登绰 版快俊档 //          碍力肺 ZoneGroup阑 balancing且 版快俊 荤侩等促.//// bDefault : DB俊辑 瘤沥登绢 乐绰 蔼栏肺 ZoneGroup阑 汲沥茄促.//// Zone付促狼 10檬埃狼 loop 贸府 雀荐甫 load蔼栏肺 茄促.// 拌魂俊 祈狼甫 困秦辑 角力 load绰 促澜苞 鞍狼 沥狼茄促.////     load = (loadLimit - load)*loadMultiplier;////---------------------------------------------------------------------------void   ZoneGroupManager::balanceZoneGroup(bool bForce, bool bDefault) 	throw (Error){	__BEGIN_TRY	LOAD_INFOS 	loadInfos;	//------------------------------------------------------------------	// zoneGroup阑 balancing且 LoadInfo甫 积己茄促.	//------------------------------------------------------------------	if (bDefault)	{		makeDefaultLoadInfo( loadInfos );	}	else	{		if (!makeBalancedLoadInfo( loadInfos, bForce ))		{			// balancing且 鞘夸啊 绝促绊 魄窜登绰 版快捞促.			return;		}	}	hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr;	LOAD_INFOS::const_iterator iInfo;	//------------------------------------------------------------------	//	// ZoneGroup 函版	//	//------------------------------------------------------------------	// ZonePlayerManager::m_PlayerListQueue	// m_ZoneGroups 	// ZoneInfoManager	// Zone::m_pZoneGroup	// ZonePlayerManager::m_pPlayers	//------------------------------------------------------------------	try {		//------------------------------------------------------------------		// LoginServerManager LOCK		//------------------------------------------------------------------		//__ENTER_CRITICAL_SECTION(g_pLoginServerManager)		g_pLoginServerManager->lock();		//------------------------------------------------------------------		//		// 					LOCK all ZoneGroups		//		//------------------------------------------------------------------		for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 		{			ZoneGroup* pZoneGroup = itr->second;			pZoneGroup->lock();			pZoneGroup->processPlayers();	// 沥府~扼绊 且鳖. 漂洒 EventResurrect锭巩捞促.		}		//------------------------------------------------------------------		// Zone俊辑 唱柯 局甸阑 促矫 格钎 Zone栏肺 持绰促.		//------------------------------------------------------------------		g_pIncomingPlayerManager->heartbeat();		//------------------------------------------------------------------		// 阿 ZoneGroup狼 		// ZPM俊辑 Zone栏肺 甸绢哎 措扁凯俊 乐绰 荤侩磊甸阑 快急 持绢滚赴促.		//------------------------------------------------------------------		for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 		{			ZoneGroup* pZoneGroup = itr->second;			// ZonePlayerManager::m_PlayerListQueue甫 沥府秦霖促. --> 老窜 Zone俊 眠啊.			pZoneGroup->getZonePlayerManager()->processPlayerListQueue();		}		//------------------------------------------------------------------		// ZoneGroup 函版		//------------------------------------------------------------------		for (iInfo=loadInfos.begin(); iInfo!=loadInfos.end(); iInfo++)		{			LoadInfo* pInfo = iInfo->second;			int oldGroupID = pInfo->oldGroupID;			int newGroupID = pInfo->groupID;			int zoneID = pInfo->id;			// group捞 鞍栏搁 捞悼矫懦 鞘夸啊 绝促.			if (oldGroupID==newGroupID)			{				//cout << "same ZoneGroup" << endl;				continue;			}						try {				//cout << "[" << (int)zoneID << "] " << (int)oldGroupID << " --> " << (int)newGroupID << endl;				hash_map< ZoneGroupID_t , ZoneGroup* >::iterator iOldZoneGroup = m_ZoneGroups.find( oldGroupID );				hash_map< ZoneGroupID_t , ZoneGroup* >::iterator iNewZoneGroup = m_ZoneGroups.find( newGroupID );				ZoneGroup* pOldZoneGroup = iOldZoneGroup->second;				ZoneGroup* pNewZoneGroup = iNewZoneGroup->second;				// ZonePlayerManager				ZonePlayerManager* pOldZPM = pOldZoneGroup->getZonePlayerManager();				ZonePlayerManager* pNewZPM = pNewZoneGroup->getZonePlayerManager();								Zone* pZone = pOldZoneGroup->getZone(zoneID);				// Old ZoneGroup --> New ZoneGroup				pOldZoneGroup->removeZone( zoneID );				pNewZoneGroup->addZone( pZone );								// ZoneGroup				pZone->setZoneGroup( pNewZoneGroup );				// ZoneInfoManager				ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( zoneID );				pZoneInfo->setZoneGroupID( newGroupID );				//------------------------------------------------------------------				// ZonePlayerManager::m_pPlayers				//------------------------------------------------------------------				// pZone狼 PCManager狼 局甸阑 				// 		pOldZoneGroup->m_pZonePlayerManager俊辑 力芭秦辑				// 		pZoneGroup->m_pZonePlayerManager俊 眠啊茄促.				//------------------------------------------------------------------				const PCManager* pPCManager = pZone->getPCManager();				const hash_map< ObjectID_t, Creature* >& players = pPCManager->getCreatures();				hash_map< ObjectID_t, Creature* >::const_iterator iPlayer;				// 阿 Player甸狼 ZPM阑 颗变促.				for (iPlayer=players.begin(); iPlayer!=players.end(); iPlayer++)				{					Player* pPlayer = iPlayer->second->getPlayer();					pOldZPM->deletePlayer_NOBLOCKED( pPlayer->getSocket()->getSOCKET() );					pNewZPM->addPlayer_NOBLOCKED( dynamic_cast<GamePlayer*>(pPlayer) );				}			} catch (NoSuchElementException& t) {				filelog("changeZoneGroupError.txt", "%s", t.toString().c_str());			}		}		// balancing茄 饶狼 惑怕 免仿		outputLoadValue();		//------------------------------------------------------------------		//		// 					UNLOCK all ZoneGroups		//		//------------------------------------------------------------------		for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 		{			ZoneGroup* pZoneGroup = itr->second;			// loadValue甫 檬扁拳 矫难霖促.			const hash_map< ZoneID_t, Zone* >& zones = pZoneGroup->getZones();			hash_map< ZoneID_t, Zone* >::const_iterator iZone;			// 阿 Zone狼 loadValue甫 备茄促.			for (iZone=zones.begin(); iZone!=zones.end(); iZone++)			{				Zone* pZone = iZone->second;				pZone->initLoadValue();			}			pZoneGroup->unlock();		}		//------------------------------------------------------------------		// LoginServerManager UNLOCK		//------------------------------------------------------------------		//__LEAVE_CRITICAL_SECTION(g_pLoginServerManager)		g_pLoginServerManager->unlock();	} catch (Throwable& t) {		filelog("balanceZoneGroup.txt", "%s", t.toString().c_str());		for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 		{			ZoneGroup* pZoneGroup = itr->second;			pZoneGroup->unlock();		}	}	//------------------------------------------------------------------	// loadInfos 瘤况林扁	//------------------------------------------------------------------	for (iInfo=loadInfos.begin(); iInfo!=loadInfos.end(); iInfo++)	{		LoadInfo* pInfo = iInfo->second;		SAFE_DELETE(pInfo);	}		__END_CATCH}//--------------------------------------------------------------------------------// lock all ZoneGroup and LoginServerManager//--------------------------------------------------------------------------------void ZoneGroupManager::lockZoneGroups()	throw( Error ){	__BEGIN_TRY	//------------------------------------------------------------------	// LoginServerManager UNLOCK	//------------------------------------------------------------------	g_pLoginServerManager->lock();	//------------------------------------------------------------------	//	// 					LOCK all ZoneGroups	//	//------------------------------------------------------------------	hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr;	for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 	{		ZoneGroup* pZoneGroup = itr->second;		pZoneGroup->lock();//		pZoneGroup->processPlayers();	// 沥府~扼绊 且鳖. 漂洒 EventResurrect锭巩捞促.	}	__END_CATCH}//--------------------------------------------------------------------------------// lock all ZoneGroup and LoginServerManager//--------------------------------------------------------------------------------void ZoneGroupManager::unlockZoneGroups()	throw( Error ){	__BEGIN_TRY	//------------------------------------------------------------------	//	// 					UNLOCK all ZoneGroups	//	//------------------------------------------------------------------	hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr;	for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 	{		ZoneGroup* pZoneGroup = itr->second;		pZoneGroup->unlock();//		pZoneGroup->processPlayers();	// 沥府~扼绊 且鳖. 漂洒 EventResurrect锭巩捞促.	}	//------------------------------------------------------------------	// LoginServerManager UNLOCK	//------------------------------------------------------------------	g_pLoginServerManager->unlock();	__END_CATCH}//--------------------------------------------------------------------------------// get PlayerNum. by sigi. 2002.12.30//--------------------------------------------------------------------------------int ZoneGroupManager::getPlayerNum () const	throw (Error){	__BEGIN_TRY	int numPC = 0;		hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr = m_ZoneGroups.begin();	for (; itr != m_ZoneGroups.end() ; itr ++) 	{		ZoneGroup* pZoneGroup = itr->second;				// lock 吧 鞘夸 绝促		numPC += pZoneGroup->getZonePlayerManager()->size();	}	return numPC;	__END_CATCH}void   ZoneGroupManager::removeFlag(Effect::EffectClass EC)	throw (Error){	__BEGIN_TRY	ZoneGroup* pZoneGroup = NULL;	hash_map< ZoneGroupID_t , ZoneGroup *>::const_iterator itr = m_ZoneGroups.begin();		for (; itr != m_ZoneGroups.end(); itr++)	{		pZoneGroup = itr->second;		pZoneGroup->getZonePlayerManager()->removeFlag( EC );	}		__END_CATCH}//--------------------------------------------------------------------------------// get debug string//--------------------------------------------------------------------------------string ZoneGroupManager::toString () const	throw (){	__BEGIN_TRY	StringStream msg;	msg << "ZoneGroupManager(";			for (hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) 	{		msg << itr->second->toString();	}	msg << ")";	return msg.toString();	__END_CATCH}// global variable definitionZoneGroupManager* g_pZoneGroupManager = NULL;

⌨️ 快捷键说明

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