gunz的ai处理(备忘)
gunz的ai处理(备忘)
[更新]
一个Actor更新中:
1. m_TaskManager.Run(fDelta);
2. ProcessNetwork(fDelta);
3. ProcessAI(fDelta);
处理actor->Brain->Think()中
bool bFind = FindTarget();
if ( bFind)
{
ProcessBuildPath( fDelta);
ProcessAttack( fDelta);
}
4. ProcessMovement(fDelta);
5. ProcessMotion(fDelta);
一。ProcessAI()
actor->Brain->Think()处理中产生一个Task
一个任务有 移动,攻击,延时,转向等,其中攻击有肉搏,范围,技能
比如:actor->Brain->Think()中发了现敌人后在ProcessAttack()中产生一个skilltask存入到
actor->m_TaskManager中
二。m_TaskManager.Run()
在在taskMgr中处理m_pCurrTask的3个步骤(start,run,complete):
举例: 如ZTask_Skill:
1. OnStart()中
a.parent(是一个actor)->Skill(m_nSkill); // 进行动作输入(动作用了m_AniFSM进行管理)
b.ZPostNPCSkillStart(ownerid,nSkill,Targetid,TargetPos);
这会生成一个id为MC_QUEST_PEER_NPC_SKILL_START的cmd并push到全局的m_CommandManager中
2. OnRun()中
if时间到了则ZPostNPCSkillExecute(ownerid,nSkill,Targetid,TargetPos);
产生的命令id==MC_QUEST_PEER_NPC_SKILL_EXECUTE;
3 . OnComplete()中
ZTask_Skill中无处理.
三。m_pGameInterface->Update()中从m_CommandQueue中取出cmd, 对其:
1. SendCommand(pCommand);
2. OnCommand(pCommand);
switch(cmd->id)调用对应的处理函数,
例如:
a. id==MC_QUEST_PEER_NPC_SKILL_START时将调用OnPeerNPCSkillStart()
在其中通过uidOwner找得actor得到它的ZModule_Skills处理模块传入cmd的参数处理之.
这会进行发起特效处理
b. id==MC_QUEST_PEER_NPC_SKILL_EXECUTE时时将调用OnPeerNPCSkillExecute()
在其中通过uidOwner找得actor得到它的ZModule_Skills处理模块传入cmd的参数处理之.
这会进行攻击特效处理:
1). 如果是bHitCheck标志的特效,则转让全局的武器管理类处理:
m_WeaponManager.AddMagic( this, vMissilePos, vMissileDir, m_pOwner);进行处理
这里判断如果循环次数减到0,则m_bEnable = false;
2).否则:
a. 如果有相机震动标志,则通知照相机震动处理
GetCamera()->Shock( fPower*fDefaultPower, fDuration, rvector( 0.0f, 0.0f, -1.0f));
b. 遍历所有角色,检测是否范围内以及抗性没抵消完伤害:
(1)是攻击则
pObject->OnDamaged(..)
否则
pObject->OnHealing(..)
(2)限速:
pMovableModule->SetMoveSpeedRestrictRatio( 0, fDuration);
(3)击退:
pObject->AddVelocity( m_pDesc->fModKnockback * 7.f * -dir);
3). 特效燃烧效果:
if(m_pDesc->szCastingEffect[0]) {
if(type != eq_parts_pos_info_etc)
efgmgr->AddPartsPosType(m_pDesc->szCastingEffect, Targetid,type,m_pDesc->nEffectTime);
else
efgmgr->Add(m_pDesc->szCastingEffect, vPos,vDir,OwnerID,m_pDesc->nEffectTime);
}
if(m_pDesc->szCastingEffectSp[0]) {
ZGetEffectManager()->AddSp(m_pDesc->szCastingEffectSp,m_pDesc->nCastingEffectSpCount,
vPos,vDir,m_pOwner->GetUID());
}
3). 提示信息显示处理
4). 声音播放处理.
四。ZWeaponMgr处理:
上述的OnPeerNPCSkillExecute()处理中发现是飞行特效转交给ZWeaponMgr来处理,所以这里说一下
在这里会处理特效模型飞行并处理Explosion( type, pPickObject,pickdir);爆炸伤害!转调用到pTarget->OnDamaged(..)