monstermanager.cpp

来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 2,206 行 · 第 1/5 页

CPP
2,206
字号
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void MonsterManager::deleteCreature (ObjectID_t creatureID)	throw ()//NoSuchElementException , Error){	__BEGIN_TRY	// 农府贸 秦浆甘俊 弊繁 OID 甫 啊柳 阁胶磐啊 粮犁窍绰瘤 眉农茄促.	hash_map<ObjectID_t , Creature* >::iterator itr = m_Creatures.find(creatureID);	if (itr == m_Creatures.end()) 	{		cerr << "MonsterManager::deleteCreature() : NoSuchElementException" << endl;				// 捞巴档 寇何俊辑 力措肺 贸府 救登绊 乐绰芭 鞍促.		// by sigi. 2002.5.9		//throw NoSuchElementException("弊繁 ObjectID甫 啊柳 阁胶磐绰 粮犁窍瘤 臼嚼聪促.");				return;	}	Monster* pMonster = dynamic_cast<Monster*>(itr->second);	// 农府贸 秦浆甘狼 秦寸 畴靛甫 昏力茄促.	// 窃荐 场俊 乐带吧 咯扁肺 棵啡促. by sigi	// 官焊具~ itr 曼炼绰 场郴绊 畴靛甫 瘤况具隆~. 2002.10.12 by bezz	m_Creatures.erase(itr);	// event monster绰 MonsterCounter尔 包拌绝促. by sigi .2002.10.14	if (m_pEventMonsterInfo!=NULL		&& pMonster->isEventMonster())	{		uint index = pMonster->getEventMonsterIndex();		if (index < m_pEventMonsterInfo->size())		{			EventMonsterInfo& info = (*m_pEventMonsterInfo)[index];			info.bExist = false;			//cout << "[MM] delete EventMonster: [" << pMonster->getEventMonsterIndex()			//	<< "] = " << info.monsterType << endl;		}		return;	}	// 阁胶磐 墨款磐俊 弊繁 阁胶磐 鸥涝捞 粮犁窍绰瘤 眉农茄促.	hash_map< SpriteType_t , MonsterCounter *>::iterator itr2 = m_Monsters.find(pMonster->getSpriteType());	if (itr2 == m_Monsters.end()) 	{		cerr << "MonsterManager::deleteCreature() : NoSuchElementException" << endl;		//throw NoSuchElementException("弊繁 SpriteType阑 啊柳 阁胶磐绰 粮犁窍瘤 臼嚼聪促.");	}	else 	{		// 阁胶磐狼 箭磊甫 临牢促.		itr2->second->deleteMonster();	}	__END_CATCH}////////////////////////////////////////////////////////////////////////////////// 傈眉狼 泪犁利牢 利栏肺 牢侥茄促. 2002.7.22 by sigi// pAttackedMonster甫 pCreature啊 傍拜茄 版快俊////////////////////////////////////////////////////////////////////////////////void MonsterManager::addPotentialEnemy(Monster* pAttackedMonster, Creature* pCreature) 	throw(Error){	__BEGIN_TRY	//cout << "MonsterManager::addPotentialEnemy()" << endl;			hash_map< ObjectID_t , Creature* >::const_iterator itr = m_Creatures.begin();	for (; itr!=m_Creatures.end(); itr++) 	{		Creature* pMonsterCreature = itr->second;		// 锭赴 仇阑 杭荐 乐绰 芭府咯具 茄促.		Distance_t dist = pMonsterCreature->getDistance(pCreature->getX(), pCreature->getY());		if (dist <= pMonsterCreature->getSight() 			// 磊脚篮 促弗 内靛俊辑 眉农茄促.			&& pMonsterCreature!=pAttackedMonster)		{			Monster* pMonster = dynamic_cast<Monster*>(pMonsterCreature);			//cout << "addPotentialEnemy: " << pMonster->getName().c_str() << endl;			pMonster->addPotentialEnemy( pCreature );		}	}			__END_CATCH}////////////////////////////////////////////////////////////////////////////////// 傈眉狼 利栏肺 牢侥茄促. 2002.7.22 by sigi// pAttackedMonster甫 pCreature啊 傍拜茄 版快俊////////////////////////////////////////////////////////////////////////////////void MonsterManager::addEnemy(Monster* pAttackedMonster, Creature* pCreature) 	throw(Error){	__BEGIN_TRY			//cout << "MonsterManager::addEnemy()" << endl;	hash_map< ObjectID_t , Creature* >::const_iterator itr = m_Creatures.begin();	for (; itr!=m_Creatures.end(); itr++) 	{		Creature* pMonsterCreature = itr->second;		// 锭赴 仇阑 杭荐 乐绰 芭府咯具 茄促.		Distance_t dist = pMonsterCreature->getDistance(pCreature->getX(), pCreature->getY());		if (dist <= pMonsterCreature->getSight() 			// 磊脚篮 促弗 内靛俊辑 眉农茄促.			&& pMonsterCreature!=pAttackedMonster)		{			Monster* pMonster = dynamic_cast<Monster*>(pMonsterCreature);			//cout << "addEnemy: " << pMonster->getName().c_str() << endl;			pMonster->addEnemy( pCreature );		}	}			__END_CATCH}////////////////////////////////////////////////////////////////////////////////// 农府贸 概聪历俊 辆加等 阁胶磐甸狼 AI俊 狼茄 咀记阑 角青茄促.////////////////////////////////////////////////////////////////////////////////void MonsterManager::processCreatures ()	throw (Error){	__BEGIN_TRY//	__BEGIN_PROFILE_MONSTER("MM_PROCESS_CREATURES");	Timeval currentTime;	getCurrentTime(currentTime);	try	{		hash_map< ObjectID_t , Creature* >::iterator before = m_Creatures.end();		hash_map< ObjectID_t , Creature* >::iterator current = m_Creatures.begin();		while (current != m_Creatures.end()) 		{			Creature* pCreature = current->second;			Assert(pCreature != NULL);			__BEGIN_PROFILE_MONSTER("MM_EFFECTMANAGER");			pCreature->getEffectManager()->heartbeat(currentTime);			__END_PROFILE_MONSTER("MM_EFFECTMANAGER");			if (pCreature->isAlive()) 			{				/*				Monster* pMonster = dynamic_cast<Monster*>(pCreature);				if (pMonster->isEnemyLimit())				{					Zone* 		pZone 	= pMonster->getZone();					ZoneCoord_t cx 		= pMonster->getX();					ZoneCoord_t cy 		= pMonster->getY();					ObjectID_t 	monsterID = pMonster->getObjectID();					hash_map< SpriteType_t , MonsterCounter *>::iterator itr = m_Monsters.find(pMonster->getSpriteType());					if (itr == m_Monsters.end()) 					{						//cerr << "MonsterManager::processCreatures() : NoSuchElementException" << endl;						//throw NoSuchElementException("弊繁 SpriteType阑 啊柳 阁胶磐绰 粮犁窍瘤 臼嚼聪促.");					}					else					{						// 阁胶磐狼 箭磊甫 临牢促.						itr->second->deleteMonster();					}					// 鸥老苞 阁胶磐 概聪历俊辑 农府贸甫 昏力茄促.					Tile & tile = pZone->getTile(cx , cy);					tile.deleteCreature(monsterID);					SAFE_DELETE(pMonster);					if (before == m_Creatures.end()) 					{						m_Creatures.erase(current);						current = m_Creatures.begin();					} 					else 					{						m_Creatures.erase(current);						current = before;						current ++;					}					GCDeleteObject gcDeleteObject;					gcDeleteObject.setObjectID(monsterID);					pZone->broadcastPacket(cx, cy , &gcDeleteObject);				}			*/				__BEGIN_PROFILE_MONSTER("MM_CREATURE_ACT");				pCreature->act(currentTime);				before = current ++;				__END_PROFILE_MONSTER("MM_CREATURE_ACT");			} 			else			{				Monster* pMonster = dynamic_cast<Monster*>(pCreature);				Assert(pMonster != NULL);				/*if ( pMonster->getMonsterType() == 371 ||				     pMonster->getMonsterType() == 372 ||				     pMonster->getMonsterType() == 373 ||				     pMonster->getMonsterType() == 374 ||				     pMonster->getMonsterType() == 375 ||				     pMonster->getMonsterType() == 376)					return;				else				{*/					if (pMonster->isEventMonster())		// by sigi. 2002.10.14					{						if (m_pEventMonsterInfo!=NULL)						{							uint index = pMonster->getEventMonsterIndex();							if (index < m_pEventMonsterInfo->size())							{								EventMonsterInfo& info = (*m_pEventMonsterInfo)[index];								info.bExist = false;								//cout << "[MM] dead EventMonster: [" << pMonster->getEventMonsterIndex()								//	<< "] = " << info.monsterType << endl;							}						}					}					else					{						// 阁胶磐 墨款磐甫 窍唱 临牢促.						hash_map< SpriteType_t , MonsterCounter *>::iterator itr = m_Monsters.find(pMonster->getSpriteType());						if (itr == m_Monsters.end()) 						{							//cerr << "MonsterManager::processCreatures() : NoSuchElementException" << endl;							//throw NoSuchElementException("弊繁 SpriteType阑 啊柳 阁胶磐绰 粮犁窍瘤 臼嚼聪促.");						}						else						{							// 阁胶磐狼 箭磊甫 临牢促.							itr->second->deleteMonster();						}					}				__BEGIN_PROFILE_MONSTER("MM_CREATURE_DEADACTION");					// 刚历 阁胶磐甫 磷捞扁 傈俊 付瘤阜 咀记阑 秒窍霸 茄促.					pMonster->actDeadAction();				__END_PROFILE_MONSTER("MM_CREATURE_DEADACTION");				__BEGIN_PROFILE_MONSTER("MM_KILL_CREATURE");					// 阁胶磐甫 粮俊辑 力芭窍绊, 宏肺靛某胶飘茄促.					killCreature(pMonster);				__END_PROFILE_MONSTER("MM_KILL_CREATURE");					// 阁胶磐俊 措茄 农府贸狼 秦浆甘狼 畴靛甫 昏力茄促.					// 肋给 昏力且 版快, 楷搬捞 柄龙 快妨啊 乐栏聪 林狼且 巴.					if (before == m_Creatures.end()) 					{						m_Creatures.erase(current);						current = m_Creatures.begin();					} 					else 					{						m_Creatures.erase(current);						current = before;						current ++;					}				//}			}		}		// 阁胶磐 犁积 内靛俊 findPosition捞扼绰 公茄 风橇 窃荐啊 窍唱 乐促.		// 30檬 悼救 咯矾 付府狼 阁胶磐啊 磷菌阑 锭, 捞 阁胶磐甸阑 府哩且 磊府甫 茫绰单 		// 吧府绰 矫埃捞 辨绢龙 荐啊 乐促. 弊府绊 捞 矫埃捞 辨绢瘤搁 发捞		// 惯积茄促. 乞闭利栏肺绰 粱 蠢妨瘤歹扼档, 泛阑 临捞扁 困秦辑 		// 府哩俊 措茄 八荤甫 概畔 窍档废 函版茄促. -- 辫己刮		// 老沥 林扁付促 阁胶磐 箭磊甫 犬牢秦辑 府哩矫难霖促.		if (m_RegenTime < currentTime)		{			__BEGIN_PROFILE_MONSTER("MM_REGENERATE_CREATURES");			regenerateCreatures();			m_RegenTime.tv_sec  = currentTime.tv_sec + 5;	// 5檬 饶 府哩			m_RegenTime.tv_usec = currentTime.tv_usec;			__END_PROFILE_MONSTER("MM_REGENERATE_CREATURES");		}		// 捞芭 恐 林籍贸府 救登绢乐菌瘤.. by sigi. 2002.5.3		//regenerateCreatures();	}	catch (Throwable & t)	{		filelog("MonsterManagerBug.log", "ProcessCreatureBug : %s", t.toString().c_str());		//cerr << t.toString() << endl;	}//	__END_PROFILE_MONSTER("MM_PROCESS_CREATURES");	__END_CATCH}////////////////////////////////////////////////////////////////////////////////// 阁胶磐狼 箭磊啊 临绢甸搁 阁胶磐甫 犁积己茄促.////////////////////////////////////////////////////////////////////////////////void MonsterManager::regenerateCreatures ()	throw (Error){	__BEGIN_TRY	__BEGIN_DEBUG	// 傈里 吝俊 阁胶磐 府哩 救登霸..	if (m_pZone->isHolyLand()) 	{		// 辆练 傈里 吝		if (g_pWarSystem->hasActiveRaceWar())			return;		// 辨靛 傈里 吝..		if (m_CastleZoneID!=0 && g_pWarSystem->hasCastleActiveWar(m_CastleZoneID))		{			CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo( m_CastleZoneID );			if (pCastleInfo!=NULL)			{				GuildID_t OwnerGuildID = pCastleInfo->getGuildID();				// 傍侩己捞 酒囱 版快绰 府哩 救茄促.==傍侩己篮 府哩 茄促.				if (OwnerGuildID!=SlayerCommon					&& OwnerGuildID!=VampireCommon					&& OwnerGuildID!=OustersCommon					)				{					return;				}			}		}	}	// 饭骇喊 傈里阑 窍绰 吝捞扼搁 -_-;; 	ZoneID_t zoneID = m_pZone->getZoneID(); 	if (zoneID == 1131 || zoneID == 1132 || zoneID == 1133 || zoneID == 1134)	{		if (!g_pSweeperBonusManager->isAble( zoneID ) )			return;	}	hash_map<SpriteType_t, MonsterCounter*>::iterator itr = m_Monsters.begin();	for (; itr != m_Monsters.end() ; itr ++) 	{		MonsterCounter* pCounter = itr->second;		// 阁胶磐啊 临绢甸菌阑 版快...		while (pCounter->getCurrentMonsters() < pCounter->getMaxMonsters()) 		{			SpriteType_t  SpriteType  = itr->first;			MonsterType_t monsterType = 0;			vector<MonsterType_t> RegenVector = g_pMonsterInfoManager->getMonsterTypeBySprite(SpriteType);			Assert(RegenVector.size() > 0);			monsterType = RegenVector[rand()%RegenVector.size()];			// 粮狼 后 谅钎甫 茫酒辰促.			ZoneCoord_t x, y;			if (!findPosition(monsterType, x, y))			{				Assert(false);				return;			}			// 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促.			Monster* pMonster = new Monster(monsterType);			Assert(pMonster != NULL);			/////////////////////////////////////////////////////////////////////			// 阁胶磐甫 眠啊窍绰 矫痢俊辑 捞亥飘 阁胶磐牢瘤 八荤甫 茄促.			///  7岿 1老磊肺 昏力 (岿靛呐 捞亥飘 场)			/*			if(rand()%g_pVariableManager->getEventRatio()==0 && 					g_pVariableManager->getEventActivate() == 1 )			{						pMonster->setEventMonsterFlag(true);				string MonsterName = g_pMonsterNameManager->getRandomName(pMonster, true);				pMonster->setName(MonsterName);				//cout << "捞亥飘 阁胶磐 捞抚: " << MonsterName;			}			*/			/////////////////////////////////////////////////////////////////////			try			{				m_pZone->addCreature(pMonster , x , y , Directions(rand()%8));			}			catch (EmptyTileNotExistException&)			{				//cerr << "MonsterManager::processCreatures() : 磊府啊 绝匙?" << endl;				SAFE_DELETE(pMonster);			}		}	}	if (g_pVariableManager->isActiveChiefMonster()		&& m_pEventMonsterInfo!=NULL)	{		Timeval currentTime;		getCurrentTime( currentTime );		//cout << "regenCheck [" << m_pZone->getZoneID() <<"] EventMonsterNum = "		//	<< m_pEventMonsterInfo->size() << " : "; 		for (uint i=0; i<m_pEventMonsterInfo->size(); i++)		{			EventMonsterInfo& info = (*m_pEventMonsterInfo)[i];			if (!info.bExist

⌨️ 快捷键说明

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