174 lines
4.6 KiB
C++
174 lines
4.6 KiB
C++
#include "StdAfx.h"
|
|
|
|
void CPetAi::UpdateAI(TICKCOUNT tick)
|
|
{
|
|
CPet *pPet = ((CPet*)m_pSelf);
|
|
CActor *pActor= pPet->GetMaster(); //获取宠物的主人
|
|
if(pActor ==NULL) return;
|
|
//如果宝宝是停留状态,那么就不移动了
|
|
if(pPet->GetBattleStatus() == CPet::PET_BATTLE_STATUE_STAY)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Inherid::UpdateAI(tick);
|
|
|
|
if(m_t1minute.CheckAndSet(tick, true))
|
|
{
|
|
m_avoidMap.clear();
|
|
}
|
|
|
|
INT_PTR nDisSquare = m_pSelf->GetEntityDistanceSquare( pActor); //获取距离的平方
|
|
|
|
//如果宠物在战斗中,并且距离超过了一定的值,那么将直接向
|
|
if( m_pSelf->HasState(esStateBattle) )
|
|
{
|
|
if(nDisSquare >= m_petTransferDisSquare || pActor->GetScene() != m_pSelf->GetScene())
|
|
{
|
|
m_pSelf->MoveToEntity(pActor); //直接传送到那个地方
|
|
if ( m_pSelf->GetMoveSystem()->GetMotionType() != CMovementSystem::mtMotionTypeFollow )
|
|
{
|
|
m_pSelf->GetMoveSystem()->MoveFollow(pActor,0);
|
|
}
|
|
}
|
|
/*
|
|
if(nDisSquare >= m_petBattleFollowDis )
|
|
{
|
|
EnterEvadeMode();//推出战斗
|
|
if( m_pSelf->GetMoveSystem()->GetMotionType() != CMovementSystem::mtMotionTypeFollow)
|
|
{
|
|
m_pSelf->GetMoveSystem()->MoveFollow(pActor);
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
if(m_followMasterTime <= GetLogicCurrTickCount())
|
|
{
|
|
//如果和主人的距离过大,传送到主人的身边
|
|
if(nDisSquare >= m_petTransferDisSquare || pActor->GetScene() != m_pSelf->GetScene())
|
|
{
|
|
m_pSelf->MoveToEntity(pActor,0,0,1); //直接传送到那个地方
|
|
if ( m_pSelf->GetMoveSystem()->GetMotionType() != CMovementSystem::mtMotionTypeFollow )
|
|
{
|
|
m_pSelf->GetMoveSystem()->MoveFollow(pActor,0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( m_pSelf->GetMoveSystem()->GetMotionType() != CMovementSystem::mtMotionTypeFollow )
|
|
{
|
|
m_pSelf->GetMoveSystem()->MoveFollow(pActor,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void CPetAi::OnChangeStayToFollow()
|
|
{
|
|
CPet *pPet = ((CPet*)m_pSelf);
|
|
CActor *pActor= pPet->GetMaster(); //获取宠物的主人
|
|
if(pActor ==NULL) return;
|
|
INT_PTR nDisSquare = m_pSelf->GetEntityDistanceSquare( pActor); //获取距离的平方
|
|
//如果和主人的距离过大,传送到主人的身边
|
|
if(nDisSquare >= m_petTransferDisSquare || pActor->GetScene() != m_pSelf->GetScene())
|
|
{
|
|
m_pSelf->MoveToEntity(pActor); //直接传送到那个地方
|
|
}
|
|
if( m_pSelf->HasState(esStateBattle) )
|
|
{
|
|
if(nDisSquare >= m_petBattleFollowDis )
|
|
{
|
|
EnterEvadeMode();//推出战斗
|
|
m_pSelf->GetMoveSystem()->MoveFollow(pActor,0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( m_pSelf->GetMoveSystem()->GetMotionType() != CMovementSystem::mtMotionTypeFollow)
|
|
{
|
|
m_pSelf->GetMoveSystem()->MoveFollow(pActor,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void CPetAi::initialize(PAICONFIG pAiconfig)
|
|
{
|
|
//是否是一个宠物的ai
|
|
Inherid::initialize(pAiconfig);
|
|
|
|
if(m_pSelf->GetType() != enPet)
|
|
{
|
|
OutputMsg( rmError,_T("Pet ai init error,not a pet"));
|
|
}
|
|
//初始化这3个属性
|
|
m_petBattleFollowDis = pAiconfig->bBattleFollowDis * pAiconfig->bBattleFollowDis ;
|
|
m_petTransferDisSquare = pAiconfig->bTransferDis * pAiconfig->bTransferDis ;
|
|
m_followMasterTime =0;
|
|
m_avoidMap.clear();
|
|
m_t1minute.Reset();
|
|
}
|
|
void CPetAi::EnterEvadeMode()
|
|
{
|
|
if( m_pSelf->HasState(esStateDeath) ) return; //死了不回归
|
|
m_pSelf->RemoveState(esStateBattle); //删除战斗模式
|
|
m_pSelf->SetTarget(NULL);
|
|
if (m_pSelf->GetMoveSystem()->GetMotionType() == CMovementSystem::mtMotionTypeChase)
|
|
{
|
|
m_pSelf->GetMoveSystem()->PopCurrentMotionState();
|
|
}
|
|
m_followMasterTime =GetLogicCurrTickCount() + m_pAiConfig->petFollowMasterTime; //脱离战斗3秒以后将走向主人
|
|
}
|
|
|
|
void CPetAi::AttackedBy(CAnimal * pAttacker, bool boInherit)
|
|
{
|
|
CPet *pPet = (CPet*)m_pSelf;
|
|
if (pAttacker == m_pSelf) return;
|
|
if (pAttacker == pPet->GetMaster()) return;
|
|
|
|
if(IsInAvoidMap(pAttacker->GetHandle())) return;
|
|
|
|
if(pPet->GetBattleStatus() == CPet::PET_BATTLE_STATUE_STAY)
|
|
{
|
|
return;
|
|
}
|
|
Inherid::AttackedBy(pAttacker);
|
|
/*
|
|
CPet *pSelfPet = ((CPet*)m_pSelf);
|
|
if (!boInherit)
|
|
{
|
|
return;
|
|
}
|
|
INT_PTR nSelfId = pSelfPet->GetPetId();
|
|
CActor *pActor= pSelfPet->GetMaster(); //获取宠物的主人
|
|
if(pActor ==NULL) return;
|
|
CPetSystem & petSystem =pActor->GetPetSystem();
|
|
INT_PTR nPetCount= petSystem.GetPetCount();
|
|
//if(nPetCount <=1) return; //只有一个宠物
|
|
CPetSystem::PETDATA *pPetData =NULL;
|
|
//如果一个宠物被攻击要通知他的伙伴
|
|
for(INT_PTR i=0; i< nPetCount; i++)
|
|
{
|
|
pPetData = petSystem.GetPetData(i);
|
|
if(pPetData && pPetData->nId != nSelfId)
|
|
{
|
|
CPet *pPet =(CPet*)GetEntityFromHandle(pPetData->handle);
|
|
if(pPet && pPet != pSelfPet && pPet->GetLiveTime() == 0)
|
|
{
|
|
if(!pPet->HasState(esStateBattle))
|
|
{
|
|
pPet->GetAI()->AttackedBy(pAttacker, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
}
|