posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

void PetAI::MoveInLineOfSight(Unit *u) //有单位进入宠物视野

{

if( !m_creature->getVictim() && m_creature->GetCharmInfo() &&

m_creature->GetCharmInfo()->HasReactState(REACT_AGGRESSIVE) &&

u->isTargetableForAttack() && m_creature->IsHostileTo( u ) &&

u->isInAccessablePlaceFor(m_creature))

{ //好多判断:不是我已有的攻击目标,并且我是攻击性的,并且我可以攻击此单位,并且单位是我的敌对方,并且我能够得着它

float attackRadius = m_creature->GetAttackDistance(u);

if(m_creature->IsWithinDistInMap(u, attackRadius) && m_creature->GetDistanceZ(u) <= CREATURE_Z_ATTACK_RANGE) //在我的攻击范围内

{

if(m_creature->IsWithinLOSInMap(u)) //在我的视野中

{

AttackStart(u); //攻击开始消息

u->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); //去掉我的有隐身状态(有的话)

}

}

}

}

下面看看AttackStart干了什么:

void PetAI::AttackStart(Unit *u)

{

if(!u || (m_creature->isPet() && ((Pet*)m_creature)->getPetType() == MINI_PET)) //一些保护

return;

if(m_creature->Attack(u,true)) //攻击成功

{

m_creature->clearUnitState(UNIT_STAT_FOLLOW); //清除我的跟随状态

m_creature->GetMotionMaster()->MoveChase(u); //通过MotionMaster修改移动类型为Chase,并开始追。MotionMaster的分析见下面

inCombat = true;

}

}

四、MotionMaster

在Unit类中还有个MotionMaster成员,Creature在初始化AI的时候,对MotionMaster进行初始化。MotionMaster维护一个移动的列表并负责不同移动类型的生成。具体的移动类型控制Creature的移动。

下面是MotionMaster生成不同移动类型的接口函数:

void MoveIdle();

void MoveTargetedHome();

void MoveFollow(Unit* target, float dist, float angle);

void MoveChase(Unit* target, float dist = 0.0f, float angle = 0.0f);

void MoveConfused();

void MoveFleeing(Unit* enemy, uint32 time = 0);

void MovePoint(uint32 id, float x,float y,float z);

void MoveSeekAssistance(float x,float y,float z);

void MoveSeekAssistanceDistract(uint32 timer);

void MoveTaxiFlight(uint32 path, uint32 pathnode);

void MoveDistract(uint32 time);

Mangos对移动进行了单独的处理,这个是它的一个亮点和优点。

五、结论

1. 网游服务器AI的基本结构还是体现出来了,一个网游服务器AI系统确实主要是由游戏对象、AI和移动组成;

2. 关键类设计得过于复杂,需要进一步细化和模块化;像Unit和Player里面的战斗和技能很必要作为一个独立模块来设计和实现。Creature和Player等复杂的类,需要划分出状态,否则太多状态变量和条件判断,很容易出错,而且不容易修改和扩充。

3. 代码复杂度比较高,一般程序员难于驾驭;如有人员替换,维护和修改比较困难;

4. 无内存池和对象池,大量使用new和delete。长时间运行后,服务器效率是个问题;

5. 重用性很差,很难在上面搞出个其它不是“WOW”的游戏。听说国内有公司打算用Mangos搞其它网游,肯定修改不动,不了了之。

Mangos确实只是一个爱好和兴趣的产物,并不适合实际的商业网络游戏。新手学习有一定的参考,但是参考价值不大,因为门槛还是比较高的(如巨大的类、实现地图区块广播的模板技术),新手额外要花不少代价。对新手来说,我更建议看一些韩派或国内网游的实现。但是Mangos毕竟把WOW给模拟出来了,我对Mangos的开发者们的付出和工作量还是表示敬意。