1)建立插件目录

就是在游戏AddOns目录下新建个文件夹,用插件名字命名:
...\World of Warcraft\Interface\AddOns\<插件名>

2)目录中需要一个插件装载用的主描述文件:<插件名>.toc

...\World of Warcraft\Interface\AddOns\<插件名>\<插件名>.toc

.toc文件格式

http://www.baifeng.me/misc/2009/01/462/

.toc文件示例

## Interface: 50300
## Title : MySmokeBombShouts
## Notes: 烟雾弹喊话
## Author:
## Version: 1.0
MyScript.lua

 

MyScript.lua就是插件加载后就会解析执行的脚本
包括.toc、.lua和.xml文件在内,所有的插件文本编码格式都必须是UTF-8格式

3)写MyScript.lua

lua语法编辑器环境

http://luaeclipse.luaforge.net/manual.html#installation设置一下Workspace的Text file encoding为UTF-8,编辑器报语法错误不用理,应该是没支持好UTF-8

贼的烟雾弹喊话脚本

随便找的脚本,链接:http://nga.178.com/read.php?tid=6279709&rand=954

function CountdownFunc()
   CountdownFrame = CreateFrame("Frame") 
   FrameScript = function() 
      if GetTime() - MarkTime > 1 then 
         if S == 0 then 
            SendChatMessage(">>烟雾弹<<结束", "YELL") 
            FrameScript = nil 
            CountdownFrame:SetScript("OnUpdate",FrameScript) 
         else 
            SendChatMessage(S,"YELL") 
         end 
         MarkTime = GetTime() 
         S = S - 1 
      end 
   end 
   MarkTime = GetTime() 
   S = 5 
   CountdownFrame:SetScript("OnUpdate",FrameScript) 
   SendChatMessage(">>烟雾弹<<已释放", "YELL") 
end 

MainFrame = CreateFrame("Frame") 
MainFrame:RegisterEvent("UNIT_SPELLCAST_SENT") 
MainFrame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") 
MainFrame:SetScript("OnEvent", function(_, _, a, b, _, c) 
   if a == "player" and b== "烟雾弹" then 
      n = type(c) == "string" and c or CountdownFunc() 
   end 
end)

 

lua语法基础

http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.htmlhttp://www.lua.org/manual/5.2/

“Frame”

“Frame”,就是上面CreateFrame创建的,WOW脚本功能的主要执行体,可以看作是一种杂凑物,本身是界面框体,但不需要界面只监控WOW事件也要创建它。

Frame通过监控和处理游戏的两种事件来插入自己的功能。

全局游戏事件

第一种是全局游戏事件,比如战斗开始,某个技能开始施放,这些都是系统性的事件,Frame可以注册 Frame:RegisterEvent("XXX"),之后就保持监听状态了。

每个Frame可以根据需要注册任意多的事件,但仅能够有一个 <OnEvent>脚本。游戏会将事件名称都发送到该处理模块,然后再根据不同的事件进行响应。
事件处理函数原型:function(self, event, ...)

上面就是监控法术施放和法术施放成功的两个事件。

这类事件的列表:http://www.wowwiki.com/Events/Names(详细的事件参数要点右边的子分类,再在里面找)

界面元素本身的事件

第二种是Frame作为一个界面元素本身的事件,比如鼠标点击(OnClick)等。

OnUpdate 常用于做定时器或者刷新处理,都知道游戏有个刷新率,即每秒屏幕刷新多少次,刷新同时,这个Frame也会刷新,也就是触发OnUpdate相关的处理代码。
上面的代码就每次都在这个时机去计算当前的时间,过了1秒就减1,减够5秒就停止。这里面用到了GetTime()和SendChatMessage()这样的WoW API函数。

这类事件的列表:http://www.wowwiki.com/Widget_handlersWoW API函数列表:http://www.wowwiki.com/World_of_Warcraft_API

4)运行成功了