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的开发者们的付出和工作量还是表示敬意。