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

📄 monster.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	Assert(pCreature != NULL);	// 磊脚捞 酒聪搁.. by sigi. 2002.9.7	if (this==pCreature		|| !isRealEnemy(pCreature)) return;	// 且风 吧妨乐栏搁 努罚鸥涝 备盒 给 茄促.	if (!isFlag( Effect::EFFECT_CLASS_HALLUCINATION ) &&		pCreature->getClanType() == m_ClanType) return;	// peace俊 吧妨乐促搁..	if (isFlag(Effect::EFFECT_CLASS_PEACE))	{//		Effect* pEffect = pMonster->getEffectManager()->findEffect(EFFECT_CLASS_PEACE);		Effect* pEffect = m_pEffectManager->findEffect( Effect::EFFECT_CLASS_PEACE );		EffectPeace* pEffectPeace = dynamic_cast<EffectPeace*>(pEffect);		// peace牢 局绰 救 持绰促.		if (pCreature->getObjectID()==pEffectPeace->getPeaceCreatureID())		{			return;		}	}	// 泅犁 利 府胶飘俊 粮犁窍瘤 臼绰促搁, 利栏肺辑 牢侥窍绊 歹茄促.	list<ObjectID_t>::iterator itr = find(m_Enemies.begin(), m_Enemies.end(), pCreature->getObjectID());	if (itr == m_Enemies.end() && m_Enemies.size() < getMaxEnemies()) 	{		m_Enemies.push_back(pCreature->getObjectID());		// 犁固伙酒 -_-; 2002.7.22 by sigi		// 傈眉狼 利栏肺 牢侥矫难滚赴促.		// 何窍啊 缴秦辑 老窜 猾促.		// m_pZone->getMonsterManager()->addPotentialEnemy(this, pCreature);	}	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 漂沥 农府贸甫 利 府胶飘俊辑 昏力茄促.//////////////////////////////////////////////////////////////////////////////void Monster::deleteEnemy (ObjectID_t enemyID)	throw (NoSuchElementException , Error){	__BEGIN_TRY	list<ObjectID_t>::iterator itr = find(m_Enemies.begin(), m_Enemies.end() , enemyID);	if (itr == m_Enemies.end())	{		//cerr << "Monster::deleteEnemy() : NoSuchElementException" << endl;		//throw NoSuchElementException();		// exception 公矫. by sigi. 2002.10.7		return;	}	m_Enemies.erase(itr);	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// Enemy 吝俊辑 肺弊酒眶茄 PC 甫 昏力茄促.//////////////////////////////////////////////////////////////////////////////void Monster::verifyEnemies ()	throw (Error){	__BEGIN_TRY	list<ObjectID_t>::iterator before  = m_Enemies.end();	list<ObjectID_t>::iterator current = m_Enemies.begin();	Creature*                  pEnemy  = NULL;	while (current != m_Enemies.end())	{		// 农府贸啊 粮犁窍绰瘤 眉农茄促.		pEnemy = m_pZone->getCreature(*current);		if (pEnemy!=NULL)		{			if (!isRealEnemy(pEnemy))			{				m_Enemies.erase(current);				if (before == m_Enemies.end()) // first enemy				{					current = m_Enemies.begin();				}				else // !first enemy				{					current = before;					current ++;				}			}			else			{				// 粮犁窍搁 促澜 畴靛肺 逞绢埃促.				before = current ++;			}		} 		else		{			// 粮犁窍瘤 臼栏骨肺 昏力秦具 茄促.			m_Enemies.erase(current);			if (before == m_Enemies.end()) // first enemy			{				current = m_Enemies.begin();			}			else // !first enemy			{				current = before;				current ++;			}		}	}	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// PRIMARY ENEMY 甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////Creature* Monster::getPrimaryEnemy () const	throw (Error){	__BEGIN_TRY	__BEGIN_DEBUG	// by sigi. 2002.10.7	if (m_Enemies.empty())		return NULL;	Creature*  pEnemy    = NULL;	Distance_t dist      = 255;	Creature*  pCreature = NULL;	Distance_t newDist   = 255;	list<ObjectID_t>::const_iterator itr;	switch (getAttackOrder()) 	{		// 促澜 4 啊瘤 傍拜 鉴辑绰 捞固 利 府胶飘啊		// 鉴辑措肺 沥纺登绢 乐栏骨肺		// 府胶飘狼 front 俊 困摹窍绰 ENEMY 甫 府畔窍搁 等促.		case ATTACK_FIRST:		case ATTACK_LAST:		case ATTACK_STRONGEST:		case ATTACK_WEAKEST:			/*			try			{				pEnemy = m_pZone->getCreature(m_Enemies.front());			}			catch (NoSuchElementException& nsee)			{				//cerr << nsee.toString() << endl;				pEnemy = NULL;			}			*/			// NoSuch.. 力芭. by sigi. 2002.5.2			pEnemy = m_pZone->getCreature(m_Enemies.front());			break;		// 促澜 2 啊瘤 傍拜 鉴辑绰, 芭府啊 拌加 官差扁 锭巩俊 		// 亲惑 拌魂阑 秦拎具 茄促.		case ATTACK_CLOSEST :			dist = 255;			for (itr = m_Enemies.begin() ; itr != m_Enemies.end() ; itr ++) 			{				/*				try				{					pCreature = m_pZone->getCreature(*itr);				}				catch (NoSuchElementException& nsee)				{					//cerr << nsee.toString() << endl;					pCreature = NULL;				}				*/								// NoSuch.. 力芭. by sigi. 2002.5.2				pCreature = m_pZone->getCreature(*itr);				if (pCreature != NULL)				{					newDist = pCreature->getDistance(m_X , m_Y);					if (newDist < dist) // 芭府啊 歹 啊鳖匡 版快					{							dist = newDist;						pEnemy = pCreature;					}				}			}			break;		case ATTACK_FAREST :			dist = 0;			for (itr = m_Enemies.begin() ; itr != m_Enemies.end() ; itr ++) 			{				/*				try				{					pCreature = m_pZone->getCreature(*itr);				}				catch (NoSuchElementException& nsee)				{					//cerr << nsee.toString() << endl;					pCreature = NULL;				}				*/				// NoSuch.. 力芭. by sigi. 2002.5.2				pCreature = m_pZone->getCreature(*itr);				if (pCreature != NULL)				{					newDist = pCreature->getDistance(m_X , m_Y);					if (newDist > dist) // 芭府啊 歹 钢 版快					{							dist = newDist;						pEnemy = pCreature;					}				}			}			break;		case ATTACK_FIGHTER :		case ATTACK_PRIEST :		case ATTACK_GUNNER :		default :			throw Error("invalid attack order");	}	if (pEnemy == NULL)	{		//cerr << "<ENEMY NULL ERROR>" << endl;		//cerr << "Monster's AttackOrder : " << AttackOrder2String[getAttackOrder()] << endl;		//cerr << "Enemy's ObjectID : " << m_Enemies.front();	}	return pEnemy;	__END_DEBUG	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 利 府胶飘狼 漂沥 困摹狼 农府贸狼 酒捞叼甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////ObjectID_t Monster::getEnemy (EnemyPriority enemyPriority) const	throw (NoSuchElementException , Error){	__BEGIN_TRY	EnemyPriority ep = ENEMY_PRIMARY;	list<ObjectID_t>::const_iterator itr = m_Enemies.begin();	for (; itr != m_Enemies.end(); itr++) 	{		if (enemyPriority == ep) return *itr;		ep = EnemyPriority(ep+1);	}	cerr << "Monster::getEnemy() : NoSuchElementException" << endl;	throw NoSuchElementException();	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 茄 阁胶磐啊 扁撅且 荐 乐绰 弥措 阁胶磐狼 俺荐//// *CAUTION*//// 轨颇捞绢狼 瓷仿摹狼 弥措蔼篮 255 捞促. 捞 弥措蔼阑 官帕栏肺 扁撅樊阑// 魂沥秦焊搁...////   0 -  30     : ENEMY_PRIORITY//  30 -  60     : ENEMY_SECONDARY//  60 -  90     : ENEMY_THIRD//  90 - 120     : ENEMY_FOURTH// 120 - 150     : ENEMY_FIFTH// 150 - 180     : ENEMY_SIXTH// 180 - 210     : ENEMY_SEVENTH// 210 - maxAttr : ENEMY_EIGHTH//////////////////////////////////////////////////////////////////////////////uint Monster::getMaxEnemies () const	throw (){	return (m_INT < 210) ? (m_INT / 30 + 1) : 8 ;}//////////////////////////////////////////////////////////////////////////////// get debug string//////////////////////////////////////////////////////////////////////////////string Monster::toString () const	throw (){	__BEGIN_TRY	StringStream msg;	__BEGIN_DEBUG	msg << "Monster("		<< "ObjectID:"     << (int)getObjectID()		<< ",MonsterType:" << (int)m_MonsterType		<< ",SpriteType:"  << (int)getSpriteType()		<< ",Name:"        << getName()		<< ",Level:"       << (int)getLevel()		<< ",STR:"         << (int)m_STR		<< ",DEX:"         << (int)m_DEX		<< ",INT:"         << (int)m_INT		<< ",HP:"          << (int)m_HP[ATTR_CURRENT] << "/" << (int)m_HP[ATTR_MAX]		<< ",MainColor:"   << (int)getMainColor()		<< ",SubColor:"    << (int)getSubColor()		<< ",Alignment:"   << MAlignment2String[getAlignment()]		<< ",AttackOrder:" << AttackOrder2String[getAttackOrder()]		<< ",Moral:"       << (int)m_Moral		<< ",Delay:"       << (int)m_Delay		<< ",Enemies(";	for (list<ObjectID_t>::const_iterator itr = m_Enemies.begin() ; itr != m_Enemies.end() ; itr ++)		msg << (int)(*itr) << " ";	msg << ")"		<< ",X:"      << (int)m_X		<< ",Y:"      << (int)m_Y		<< ",Sight :" << (int)m_Sight		<< ")";	__END_DEBUG	return msg.toString();	__END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Monster::setDamaged(bool value)	throw(){	__BEGIN_TRY	// AI啊 乐促搁..	if (m_pBrain!=NULL)	{		m_pBrain->setDamaged(value);	}	__END_CATCH}void Monster::addPrecedence(const string & Name, int PartyID, int damage){	m_PrecedenceTable.addPrecedence(Name, PartyID, damage);}int Monster::getOustersExp( Ousters* pOusters ){	int total = computeCreatureExp( this, 100 );	double percent = m_PrecedenceTable.getDamagePercent( pOusters->getName(), pOusters->getPartyID() );//	return (int)((double)total * percent) * 1.4;	return (int)((double)total * percent);}/*void Monster::addPrecedence(Creature* pCreature, int damage){	Assert(pCreature != NULL);	m_PrecedenceTable.addPrecedence(pCreature, damage);}*/void Monster::clearEnemyLimitTime() throw() { 	getCurrentTime(m_EnemyLimitTime); 		m_EnemyLimitTime.tv_sec += g_pVariableManager->getEnemyLimitTime();	m_EnemyLimitTime.tv_usec=0; }bool Monster::hasNextMonsterSummonInfo()	throw (Error){	__BEGIN_TRY	const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( m_MonsterType );	Assert(pMonsterInfo!=NULL);	if (pMonsterInfo->hasNextMonsterSummonInfo( m_MonsterSummonStep ))	{		return true;	}	__END_CATCH	return false;}bool Monster::getMonsterSummonInfo(SUMMON_INFO2& summonInfo) 	throw (Error){	__BEGIN_TRY	const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( m_MonsterType );	Assert(pMonsterInfo!=NULL);	if (pMonsterInfo->getMonsterSummonInfo( m_MonsterSummonStep, summonInfo ))	{		// 促澜 窜拌狼 家券阑 霖厚茄促.		m_MonsterSummonStep ++;		return true;	}	__END_CATCH	return false;}////////////////////////////////////////////////////////////////////////////////// isEnemyToAttack////////////////////////////////////////////////////////////////////////////////// 捞 阁胶磐俊霸 乐绢辑 利牢啊 酒囱啊甫 魄窜窍绰 窃荐//// 颇萍/辨靛/悼辆练牢 版快绰 傍拜窍瘤 臼绰促.////////////////////////////////////////////////////////////////////////////////bool Monster::isEnemyToAttack(Creature* pCreature) const{	if (pCreature->isFlag(Effect::EFFECT_CLASS_GHOST))		return false;	if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION))		return true;	if (pCreature->isDead()		|| pCreature->isFlag(Effect::EFFECT_CLASS_COMA))		return false;	if (pCreature->isSlayer())	{		Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);		return isEnemyToAttack( pSlayer );	}	else if (pCreature->isVampire())	{		Vampire* pVampire = dynamic_cast<Vampire*>(pCreature);		return isEnemyToAttack( pVampire );	}	else if (pCreature->isOusters())	{		// 老窜篮 货肺 窃荐 眠啊 救窍绊 弊成 埃促.		return true;	}	else if (pCreature->isMonster())	{		Monster* pMonster = dynamic_cast<Monster*>(pCreature);		return isEnemyToAttack( pMonster );	}	return false;}// 捞 阁胶磐啊 pSlayer甫 傍拜秦档 登绰啊?bool Monster::isEnemyToAttack(Slayer* pSlayer) const{	if (pSlayer->isFlag(Effect::EFFECT_CLASS_GHOST))		return false;	if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION))		return true;	if (pSlayer->isDead()		|| pSlayer->isFlag(Effect::EFFECT_CLASS_COMA))		return false;	// 瘤陛篮 公炼扒 浇饭捞绢绰 傍拜秦档 等促.	return true;	}// 捞 阁胶磐啊 pVampire甫 傍拜秦档 登绰啊?bool Monster::isEnemyToAttack(Vampire* pVampire) const{	if (pVampire->isFlag(Effect::EFFECT_CLASS_GHOST))		return false;	if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION))		return true;	if (pVampire->isDead()		|| pVampire->isFlag(Effect::EFFECT_CLASS_COMA))		return false;	// 瘤陛篮 公炼扒 轨颇捞绢绰 傍拜秦档 等促.	return true;	}// 捞 阁胶磐啊 pMonster甫 傍拜秦档 登绰啊?bool Monster::isEnemyToAttack(Monster* pMonster) const{	if (m_Flag.test(Effect::EFFECT_CLASS_HALLUCINATION))		return true;	// 鞍篮 clan 家加 阁胶磐搁 傍拜窍瘤 臼绰促.	// 唱吝俊绰.. 穿焙啊狼 疙飞?俊 狼秦辑 傍拜罐阑 荐档 乐栏骨肺	// m_Ememies甫 八祸秦辑 眉农秦具瞪 淀. -_-;	// 傲 且风 吧赴仇篮 嘎酒档 轿促~ 盔贰绰 m_Enemies 八祸秦具 登绰 巴 鞍篮单 蠢妨辑 盔 -_-	if (pMonster->isDead() 		|| pMonster->isFlag(Effect::EFFECT_CLASS_COMA)		|| (!pMonster->isFlag(Effect::EFFECT_CLASS_HALLUCINATION) && pMonster->m_ClanType==m_ClanType)	)		return false;	return true;}bool Monster::canMove(ZoneCoord_t nx, ZoneCoord_t ny) const throw(Error){	return (Creature::canMove(nx, ny) && !(m_pZone->getZoneLevel(nx, ny) & SAFE_ZONE));}void Monster::setBrain(MonsterAI* pBrain){ 	removeBrain(); 	m_pBrain = pBrain; }void Monster::removeBrain(){ 	SAFE_DELETE(m_pBrain); }void Monster::deleteAllEnemy() 	throw(Error){	m_Enemies.clear();}Race_t Monster::getRace() const{	// 唱吝俊.. 阁胶磐 辆幅俊 蝶扼辑 促福霸 秦具摆瘤	return RACE_VAMPIRE;}

⌨️ 快捷键说明

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