魔兽世界插件编程解析(一)
魔兽世界中的插件是文本和多媒体文件的集合。这些文件与元数据一起进行封装并在客户端加载。实际上我们使用的插件还添加了一些脚本和媒介来扩展客户端提供的核心功能。
想要在游戏中加载和应用一个插件,你需要把它放在魔兽世界的特定安装子目录中。如果你已经加载过一个游戏,就会生成一个名为Interface的子目录,在这个目录中含有一个AddOns目录,可以用来存放你的插件。
暴雪的插件只有在客户端有需求时才会加载。以拍卖行用户界面为例,只有玩家访问拍卖师时,游戏才会加载Blizzard_AuctionUI插件。这样可以加快加载速度。
每个Blizzard插件在它的目录中都有一个以.pub为扩展名到唯一的文件。每一个自定义插件都会被保存在Blizzard插件相同的目录中,它们的组成部分都放在一个由插件命名的单独的子目录中。这些目录的命名和系统创建文件的位置不同。和Blizzard不同的是每一个自定义插件的目录都包含了使用和加载插件的所有必要文件。因此你将有不同种类的文件,不同的插件组织方式,和不同的命名习惯。
以##开头的行包含了一些与各种元数据有关的指令。
1.## Title: MyAddonName
插件选择窗口中列出的插件是通过它们的##Title指令进行分类和显示的,而不是它们的TOC文件和目录。默认的选项值就是插件目录的名字。这种指令可以被本地化,就是说它可以根据用户客户端设置的显示语言来设置不同的文本。
2.##Notes:这是对MyAddonName的描述
Notes指令可以对你的插件提供一个详细的描述,这样用户就可以很清楚的知道它应该做什么,哪里可以获得更多的信息。这个域也可以按照客户端所在的地方进行本地化。和## Title一样,这个域可以包含颜色代码来突出显示部分文本。
3.##Dependencies和##RequiredDeps:AddonA,AddonB
有时一个插件需要另一个插件的功能。例如只有用户运行一个特殊的slash命令后才会加载一个配置界面。##Dependencies指令给出了一个插件列表,只有在给出的所有有从属关系的插件已经被加载或者可以被加载时,游戏客户端才能加载这个插件。 如果在插件选择窗口中,一个插件有一个不可用的从属插件,屏幕上就会显示出错误指令。把鼠标移动到插件名字上就可以查看插件从属列表和缺失插件。从属关系还可以保证插件按照一定的次序加载。
4.##OptionalDeps:AddonA,AddonB
若一个插件和另一个插件有交互,但又不需要把它作为硬从属,就可以使用##OptionalDeps指令把它放置在可选从属列表中。如果加载的从属插件可用并且存在,这些指令就要保证他们之间加载的次序关系,插件的名字用逗号分隔,同时还必须和.toc文件名和所给插件的目录名相匹配。
5.##LoadOnDemand:1或0
所有的暴雪插件都是按需要进行配置和加载的。就是说为了对一些事件进行响应,游戏客户端才会加载和初始化这些插件。并不是所有插件都支持按需加载(LoD),所以可以用该指令来标记插件的LoD可用性。
6.##LoadsWith:AddonA,AddonB
一旦一个插件加载完毕,##LoadsWith指令可以与##LoadOnDemand组合来加载另一个插件。例如用来修改默认BlizzardRaid UI的插件,当客户端加载Raid UI插件以后,如果有##LoadsWith:Blizzard_Raid UI指令,那么它也会被加载。
7.## DefaultState:enable 或disabled
并不是所有插件的设计对于每一个角色都是可用的或可加载的,因此需要一个指令来设置插件的默认状态。在默认情况下,客户端可以通过这个标志位来判断是否要对插件选择窗口中的插件进行确认。如果一个用户重写了一个设置,系统就会选择用户的首选项。若不提供这个值,它就会自动设置为可用。
8.##LoadManager:Addon A
可以通过##LoadManager指令来添加LoD系统的复杂性,若LoadManager可用,则指令将允许插件标记为LoD,否则它会被作为一个普通插件加载。和简单的标记插件LoD相比,使用这个指令有很小的差别,就是这个插件需要另外一个插件来处理第一个插件的加载,否则它就会被无条件的加载。
9.##SavedVariables:VariableName
在会话中插件要保存信息,只能定义一个Lua变量,并在TOC文件的##SavedVariables指令中列出变量的名字。当关闭游戏的时候,系统就会将这个变量的内容存储到一个外面的文件中。当游戏重新启动时又会读取该变量。变量类型可以是字符串,数字或者表格。
10.##SaveVariablesPerCharacter:VariableName
这个指令与##SavedVariables运行方式是一样的,只不过每个角色登录时保存和加载的文件不同。你登录的角色与另一个角色是分开保存的。不需要向插件内添加其他的特殊内容,这些都由客户端自动完成。
未完待续(_)