Files
mir_server/server/LogicServer/ai/AnimalAI.h

218 lines
4.8 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/*
*AI的基类
*NPC都可能执行AI的操作Creature里放一个CCreatureAI的指针
*
*/
typedef Handle<BYTE>AiIndex; //ai的指针
#define MAX_RESEL_TARGET_RATE 100
class CAnimalAI
{
public:
CAnimalAI()
{
m_pSelf =NULL;
m_pAiConfig =NULL;
m_wReSelTargetRate = 0;
m_bInFollowingStats = false;
}
/*
* Comments:
* @Return void:
*/
virtual void initialize(PAICONFIG pAiconfig);
/*
* Comments: AI行为
* @Return void:
*/
virtual void EnterInitAI();
/*
* Comments: AI
* Param TICKCOUNT nCurrentTik:tick
* @Return void:
*/
virtual void UpdateAI(TICKCOUNT nCurrentTick);
/*
* Comments:
* @Return void:
*/
void EntityDestroy();
/*
* Comments:
* Param CCreature * pTarget:
* @Return void:
*/
virtual void AttackStart(CAnimal * pTarget);
/*
* Comments:
* Param CAnimal * pTarget:
* @Return void:
*/
virtual void AttackStop(CAnimal * pTarget);
/*
* Comments:
* Param CAnimal * pAttacker:
* @Return void:
*/
virtual void AttackedBy(CAnimal * pAttacker, bool boInherit = true) ;
/*
* Comments:
* Param CAnimal *pAttacker:
* @Return void:
*/
virtual void KillBy(CAnimal *pAttacker =NULL) ;
/*
* Comments:
* Param CAnimal *:
* @Return void:
*/
virtual void KillOther(CAnimal *){}
/*
* Comments:
* Param CAnimal *:
* @Return void:
*/
virtual void MoveInSight(CAnimal *pEntity,INT_PTR nPosX,INT_PTR nPosY ){}
/*
* Comments:
* Param CAnimal * pAttacker:
* Param nDamageValue:
* @Return void:
*/
virtual void DamageBy(CAnimal * pAttacker,INT_PTR nDamageValue ){}
/*
* Comments:
* Param CAnimal * pTarget:
* Param INT_PTR nDamageValue:
* @Return void:
*/
virtual void DamageTo(CAnimal * pTarget,INT_PTR nDamageValue){}
/*
* Comments:
* @Return void:
*/
virtual void EnterEvadeMode();
/*
* Comments:
* Param CAnimal * pTarget:
* @Return bool:
*/
virtual bool IsVisible(CAnimal * pTarget){return true;}
/*
* Comments: ai
* @Return bool:
*/
virtual bool NeedOntimeCheck(TICKCOUNT nCurrentTick);
/*
* Comments:
* @Return bool:
*/
virtual bool CheckEnemy();
/*
* Comments:
* Param INT_PTR nRate:0-1000
* @Return void:
*/
inline void SetReSelTargetRate(INT_PTR nRate)
{
if (m_wReSelTargetRate != nRate)
{
nRate = __min(nRate, MAX_RESEL_TARGET_RATE);
m_wReSelTargetRate = (WORD)nRate;
}
}
/*
* Comments:
* @Return bool: truefalse
*/
virtual bool NeedReSelTarget();
/*
* Comments:
* Param CAnimal * pTarget:
* @Return void:
*/
virtual void ChangeTarget(CAnimal *pTarget);
/*
* Comments:
* Param bool bEnter:
* @Return void:
*/
virtual void SetFollowStatus(bool bEnter){
m_bInFollowingStats = bEnter;
}
void RefreshSkillDis();
//获取移动的停留间隔
inline int GetMoveStopInterval()
{
if(m_pAiConfig)
{
return m_pAiConfig->nMoveStopInterval;
}
else
{
return 0;
}
}
//获取移动路径
inline DataList<int>& GetPathPoints()
{
return m_pAiConfig->pathPoints;
}
protected:
/*
* Comments: CD的技能
* @Return void:
*/
void HandleSkillCDWhenCombatStart();
void SetNextCheckEnemyTimer();
public:
BYTE m_btAiType; //AI的类型
BYTE m_bReserver; //技能释放的最小的距离
WORD m_wID; //AI的ID
AiIndex m_handle; //ai的指针
CAnimal * m_pSelf; //自己的指针
protected:
//WORD m_wCurrentSkill; //当前的技能的ID
WORD m_wMinSkillDis; //最小的技能的作用距离
WORD m_wReserver; //保留
int m_nSkillIdx; //当前技能索引
PAICONFIG m_pAiConfig;
CTimer<1000> m_skillTimer; //释放技能的定时器,怪物不能不停的释放技能,释放完以后需要停一段时间才能放
WORD m_wReSelTargetRate; // 怪物被攻击时重新选择目标的概率默认为0表明第一次选择目标后不会再次选择。
bool m_bInFollowingStats; // 是否处于跟随状态
CTimer<1000> m_1sCheckEnemyInCombat; // 战斗中检测敌人
};