📄 pet.cpp
字号:
/**************************************************************************
*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 + -