CreatureAI这个类并不大,构造函数要传入一个Creature的指针,然后就是20来个接口函数。

构造函数:

explicitCreatureAI(Creature*creature) :m_creature(creature) {}

接口函数不多,可以全部列出来:

// Called if IsVisible(Unit *who) is true at each *who move, reaction at visibility zone enter

virtualvoidMoveInLineOfSight(Unit*) {}

// Called for reaction at enter to combat if not in combat yet (enemy can be NULL)

virtualvoidEnterCombat(Unit*/*enemy*/) {}

// Called for reaction at stopping attack at no attackers or targets

virtualvoidEnterEvadeMode() {}

// Called at reaching home after evade

virtualvoidJustReachedHome() {}

// Called at any heal cast/item used (call non implemented)

virtualvoidHealBy(Unit*/*healer*/,uint32/*amount_healed*/) {}

// Called at any Damage to any victim (before damage apply)

virtualvoidDamageDeal(Unit*/*done_to*/,uint32&/*damage*/) {}

// Called at any Damage from any attacker (before damage apply)

// Note: it for recalculation damage or special reaction at damage

// for attack reaction use AttackedBy called for not DOT damage in Unit::DealDamage also

virtualvoidDamageTaken(Unit*/*done_by*/,uint32&/*damage*/) {}

// Called when the creature is killed

virtualvoidJustDied(Unit*) {}

// Called when the creature kills a unit

virtualvoidKilledUnit(Unit*) {}

// Called when the creature summon successfully other creature

virtualvoidJustSummoned(Creature* ) {}

virtualvoidSummonedCreatureDespawn(Creature*/*unit*/) {}

// Called when hit by a spell

virtualvoidSpellHit(Unit*,constSpellEntry*) {}

// Called when spell hits creature's target

virtualvoidSpellHitTarget(Unit*,constSpellEntry*) {}

// Called when the creature is target of hostile action: swing, hostile spell landed, fear/etc)

virtualvoidAttackedBy(Unit*attacker);

// Called when creature is spawned or respawned (for reseting variables)

virtualvoidJustRespawned() {}

// Called at waypoint reached or point movement finished

virtualvoidMovementInform(uint32/*MovementType*/,uint32/*Data*/) {}

// Called at text emote receive from player

virtualvoidReceiveEmote(Player*/*pPlayer*/,uint32/*text_emote*/) {}

// Called when creature attack expected (if creature can and no have current victim)

// Note: for reaction at hostile action must be called AttackedBy function.

virtualvoidAttackStart(Unit*) {}

// Is unit visible for MoveInLineOfSight

virtualboolIsVisible(Unit*)const{returnfalse; }

// Called when victim entered water and creature can not enter water

virtualboolcanReachByRangeAttack(Unit*) {returnfalse; }

// Called at World update tick

virtualvoidUpdateAI(constuint32/*diff*/) {}

可以看到,大部分接口是事件触发和消息通知。UpdateAI我放到最后,这个和别的接口函数不同,是负责AI状态的更新处理。

以CreatureAI为基类,派生出了PetAI、CreatureEventAI、GuardAI、ReactorAI、AggressAI、TotemAI和NullCreatureAI 7类基本AI。Creature的AIM_Initialize()函数,对AI进行初始化,根据Creature的类型选择不同的AI。值得提出的是,Mangos还支持ScriptAI,对于非宠物类的生物支持扩展脚本AI。Mangos的脚本系统我还没有怎么看,有空研究下。

可以看到Mangos的AI设计还是比较传统的,Creature类相当于身体和物理存在,干很多“傻大粗”的事情;AI相当于Creature的大脑,对事件进行响应和处理,指挥着身体物理存在进行反应。

下面可以看下宠物AI的一段代码:

mangos服务器的游戏对象和ai系统,(搬运工)Mangos服务器的游戏对象和AI系统(二)相关推荐

  1. mangos服务器的游戏对象和ai系统,(搬运工)Mangos服务器的游戏对象和AI系统(一)

    主要的几个对象类 1.Object类主要功能 1)InWorld判断和操作 2)GUID Mangos的每个对象都有唯一的GUID,每类GUID的最大值是保存在数据库中,初始化时候从数据库加载.Man ...

  2. Silverlight 2.5D RPG游戏技巧与特“.NET技术”效处理:(十一)AI系统

    谈到人工智能(AI),这个话题就太大了:大学里有<人工智能教程>专门讲这方面的知识,什么大名鼎鼎的人工神经网络.遗传算法等等均可一窥究竟,这里如赘述似乎有些班门弄斧,我们暂且丢它一边去吧. ...

  3. 点晴oa系统搭服务器,点晴OA系统安装后提示:操作对象无效错误101,您没有ASPEncodeDLL.AspCoding对象的操作权限或该对象不存在请联系服务器管理员...

     点晴OA系统安装后提示:操作对象无效错误101,您没有ASPEncodeDLL.AspCoding对象的操作权限或该对象不存在请联系服务器管理员 :安装的时候遇到一个问题,安装完之后出现:您没有 A ...

  4. dnf会修改跨区服务器吗,dnf新跨区系统上线之后,整个游戏只有9个大区

    原标题:dnf新跨区系统上线之后,整个游戏只有9个大区 从11月份开始,DNF官方就已经提出了新的跨区计划,并且陆续对各大区进行更新调整,并且安图恩团队频道和卢克团队频道进行调整,以满足玩家们的打团需 ...

  5. 服务器win7系统能搭建手游吗,如何判断自己的Win7系统能否玩吃鸡游戏?

    如何判断自己的Win7系统能否玩吃鸡游戏?吃鸡游戏对电脑配置要求非常高,很多伙伴都不清楚自己的电脑是否能玩吃鸡游戏?这就要看你的电脑配置了,下面给大家分享几种查看电脑配置的方法. 一.首先来看看吃鸡游 ...

  6. 2核4g服务器选啥系统好,云服务器2核4g可以做什么

    云服务器2核4g可以做什么 内容精选 换一换 实例即云耀云服务器,是由CPU.内存.操作系统.云硬盘组成的基础的计算组件.云耀云服务器创建成功后,您就可以像使用自己的本地PC或物理服务器一样,在云上使 ...

  7. ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器

    ioGame 国内首个基于蚂蚁金服 SOFABolt 的 java 网络游戏服务器框架:无锁异步化.事件驱动的架构设计 通过 ioGame 可以很容易的搭建出一个集群无中心节点.有状态多进程的分步式游 ...

  8. 游戏服务器和网站,大型网络游戏和大型网站需要服务器的不同

    服务器 大型网络游戏和大型网站需要服务器的不同 1) 虽然大型网络游戏产生的数据也很多,但与大型网站系统相比,差了几个数量级. 2) 网络游戏对数据的操作相对简单,基本上简单的select/updat ...

  9. 基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题

    基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题 背景 在这越来越发达的网络时代,web应用也是越来越复杂,尤其是前端的开发,也是越来越受重视 ...

最新文章

  1. UVa-442-Matrix Chain Multiplication
  2. 【已解决】mysql连接出错:ERROR 1040 (HY000): Too many connections
  3. 分析思维导图与绘制思维导图方法介绍
  4. AttributeError: module ‘tensorflow‘ has no attribute ‘placeholder‘
  5. Spring Boot----Dubbo
  6. python函数定义时参数相当于占位符_python中函数的参数
  7. JS 数字,金额用逗号隔开
  8. 如何利用FineBI做财务分析
  9. mysql xml生成工具_mybatis-generator 代码自动生成工具
  10. iOS 如何在一个应用程序中调用另一个应用程序
  11. 通过分布式把本地图片上传到FTP(1)
  12. Java:集合,Array、Collection(List/Set/Queue)、Map的遍历,比如:ArrayList,LinkedList,HashSet,HashMap...
  13. 斯坦福大学Andrew Ng教授主讲的《机器学习》公开课观后感
  14. Oracle 数据库基础学习 (二)
  15. qstring 字符串查找_怎样用QT查找字符串并标记要查找的内容
  16. jQuery轮播图效果+ bxCarousel实现图片滚动切换效果+Mootools Videobox实现视频图片弹出类lightbox效果
  17. mysql sql文件分割_怎么将sql数据库文件分割
  18. java中数组拼接成字符串中间用逗号隔开
  19. 萨缪尔·莫尔斯,一个种族主义画家是如何窃取了电报发明权的呢?
  20. Docker——安装和启动

热门文章

  1. vue项目中,amr格式的音频播放
  2. WINDOWS-API:关于线程 GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId...
  3. windows linux 并发,Windows/Linux安装压力测试工具siege
  4. 宏碁台式机,如何设置u盘启动
  5. 2020年生肖码表图_2020年一语破天机全年资料:2020年新生肖码表图_特时代
  6. 计算机所王颖简历,王颖-天津大学材料科学与工程学院
  7. 浏览器因为代理打不开
  8. 转载:我对大数据算法的认知
  9. OpenCV小例程——图像去噪
  10. S-c crystal 组合