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

📄 pet.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/**************************************************************************
*void CPet::AttackAI_7()	lw
*攻击视野范围内的怪物,优先攻击正在攻击自己的敌人,其次优先攻击正在攻击主人的敌人。
**************************************************************************/
void CPet::AttackAI_7()	
{
	// 以攻击自己者为目标
	OBJID id = this->GetIDWhoAttackMe();
	// 如果没有攻击自己的目标,找攻击Hero者为目标
	if(id == ID_NONE)
		id = g_objHero.GetIDWhoAttackMe();
	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(id);
	
	if(pPlayer && !pPlayer->IsDead())
	{
		m_idTarget = pPlayer->GetID();
	}
	else
	{
		int nAmount = g_objPlayerSet.GetPlayerAmount();
		for(int i = 0;i < nAmount ;i++)
		{
			pPlayer = g_objPlayerSet.GetPlayerByIndex(i);		
			if(pPlayer&& !pPlayer->IsDead() && pPlayer->IsMonster()&&!pPlayer->IsGuard ())
			{
				m_idTarget = pPlayer->GetID();				
				return;
			}
		}
	}
}
/**************************************************************************
*void CPet::AttackAI_8()	lw
*攻击视野内的任何敌人,没有固定攻击目标,每次都随机攻击视野范围内的一个敌人。
**************************************************************************/
void CPet::AttackAI_8()
{
	// 先查找攻击Hero者
	OBJID id = g_objHero.GetIDWhoAttackMe();
	// 如查没有,查找攻击自己者
	if(id == ID_NONE)
		id = this->GetIDWhoAttackMe();
	if(id == ID_NONE)
		return;
	int nAmount = g_objPlayerSet.GetPlayerAmount();
	CPlayer* pPlayer = g_objPlayerSet.GetPlayerByIndex(RandGet(nAmount));
	if(!pPlayer)
		return;
	if(pPlayer->IsDead())
		return;
	if(this->CheckEnemy(pPlayer))
		m_idTarget = id;
}
/**************************************************************************
*void CPet::AttackAI_9()	lw
*目标靠近自己5格就会跑开5格,然后再攻击。(始终保持跟目标距离5格以上。
**************************************************************************/
void CPet::AttackAI_9()
{
	if(m_idTarget == ID_NONE)
		return;
	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget);
	CMyPos posTarget,posPet;
	
	pPlayer->GetPos(posTarget);
	this->GetPos(posPet);
    const int MIN_DISTANCE = 5;
	if(g_objGameMap.GetDistance(posTarget.x,posTarget.y,posPet.x,posPet.y) <= MIN_DISTANCE)
	{		
		CMyPos posMove,posHero;
		g_objHero.GetPos(posHero);
		int nDir = g_objGameMap.GetDirection(posHero.x,posHero.y,posTarget.x,posTarget.y);
		CellInfo* pCellInfo = NULL;
		//如果在一个方向上找到的位置不可达,则找下一个方向,最多找五次
		for(int i = 0;i < 5;i++)
		{		
			posMove.x = posTarget.x + _DELTA_X[nDir]*MIN_DISTANCE;
			posMove.y = posTarget.y + _DELTA_Y[nDir]*MIN_DISTANCE;
			//       OBJID id = m_idTarget;
			pCellInfo = g_objGameMap.GetCell(posMove.x, posMove.y);
			if(!pCellInfo || g_objGameMap.GetGroundMask(pCellInfo) == 1)
				nDir = (++nDir)%8;
			else
				break;
		}
		//如果找到可移动的位置,则走到目标处
		if(pCellInfo&&g_objGameMap.GetGroundMask(pCellInfo) != 1)
			this->Run(posMove.x,posMove.y);
		//		m_idTarget = id;
	}		
}
/**************************************************************************
*void CPet::AttackAI_10()	lw
*每攻击一次就随机朝8个方向中的一个方向移动3格,但不会离开主人10格的范围。
**************************************************************************/
void CPet::AttackAI_10()
{
	if(m_idTarget == ID_NONE)
		return;
	const int MAX_SEARCH = 5,MOVE_DISTANE = 3;
	CellInfo* pCellInfo = NULL;
	int nDir = RandGet(8);
	CMyPos posMove,posPet,posHero;
	g_objHero.GetPos(posHero);
	//如果在一个方向上找到的位置不可达,则找下一个方向,最多找五次
	for(int i =0;i < MAX_SEARCH;i++)
	{
		this->GetPos(posPet);
        posMove.x = posPet.x + _DELTA_X[nDir]*MOVE_DISTANE;
		posMove.y = posPet.y + _DELTA_Y[nDir]*MOVE_DISTANE;
		//       OBJID id = m_idTarget;	
		pCellInfo = g_objGameMap.GetCell(posMove.x, posMove.y);
		if(!pCellInfo || g_objGameMap.GetGroundMask(pCellInfo) == 1||
			g_objGameMap.GetDistance(posMove.x,posMove.y,posHero.x,posHero.y)>10)		
		{
			nDir = (++nDir)%8;
		}
		else
			break;
	}
	//如果找到可移动的位置,则走到目标处
	if(pCellInfo&&g_objGameMap.GetGroundMask(pCellInfo) != 1 )
	{
		this->Run(posMove.x,posMove.y);
#ifdef LW_DEBUG
		static int n = 0;
		n++;
		g_objGameMsg.AddMsg(_TXTATR_TALK,"执行attack_10次数:%d\n",n);
#endif
	}
}
/**************************************************************************
*void CPet::AttackAI_11()	lw
*始终在主人身边3格内,不会离开这个范围。如果那几格不能停留就往外算
**************************************************************************/
void CPet::AttackAI_11()
{
	const int MAX_DISTANCE = 3;
	CMyPos posHero, posPet;
	g_objHero.GetPos(posHero);
	this->GetPos(posPet);
	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(posPet.x, posPet.y);
	
	if(abs(posHero.x - posPet.x) <= MAX_DISTANCE && abs(posHero.y - posPet.y) <= MAX_DISTANCE )
	{
		m_nBehaviorType = _PET_BEHAVIOR_READY;
	}
	else if(!this->IsMoving())
	{
		CMyPos posPetTarget;
		int nDir = ::RandGet(8);
		posPetTarget.x = posHero.x + _DELTA_X[nDir]*3-::RandGet(2);
		posPetTarget.y = posHero.y + _DELTA_Y[nDir]*3-::RandGet(2);
		
		CellInfo* pCellInfo = g_objGameMap.GetCell(posPet.x, posPet.y);
		if(!pCellInfo || 
			g_objGameMap.GetGroundMask(pCellInfo) == 1 )
			return;
		
		if (abs(posHero.x - posPet.x) < 8 && abs(posHero.y - posPet.y) < 8)
		{
			this->Run(posPetTarget.x, posPetTarget.y);
		}
		else
		{
			this->Transfer(posPetTarget.x, posPetTarget.y);
		}
	}
}
/**************************************************************************
*void CPet::AttackAI_12()	lw
*在主人移动的时候,有敌人靠近主人8格内,但在5格外的时候,则在敌人靠近的那个方
*向离主人4格内巡逻。每隔3秒巡逻一次。如果有敌人靠近主人5格内,则这条无效。
**************************************************************************/
void CPet::AttackAI_12()
{
	//	if(_COMMAND_STANDBY == g_objHero.GetLastCommand())
	//		return;
	CMyPos posHero, posFind,posTarget;
	g_objHero.GetPos(posHero);
	CPlayer* pPlayer;
	bool isPatrol = false;
	//查找是否有敌人靠近主人5格内,有则返回
	for(int i =0;i < g_objPlayerSet.GetPlayerAmount();i++)
	{
		pPlayer = g_objPlayerSet.GetPlayerByIndex(i);
		if(pPlayer && this->CheckEnemy(pPlayer))
		{
			pPlayer->GetPos(posFind);
			if(abs(posHero.x - posFind.x) < 5 && abs(posHero.y - posFind.y) < 5)
				return;
			if(!isPatrol && abs(posHero.x - posFind.x) < 8 && abs(posHero.y - posFind.y) < 8)
			{
				posTarget = posFind;
				isPatrol = true;
			}
		}
	}
	//如果没有八格以内的敌人,也不要巡逻,返回
	if(!isPatrol)
		return;
	// set command of role
	//	int nDistance = g_objGameMap.GetDistance(posHero.x,posHero.y,posTarget.x,posTarget.y);
	isPatrol = false;
	int nDir = g_objGameMap.GetDirection(posHero.x,posHero.y,posTarget.x,posTarget.y);
	CellInfo* pCellInfo = NULL;
	CMyPos posMove;
	for(i = 0;i < 3;i++)
	{	
		posMove.x = posHero.x + _DELTA_X[nDir]*(abs(posHero.x-posTarget.x)/2+i);
		posMove.y = posHero.y + _DELTA_Y[nDir]*(abs(posHero.y - posTarget.y)/2+i);
		pCellInfo = g_objGameMap.GetCell(posMove.x, posMove.y);
		if(pCellInfo&&g_objGameMap.GetGroundMask(pCellInfo) != 1)	
		{
			isPatrol = true;
			break;
		}
	}
	//如果找到可移动的位置,则走到目标处
	if(isPatrol)
	{
		this->Run(posMove.x,posMove.y);
#ifdef LW_DEBUG
		static int n = 0;
		n++;
		g_objGameMsg.AddMsg(_TXTATR_TALK,"执行attack_12次数:%d\n",n);
#endif
	}
	CCommand cmd;
	cmd.iType			=_COMMAND_STANDBY;
	cmd.iStatus			=_CMDSTATUS_BEGIN;
	cmd.posTarget.x		=0;
	cmd.posTarget.y		=0;
	cmd.dwData			=::TimeGet();	
	this->SetCommand(&cmd);		
}
/**************************************************************************
*void CPet::AttackAI_13()	lw
*当主人长距离移动时,始终在主人身边6格内,不会离开这个范围。如果超过这个距离,则会跟上去。
**************************************************************************/
void CPet::AttackAI_13()
{
    ProcessAI_FindHost();
}
/**************************************************************************
*void CPet::AttackAI_14()	lw
*没有攻击目标时会坐在离主人8格内的地方休息。
**************************************************************************/
void CPet::AttackAI_14()
{
	//如果有目标则返回
	if(m_idTarget)
		return;
	// set command of role
	CCommand cmd;
	cmd.iType		=_COMMAND_EMOTION;
	cmd.iStatus		=_CMDSTATUS_BEGIN;
	cmd.nData		=_ACTION_SITDOWN;	
	this->SetCommand(&cmd);
}
/**************************************************************************
*void CPet::AttackAI_15()	lw
*被攻击的时候有70%的机率移开5格,有30%的机率攻击。
**************************************************************************/
void CPet::AttackAI_15()
{
	OBJID id  = this->GetIDWhoAttackMe();
	if(id == ID_NONE)
		return;
	if(RandGet(100) >= 70)
	{
#ifdef LW_DEBUG
		g_objGameMsg.AddMsg(_TXTATR_TALK,"AttackAI_15 攻击\n");
#endif	
		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(id);
		if(!pPlayer)
			return;
		if(pPlayer->IsDead())
			return;
		if(this->CheckEnemy(pPlayer))
			m_idTarget = id;
	}
	else
	{
		CMyPos posMove,posTarget,posPet;
		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(id);
		if(!pPlayer)
			return;
		pPlayer->GetPos(posTarget);
		this->GetPos(posPet);
		int nDir = g_objGameMap.GetDirection(posTarget.x,posTarget.y,posPet.x,posPet.y);
		CellInfo* pCellInfo = NULL;
		for(int i =0;i < 3;i++)
		{
			this->GetPos(posPet);
			posMove.x = posPet.x + _DELTA_X[nDir]*5;
			posMove.y = posPet.y + _DELTA_Y[nDir]*5;
			pCellInfo = g_objGameMap.GetCell(posMove.x, posMove.y);
			if(!pCellInfo || g_objGameMap.GetGroundMask(pCellInfo) == 1	)		
			{
				//只查找三个方向,目标和自己连线上的方向、相邻的左右方向
				if(i == 1)
					nDir = (nDir+1)%8;
				else if(i==2)
					nDir = (nDir-2)%8;
			}
			else
				break;
		}
		//如果找到可移动的位置,则走到目标处
		if(pCellInfo&&g_objGameMap.GetGroundMask(pCellInfo) != 1 )
		{
			this->Run(posMove.x,posMove.y);
			this->SetIDWhoAttackMe(ID_NONE);
			m_idTarget = ID_NONE;
#ifdef LW_DEBUG
			static int n = 0;
			n++;
			g_objGameMsg.AddMsg(_TXTATR_TALK,"执行attack_15移开:%d\n",n);
#endif
		}
	}
}
/**************************************************************************
*void CPet::AttackAI_25 (int nMethod)	lw
**************************************************************************/
void    CPet::AttackAI_25()
{	
	OBJID idAttack;	
    idAttack = g_objHero.GetIDMyTarget();
	if (idAttack&&g_objPlayerSet.GetPlayer(idAttack)&&!g_objPlayerSet.GetPlayer(idAttack)->IsDead())
	{
		m_idTarget = idAttack;return;			
	}
	idAttack = g_objHero.GetIDWhoAttackMe();	//查找正在攻击主人的怪物
	if (idAttack&&g_objPlayerSet.GetPlayer(idAttack)&&!g_objPlayerSet.GetPlayer(idAttack)->IsDead())
	{
		m_idTarget = idAttack;return;			
	}	
	idAttack = this->GetIDWhoAttackMe();		//攻击自己的幻兽
	if (idAttack&&g_objPlayerSet.GetPlayer(idAttack)&&!g_objPlayerSet.GetPlayer(idAttack)->IsDead())
	{
		m_idTarget = idAttack;return;			
	}	
	int nAmount = g_objHero.GetCallPetAmount();
	for(int i=0 ;i < nAmount ; i++)
	{
		CPet* pPet = g_objHero.GetPetByIndex(i);
		if (pPet && pPet->GetID() != this->GetID())	//查找正在攻击主人别的幻兽的怪物			 
		{
			idAttack = pPet->GetIDWhoAttackMe();
			CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idAttack);
			if (idAttack&&pPlayer&&!pPlayer->IsDead())
			{
				m_idTarget = idAttack;return;			
			}
		}
	}
	m_idTarget = NULL;
}
/**************************************************************************
*void CPet::AttackAI_16To24 (int nMethod)	lw
**************************************************************************/
void CPet::AttackAI_16To24 (int nMethod)
{
	OBJID id = g_objHero.GetIDWhoAttackMe();
	if(id == ID_NONE)
		id = m_idHeroTarget;
	if(id == ID_NONE)
		return;
	CPlayer* pPet,*pPlayer = g_objPlayerSet.GetPlayer(id);
	
	if(!pPlayer||!pPlayer->IsPlayer()||pPlayer->IsDead())
		return;
	if(nMethod != 24)
	{
		int nAmount = g_objPlayerSet.GetPlayerAmount();
		OBJID idPet;
		bool isFind = false;
		//查找属于指定玩家的特定类型的幻兽
		for(int n = 0;n < nAmount;n++)
		{
			pPet = g_objPlayerSet.GetPlayerByIndex(n);
			if(!pPet)
				continue;
			if(pPet->IsPet() && pPet->GetPetOwnerId() == pPlayer->GetID())
			{
				idPet = pPet->GetMonsterTypeId();
				if(idPet == ID_NONE)
					continue;
			}
			else
				continue;			
			if(nMethod ==16)//速度型幻兽
			{
				if(idPet==90022||idPet==90023||idPet==90111||
					idPet==90112||idPet==90113||idPet==90114||
					idPet==90115||idPet==90116||idPet==90117||
					idPet==90118
					)
				{
					isFind = true;
					break;
				}
			}
			else if(nMethod == 17)//魔法型幻兽
			{
				if(idPet==90008||idPet==90028||idPet==90029||
					idPet==90141||idPet==90142||idPet==90143||
					idPet==90144||idPet==90145||idPet==90146||
					idPet==90147||idPet==90148	
					)
				{
					isFind = true;
					break;
				}
			}
			else if(nMethod == 18)//保护型幻兽
			{
				if(idPet==90012||idPet==90032||idPet==90033||
					idPet==90161||idPet==90162||idPet==90163||
					idPet==90164||idPet==90165||idPet==90166||
					idPet==90167||idPet==90168	
					)
				{
					isFind = true;
					break;
				}					
			}
			else if(nMethod == 19)//攻击型幻兽
			{
				if(idPet==90000||idPet==90020||idPet==90021||
					idPet==90101||idPet==90102||idPet==90103||
					idPet==90104||idPet==90105||idPet==90106||
					idPet==90107||idPet==90108
					)
				{
					isFind = true;
					break;
				}					
			}
			else if(nMethod == 20)//防御型幻兽
			{
				if(idPet==90010||idPet==90030||idPet==90031||
					idPet==90151||idPet==90152||idPet==90153||
					idPet==90154||idPet==90155||idPet==90156||
					idPet==90157||idPet==90158
					)
				{
					isFind = true;
					break;
				}					
			}
			else if(nMethod == 21)//附身型幻兽
			{
				if(idPet==90014||idPet==90034||idPet==90035||
					idPet==90171||idPet==90172||idPet==90173||
					idPet==90174||idPet==90175||idPet==90176||
					idPet==90177||idPet==90178
					)
				{
					isFind = true;
					break;
				}					
			}
			else if(nMethod == 22)//爆破型幻兽
			{
				if(idPet==90004||idPet==90024||idPet==90025||
					idPet==90121||idPet==90122||idPet==90123||
					idPet==90124||idPet==90125||idPet==90126||
					idPet==90127||idPet==90128
                    )
				{
					isFind = true;
					break;
				}					
			}
			else if(nMethod == 23)//变异型幻兽
			{
				if(idPet==90006||idPet==90026||idPet==90027||
					idPet==90131||idPet==90132||idPet==90133||
					idPet==90134||idPet==90135||idPet==90136||
					idPet==90137||idPet==90138
					)
				{
                    isFind = true;
                    break;
				}
			}
		}
		if(isFind)
			m_idTarget = pPet->GetID();
	}
	else//如果主人在攻击其他玩家或被其他玩家攻击的时候。攻击这个玩家。	
	{
		m_idTarget = id;
	}	
}

⌨️ 快捷键说明

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