魔兽世界lua笔记(2、编写一个打断喊话插件)
前面我们介绍了lua的一些基本用法
然而一切的一切,还是为了能够搞魔兽插件,今天终于步入正题,来搞一个简单的魔兽插件
一、插件的结构
先来看看插件的结构吧,首先,插件是在World of WarcraftInterfaceAddOns目录下的,相信你已经知道了。
目录下面有很多文件夹,我截图了一部分。
这里面每一个文件夹都是一个插件,这些插件有的是完成一个独立的工作,有的只是一个子模块。一般来说,你实现的功能不太复杂,那用一个文件夹就可以了,如果你搞了一个巨复杂的插件,例如DBM,通常来说你就要规划你的模块。
魔兽的插件可以做很多事情,blz本身就是插件的最大用户,魔兽的登录界面、服务器选择、人物选择界面、游戏里面的UI等等,都是用插件来实现的(默认alt+z快捷键可以隐藏的部分,都是插件实现的),当然blz的有些插件有一些并没在Addons里面,而是隐藏到了客户端里面。
上图里面,Blizzard开头的是blz公司自己的插件,dbm开头的是dbm的插件,其他的是一些单体插件。
下面我们从这里面找了一个文件结构最简单的BuffMaster(增益大师)来说:
这里面只有两个文件BuffMaster.toc和BuffMaster.lua,下面我们来介绍一下
二、toc文件简介
核心是BuffMaster.toc文件,这是插件的声明文件,每个插件都必须有这么一个文件,他的文件名跟插件的目录名一样,作用是用来告诉wow客户端,你的插件的文件都放在哪里,当然也还有一些别的作用,这个也不用太深究,随着功力的提升慢慢了解就好。
下图就是toc文件的内容,我大概介绍一下:
第一行是插件的适用版本,70100代表这个插件适用于7.1.x版本,老胡写这篇文章的额时候已经是7.2.5,所以如果运行这个插件就会提示已过期,改为70200就ok了。——很多人问插件过期了怎么改,就是这么简单后面好多行,都是插件的名字,英文的,简体中文的,繁体中文的,等等Dependencies,依赖哪个插件,这里写的是依赖BigFoot,所以如果玩家勾选了这个插件,但是没勾选BigFoot,就会提示“依赖没有启用”(忘了是不是这么提示的了),导致你的插件不能运行。但实际上这个插件跟大脚没有任何关系,即不是大脚开发的,也不需要依赖大脚,就是大脚的一个流氓行为,所以完全可以删了这一行。很多人问怎么把一些插件分离成单体——这里已经告诉你答案了。但是,有些确实需要依赖的,如果要分离就要改代码了。LoadOnDemand,意思是需要的时候才加载,目的是用不到这个插件的时候就不用占用内存了最后一行,是关键,这里指定了我们插件中文件的路径BuffMaster.lua,这个文件名不需要跟插件名一致。
我们再来看一下DBM-Core的
看看toc文件,上面大同小异,下面是这个插件引用的文件资源
三、编写一个魔兽插件
好了,我们来动手搞一个简单的插件,插件的目的是打断的时候说一句话,这样你就不用再做打断喊话宏啦。
首先我们照猫画虎在Addons下面新建一个文件夹,我起名叫_InterruptWarning,前面有个下划线是为了排序的时候在前面,避免混到一堆插件中找不到,是不是好机智,哈哈。
然后分别编写两个文件的内容,先来toc的,这个就不重复介绍了
再来lua的
这个得好好介绍一下了,因为这个插件虽然代码不多,但是涉及的知识还不少。请看好左边的行号,老胡下面一行一行介绍:
line1: 定义一个变量interuptFrame,同时给他赋值,用魔兽的CreateFrame方法创建了一个frame,后面我们将为这个frame加特技line2: 加第一个特技,注册一个事件,COMBAT_LOG_EVENT_UNFILTERED,也就是当战斗日志产生之后触发,点击链接可以查看详细介绍跳到line11: 家第二个特技,这里定义了档事件触发的时候,通知interruptEvent这个方法,也就是3-10行这个方法line4: 判断是不是战斗日志事件line5: 获取事件触发的参数,我们需要的是eventType和sourceName这两个,含义分别是时间类型和事件来源line6: 判断,如果事件类型是技能被打断,并且事件来源的名字是玩家的名字,这说明当前玩家成功打断了一个技能line7: 说一句话:interrupt >> [xx技能]一个简单的事件触发机制。
有点编程基础的人可能懂了,没基础的小白一般还懵逼着,因为老胡这个例子本身就有难度。因为老胡也不想搞个print(1)之类的,然后就告诉你插件做好了。。
那小白怎么才能懂呢,一句话,猛练自然强,练习题来了,请参照老胡的例子实现一个场景,萨墓里面主母这个boss,中了[吞噬之饥]这个debuff之后,会持续掉血,但是又不明显,所以很多人看不到,每次都要团长提醒,作为团长,现在请你实现一个功能,中了debuff的时候,就说三声“我中了[吞噬之饥],等下踩[雷霆震击]消debuff”,做好了可以qq老胡交流376665005。
有自信的可以做一个更好的例子。不但自己中了提醒,团里的其他人中了,还可以私密提醒他。
最后,上面例子的源码,声明一下,老胡并未测试,如果不能用,纯属正常。
怎么样,这个技能你get了吗?