魔兽世界私服trinitycore2的架构(9)人工智能

来源:互联网 发布:地方门户源码 编辑:程序博客网 时间:2024/06/10 01:29

隔了很长一段时间没有写魔兽世界私服trinitycore2的架构分析,现在重新开始写,也许是最后一章了。其实个人感觉剩下应该都是比较琐碎的细节了。人工智能在一个大型网游系统中,是很重要的部分。在trinitycore2中,人工智能有2个重要分支,一个分支是数据库化的,将每个步骤作为一个命令,而输入参数就作为一个记录的字段,这种方式在很多地方都被使用。另外一个是事件化,针对不同的事件接口,做出不同的类来实现,很多npc的人工智能都是这样实现的。我们查下item_template、creature_template 、gameobject_template,可以发现他们都有ScriptName字段,绑定不同的人工智能脚本。而creature_template多了AIName来处理公式化的人工智能。instance_template是script字段,是脚本,却不是人工智能。

魔兽世界的人工智能似乎挺弱的,他通常都可以被归结为阶段性的判断,或者规则性的判断。比如某个BOSS某个阶段会做什么,都是公式化的。或者选择最近,最远,仇恨最高的来攻击。这些都是被预先设置好的。我有次很好奇,当我一个侏儒术士接近幽暗城的时候,被守护追得到处跑,这种守卫是如何觉察到,以及如何做到能紧追我不放呢?后面基本上都围绕着这个过程展开的。

 

UnitAI是TC2整个人工智能的基础,从UnitAI-->CreatureAI + PlayerAI,基本上PlayerAI并没有太大的扩展,而CreatureAI有庞大的继承,主要有2个方面,一个在在CreatureAIRegistry.cpp中有写,另外一个谱系就是ScriptAI。CreatureAIRegistry记录的有NullCreatureAI /TriggerAI /AggressorAI /ReactorAI /PassiveAI /CritterAI /GuardAI /PetAI /TotemAI /ArchorAI /TurretAI /EventAI /AOEAI。

在CreatureAIRegistry里面还有2个移动方式的类,移动方式的控制也算是人工智能一种,但和生物智能不同,所以单独处理。

ScriptAI是很大的一个谱系,在TrinityScript里的基本都是这个。

 

作为所有人工智能的基础,UnitAI具有几个方面:

1、AI的所有者,一个AI没有所有者肯定乱套了。在类中,是me成员。

2、攻击模式:包括近战、法术。可惜,在UnitAI没有看到攻击模式的选择。

3、目标选择:这个功能很重要,选择合适的目标才是AI的一个重要体现。不过遗憾的是,这里的选择规则比较简单,很难谈得上负责得智能。

4、事件驱动:UpdateAI是整个UintAI的驱动引擎,在这里实现这个智能的实现过程。每个时间间隔,这个函数都会被调用。

 

如果说魔兽世界有人工智能,那么,从狭义上可以归结为选择攻击目标、选择攻击方式,选择移动方式。UnitAI只提供了选择的动作,而选择的策略将由子类来实现。下面,介绍一个重要人工智能类,CreatureAI。这个类,实际才是整个魔兽世界人工智能的基础。在这个类里面,增加几个函数,包括更换攻击目标,根据视觉所及来更新目标、召唤其他生物。

 

GuardAI直接衍生自CreatureAI,让我很好奇的守卫的智能,居然很简单的。在UnitAI中调用UpdateVictim。

 

CreatureEventAI是creature_template中使用最广泛的智能机制。CreatureEventAI的设计目的主要是为了让用户能够纯粹的依赖于数据库来完成人工智能的设计。在creature_ai_scripts / creature_ai_summons / creature_ai_texts 三张表来配置生物的事件AI。顾名思义,这个智能机制是基于事件的。在creature_ai_scripts有2个重要的参数event_type 和action1_type / action2_type / action3_type。在CreatureEventAI类中,增加一个CreatureEventAIHolder来保存一个脚本指令,这个结构保存的数据,基本上,跟creature_ai_scripts的字段等价。

每个时间间隔,都会从事件列表中进行遍历,然后按事件类型,调用事件处理方法ProcessEvent,针对不同的事件类型,先做了预处理,然后调用Action。

 

ScriptAI是另外一个重要的人工智能机制,我在上面提到过,人工智能有重要的2点,选择攻击目标以及选择攻击方式。选择攻击目标的策略,ScriptAI依然是很简单的最近、最高仇恨、最低仇恨3种方式。而选择攻击方式,也只是在几个可用的法术中,随机的选择一个,暴汗!!!

 

guardAI和上面基于CreatureAI的GuardAI不同,基本上,从creature_template的ScriptName来看,都是使用基于ScriptAI的guardAI作为守卫的人工智能,在src/binds/srcipts/scripts/world/guards.cpp。

 

到现在为止,TC2的基本架构就到这里。后面,我将试图融合Ascent / ArcEmu  / HearthStone / Mangos / Trinity 到单一世界中。我将命名为SingleWorld,简称S端。

 

 

原创粉丝点击