【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 5334|回复: 10

[脚本语言] WelcomeHome - 你的第一个ACE2插件

[复制链接]
发表于 2007-7-11 17:27:25 | 显示全部楼层 |阅读模式

译者: leobluewing
原文发表于:WelcomeHome_-_Your_first_Ace2_Addon


本文的toc文件表明的是用于2.0版本,由于CWOW在本文翻译时还是1.2版本,所以请大家在实验的时候将toc文件的第一行改为:

## Interface: 12000

并且钩选加载过期插件,文章介绍中toc文件均未修改,最后源代码已经改成12000。


目录*

WelcomeHome - 你的第一个ACE2插件
介绍
开始
加入ACE库
说hello
响应事件
不重起游戏进行插件重载
使用WOW_API
斜杠命令和注册信息
让你的信息更显著一点
保存你的设置
本地化
加入AceLocale-2.2
绑定本地文件
在插件中使用本地化文件
结论
代码
WelcomeHome.toc
Core.lua
Locale-enUS.lua

 楼主| 发表于 2007-7-11 17:28:20 | 显示全部楼层

介绍

看这篇文章前你一定已经打算提高一个层次了,也就是说你希望从一个“玩家”变成一个“开发者”。但是你从哪里开始着手呢? 在网上,适合于初级开发者的资料实在是不多,所以,很可惜的是,很多“开发者”在他们还没明白addon到底是怎么一回事情的时候,他们就已经对不停的从一个插件里面拷贝代码到自己的插件这件事情感到厌倦,以至于放弃了“ 开发”。
于是,这份指南的目的就是向你们介绍如何一步一步的来完成一个叫做WelcomeHome的插件的开发,当然,它是基于ACE2库的。这个插件的功能是当你到达你的炉石设置的家的时候,系统自动的给你发送问候语,并且,这个问候语是可以自己设置的。
当你开始这一切的时候,我假设你对一些脚本语言比较熟悉(例如ruby,js等等)当然,lua知识也是不可少的,另外你还需要了解WOW API。
好了,让我们开始吧。

开始

因为这是一份基于ace2的插件开发指南,所以我一开始要象你介绍如何在游戏里载入一个最简单的插件。所有的插件都是安放在\Interface\Addons文件夹下的,并且所有的插件都要安放在自己的文件夹下.所以一开始我们就要在addons下建立一个新的,名为WelcomeHome的文件夹。当WOW启动的时候,它会去addons文件夹下寻找所有的子文件夹,然后在子文件夹中寻找一个toc(table of contents)文件,这个文件记录了该插件要用到的所有文件。而且,这个toc文件的文件名和子文件夹要相同,拿我们这个插件为例,它就叫WelcomeHome.toc。
接下来,我们就来创建一个最简单的toc文件。格式如下:

## Interface: 20000
## Title: Welcome Home
## Notes: Displays a welcome message when you get to your home zone.
## Author: Your Name Here
## Version: 0.1
## X-Category: Interface Enhancements

Core.lua

以上这些就是最基本的信息,比如Interface: 20000就代表了版本号等等,其中X-Category属性你要使用一个ace推荐列表中的选项。 另外,在toc文件中,你还可以包括很多其他的信息。接着,你需要在子文件夹中建一个Core.lua的文件(空的就行)。然后你启动WOW就会在插件列表中发现WelcomeHome这个插件。
OK! 我们这不是建立了一个插件了吗? 虽然它做不了任何事情,但好的开端是成功的一半,不是吗?

加入ACE库

接下来,我们要做的是加入ACE2库,因为我们要学习的是如何在ACE2上进行开发。ACE2库使用了“植入库”的概念,它让开发人员不需要把一些公用的文件拷来拷去,而只需要把它们放在一个统一的地方就好了。(类似于头文件以及java中的import概念)。这意味着你需要下载那些我们写的公用的库文件,你可以从我们的SVN上来下载最新的版本放到本地。在下载完后,在你的插件目录中新建一个文件夹叫Libs,并将下载来的文件解压到Libs中,然后,除了AceAddon-2.0 ,AceConsole-2.0 ,AceDB-2.0 ,AceEvent-2.0,AceLibrary ,AceOO-2.0 这6个文件夹以外,其他的全部删除!因为在这个教程里,我们只需要用到这6个文件。当你掌握了更多的知识的时候,把其他文件添加回来吧。

做完这一切后,我想你的树状显示图应该是下面这样的。

好了,现在你已经有了ACE2库了,唯一要做的就是把这些库的位置告诉你的插件,以便你的插件能够找到它们,所以我们又要修改toc文件了!改成如下格式:

## Interface: 20000
## Title: Welcome Home
## Notes: Displays a welcome message when you get to your home zone.
## Author: Your Name Here
## Version: 0.1
## OptionalDeps: Ace2
## SavedVariables: WelcomeHomeDB
## SavedVariablesPerCharacter: WelcomeHomeDBPC
## X-Category: Interface Enhancements

Libs\AceLibrary\AceLibrary.lua
Libs\AceOO-2.0\AceOO-2.0.lua
Libs\AceAddon-2.0\AceAddon-2.0.lua
Libs\AceDB-2.0\AceDB-2.0.lua
Libs\AceConsole-2.0\AceConsole-2.0.lua
Libs\AceEvent-2.0\AceEvent-2.0.lua

Core.lua

将这些库列在Core.lua之前是为了保证他们能先被加载。在这个toc文件中,我加入了一些目前还用不到的信息,比如SavedVariables,但是,相信我,最终一定会用到的。

 楼主| 发表于 2007-7-11 17:28:48 | 显示全部楼层

说hello

第三步比起前面两步来说有点难度了,现在,用任何一个文本编辑器打开你的Core.lua文件(译者推荐:Scite),然后敲入以下的代码:

切换行号显示
   1 WelcomeHome =
				AceLibrary("AceAddon-2.0"):new("AceConsole-2.0")
   2 
   3 function WelcomeHome:OnInitialize()
   4 
				-- 当插件载入时执行
   5 end
   6 
   7 function WelcomeHome:OnEnable()
   8 
				-- 当插件打开时执行
   9 end
  10 
  11 function WelcomeHome:OnDisable()
  12 
				-- 当插件关闭时执行
  13 end

这是一个基于ACE2插件的基本结构,第一句话建立了一个AceAddon类的实例,因为我们需要在聊天窗口输出语句和接受斜杠命令(比如:/XXX)所以在建立实例的时候我混合了AceConsole-2.0库. AceConsole-2.0库会给我们提供打印函数。
混入是在很多面向对象语言里都有的概念,使用混入可以使你在类里使用其他类的方法。(译者注:类似与java里的多接口继承) 接下来的两个是重写的方法,OnEnable方法只有在插件被打开的时候才执行,OnDisable方法在插件被关闭的时候执行。(你可以用/ace命令来打开和关闭基于ACE的插件)你需要知道,当整个WOW的UI被载入时候,如果插件是打开的,那么最先被执行的是OnEnable函数。所以,你经常要选择在OnInitializeOnEnable到底是重写哪一个函数。一般来说,你应该为那些不需要在打开和关闭的时候要执行的事件来重写OnInitialize函数。另外一个重要的方面是,你要根据你接下来需要的东西以及何时这些东西能够被准备好来选择你要重写的函数。下面为了演示插件被载入了,我们要这个插件在聊天窗口中打印出"Hello World!"来。为了实现这个,我们需要在OnEnable函数里加一行代码:

切换行号显示
   1 function WelcomeHome:OnEnable()
   2 
				self:Print("Hello World!")
   3 end

好了,然后重新启动你的wow,一旦你登入了,你要赶快把聊天窗口翻上去查看是否有输出过什么东西。好了,你现在看着那句“Hello World”,是不是感到很骄傲呢?
在我们走的更远之前,把OnEnable函数里的这句话删掉吧。仅仅因为需要知道插件是否被载入而在聊天窗口输出一行话是很不良好的编写风格。已经有很多别的插件能做这个功能了并且你可以使用/ace list命令来得知哪些基于ACE插件被加载了。而且你也可以删除OnInitializedOnDisable 方法了,因为我们不会再用到这两个方法了。

响应事件

恩,前面我说过了,当你回到“家”的时候,这个插件会亲切的问候你一句。对,我们就是要实现这个功能。可是,插件怎么会知道我们到了家呢?这是因为当玩家进入一个新的地方的时候系统会发出一个ZONE_CHANGED事件,我们所需要做的就是响应这个ZONE_CHANGED事件。
我肯定你会这么问自己:“事件?这是什么鬼东西?”。这个概念和很多其他的程序语言环境类似,那就是说,WOW是事件驱动的。在wow里,当有事情发生时,就会产生一个事件信息,然后你就可以捕捉这个信息从而触发你的事件处理代码。事实上,如果没有事件,你的插件就象一只无头苍蝇,它不知道要去做什么,也不知道什么时候去做。也就是说,你的插件所做的事情都是在响应事件。
BLZ给我们列出了所有的事件,你可以看见,ZONE_CHANGED正是其中之一。让我们对Core.lua文件做些改动来使它能响应这个事件吧。 在我们开始改代码前,我们需要我们的插件能提供响应事件的支持,你猜到了吗?是的!我们又要混入另外一个库了!我们要改写Core.lua的第一句话了,因为我们需要混合AceEvent-2.0库来做支持。改写如下:

切换行号显示
   1 WelcomeHome =
				AceLibrary("AceAddon-2.0"):new("AceConsole-2.0",
				"AceEvent-2.0")

做完上面那步,我们就可以使用RegisterEvent这个方法来表明我们要接受哪些事件。因为我们要接收ZONE_CHANGED这个事件,所以我们要这么改写OnEnable函数。

切换行号显示
   1 function WelcomeHome:OnEnable()
   2 
				-- Called when the addon is enabled
   3 
				self:RegisterEvent("ZONE_CHANGED")
   4 end

然后我们要写一个事件处理方法来处理这个事件,我们在Core.lua代码里做如下添加:

切换行号显示
   1 function WelcomeHome:ZONE_CHANGED()
   2 
				self:Print("You have changed zones!")
   3 end

你也许会想,我们应该在OnDisable函数里取消所有的事件监听,可是,不需要。因为AceEvent-2.0已经帮我们都做了。好了,重启游戏,控制你的人物去一个新的区域,你应该会看见你的聊天窗口会打印出“You have changed zones!”这句话。

 楼主| 发表于 2007-7-11 17:31:08 | 显示全部楼层

不重起游戏进行插件重载

(译者按:知道/console reloadui 的人可以跳过这一章了)
好了,在我们继续前进之前,我要教你些小技巧,你应该会觉得方便的。

一遍一遍的重启游戏不烦么?? 烦啊,我也烦,所以,现在教你个不用重启的方法。

进入游戏,别关它,最小化然后打开文本编辑器我们来改改代码,改成下面那样:

切换行号显示
   1 function WelcomeHome:ZONE_CHANGED()
   2 
				self:Print("This is a different message!")
   3 end

好了,回到游戏,去试一下,打印出什么了?e...T_T还是原来那句。

为什么呢?因为WOW不会因为文件修改而去动态载入UI,所以,我们需要一个新的命令---/script ReloadUI() 它会为我们重载所有的插件。

其实,很多人会说/console reloadui也可以做同样的事情,是的,我承认,可是我遇见过一次/console reloadui这个命令没起作用,所以我以后就一直用/script ReloadUI()这个命令了。

好了,现在不用重启了。

使用WOW_API

我们现在已经有了一个可以在地点变换的时候执行的函数了,可是我们知道玩家到底在哪个地方吗?他的炉石又在哪呢?

让我们返回WOW API页面去找Character Functions,我们会发现第二个问题的答案,是的,就是GetBindLocation这个函数,它会返回你的炉石所绑的地方。

接下来我们要找是否有函数能返回我们到底在哪,好吧,我们可以在Location Function里找到这个函数,就是GetSubZoneText,它会返回你当前所在的地方。

我们只要比较这两个函数的返回值就可以很轻松的知道我们到底是不是回到炉石的地方了。 所以,函数改为以下:

切换行号显示
   1 function WelcomeHome:ZONE_CHANGED()
   2 
				if
				GetBindLocation()
				==
				GetSubZoneText()
				then
   3 
				self:Print("Welcome Home!")
   4 
				end
   5 end

yes! 我们做到了开头我们提出的要求!重载一下UI并且测试一下你的成果吧。

 楼主| 发表于 2007-7-11 17:31:34 | 显示全部楼层

斜杠命令和注册信息

但是除了上面那些,我们还可以做很多有趣的东西。让我们开始吧!

首先,我们先来让这个插件支持斜杠命令吧,这不是很酷吗?我们需要在Croe.lua文件里先初始化一个table类型,并且要让插件知道我们想要它对哪些命令有反应,代码做如下调整:

切换行号显示
   1 local options =
				{
			
   2     type='group',
   3     args =
				{}
   4 }
   5 WelcomeHome =
				AceLibrary("AceAddon-2.0"):new("AceConsole-2.0",
				"AceEvent-2.0")
   6 WelcomeHome:RegisterChatCommand({"/welcomehome",
				"/wh"}, options)

好了,现在这个table是空的所以我们还不能支持什么命令。

在重载UI之后,你敲入/welcomehome或者/wh后,你只会看到一些帮助信息。比如这个插件的名字,描述,以及提供哪些附加命令,现在你可以发现只有一个about附加命令,你可以输入/wh about来看一下这个about附加命令是干什么用的。

好,现在让我们将options丰富一下,来丰富我们的斜杠附加命令。代码如下:

切换行号显示
   1 local options =
				{
			
   2     type='group',
   3     args =
				{
   4         msg =
				{
   5             type =
				'text',
   6             name =
				'msg',
   7             desc =
				'The message text to be displayed',
   8             usage =
				"<Your message here>",
   9             get =
				"GetMessage",
  10             set =
				"SetMessage",
  11 
				},
  12 
				},
  13 }

这样之后,我们就建立了第一个附加斜杠命令叫做msg,它带有一个text类型的参数,并且可以用GetMessageSetMessage这两个方法来获得和设值,在后面完成后,你可以用/wh msg <message> 来调用它,现在让我们来写这两个函数,代码如下

切换行号显示
   1 function WelcomeHome:GetMessage()
   2 
				return
				self.message
   3 end
   4 
   5 function WelcomeHome:SetMessage(newValue)
   6 
				self.message = newValue
   7 end
   8 
   9 WelcomeHome.message =
				"Welcome Home!"
				--默认的初始值

好,接下来重载UI,并且打/wh看看吧,是不是多了一个msg的附加命令?

然后,我们可以通过/wh msg <message>这个格式来给它随意赋值了。

最后,我们只要改写ZONE_CHANGED()函数就可以让他输出我们想要输出的值。代码如下:

切换行号显示
   1 function WelcomeHome:ZONE_CHANGED()
   2 
				if
				GetBindLocation()
				==
				GetRealZoneText()
				then
   3 
				self:Print(self.message)
   4 
				end
   5 end

好了,去四周随便玩玩吧~~看看你的成果。

 楼主| 发表于 2007-7-11 17:31:57 | 显示全部楼层

让你的信息更显著一点

现在,我们要做的就是让这个提示信息更加显著一点了,记得那些经常在屏幕中间出现的小白字吗?? 比如说什么怒气不足啊,你背对着目标啊什么的,好了,现在我们就是要让我们的信息也出现在那里,还是一样,改代码吧。如下:

现在开始,我将不解释代码了,我希望你们能自己看懂这些代码了.

切换行号显示
   1 local options =
				{
			
   2     type='group',
   3     args =
				{
   4          msg =
				{
   5             type =
				'text',
   6             name =
				'Message',
   7             desc =
				'The message text to be displayed',
   8             get =
				"GetMessage",
   9             set =
				"SetMessage",
  10             usage =
				"<Your message here>",
  11 
				},
  12         showInChat =
				{
  13             type =
				'toggle',
  14             name =
				'Show in Chat',
  15             desc =
				'Toggles the display of the message in the chat window',
  16             get =
				"IsShowInChat",
  17             set =
				"ToggleShowInChat",
  18 
				},
  19         showOnScreen =
				{
  20             type =
				'toggle',
  21             name =
				'Show on Screen',
  22             desc =
				'Toggles the display of the message on the screen',
  23             get =
				"IsShowOnScreen",
  24             set =
				"ToggleShowOnScreen"
  25 
				},
  26 
				},
  27 }

接着是新的默认值

切换行号显示
   1 WelcomeHome.showInChat =
				false
   2 WelcomeHome.showOnScreen =
				true

新的get/set方法

切换行号显示
   1 function WelcomeHome:IsShowInChat()
   2 
				return
				self.showInChat
   3 end
   4 
   5 function WelcomeHome:ToggleShowInChat()
   6 
				self.showInChat =
				not
				self.showInChat
   7 end
   8 
   9 function WelcomeHome:IsShowOnScreen()
  10 
				return
				self.showOnScreen
  11 end
  12 
  13 function WelcomeHome:ToggleShowOnScreen()
  14 
				self.showOnScreen =
				not
				self.showOnScreen
  15 end

最后新的显示方法:

切换行号显示
   1 function WelcomeHome:ZONE_CHANGED()
   2 
				if
				GetBindLocation()
				==
				GetSubZoneText()
				then
   3 
				if
				self.showInChat then
   4 
				self:Print(self.message)
   5 
				end
   6 
   7 
				if
				self.showOnScreen then
   8             UIErrorsFrame:AddMessage(self.message,
				1.0,
				1.0,
				1.0,
				5.0)
   9 
				end
  10 
				end
  11 end

去看看显示在屏幕中央的字吧~ " height="15" alt="" src="http://wiki.cwowaddon.com/wiki/htdocs/icefire/img/smile.png" width="15"/>

 楼主| 发表于 2007-7-11 17:33:06 | 显示全部楼层

保存你的设置

有一件事情你也许发现了,每次重新加载UI后,你设置的message都重新变回默认的了,的确是这样,那么我们在哪里能保存这些设置呢?

WOW提供了一种方法用来保存这些设置,但是ACE提供了它自己的方法来保存,就是用AceDB-2.0库,我们已经在toc文件里加入了这个库,但是我们在前面并没有将它混入进来,没错,你猜对了,改代码,如下:

切换行号显示
   1 WelcomeHome =
				AceLibrary("AceAddon-2.0"):new("AceEvent-2.0",
				"AceConsole-2.0",
				"AceDB-2.0");

接着,我们要修改一下默认代码的设置,我们要将他们保存下来。如下:

切换行号显示
   1 WelcomeHome:RegisterDB("WelcomeHomeDB",
				"WelcomeHomeDBPC")
   2 WelcomeHome:RegisterDefaults("profile",
				{
   3     message =
				"Welcome Home!",
   4     showInChat =
				false,
   5     showOnScreen =
				true,
   6 }
				)

在这里,我们使用了profile来保存,你也可以使用char, class, realm or account来保存,请参见AceDB-2.0 API。 自然,我们也要修改get/set方法,让他们直接修改保存的文件,这样,当你重载UI后,数据就不会丢失了。代码如下:

切换行号显示
   1 function WelcomeHome:GetMessage()
   2 
				return
				self.db.profile.message
   3 end
   4 
   5 function WelcomeHome:SetMessage(newValue)
   6 
				self.db.profile.message = newValue
   7 end
   8 
   9 function WelcomeHome:IsShowInChat()
  10 
				return
				self.db.profile.showInChat
  11 end
  12 
  13 function WelcomeHome:ToggleShowInChat()
  14 
				self.db.profile.showInChat =
				not
				self.db.profile.showInChat
  15 end
  16 
  17 function WelcomeHome:IsShowOnScreen()
  18 
				return
				self.db.profile.showOnScreen
  19 end
  20 
  21 function WelcomeHome:ToggleShowOnScreen()
  22 
				self.db.profile.showOnScreen =
				not
				self.db.profile.showOnScreen
  23 end
  24 And here is the new event handler:
			
  25 
  26 function WelcomeHome:ZONE_CHANGED()
  27 
				if
				GetBindLocation()
				==
				GetSubZoneText()
				then
  28 
				if
				self.db.profile.showInChat then
  29 
				self:Print(self.db.profile.message);
  30 
				end
  31 
  32 
				if
				self.db.profile.showOnScreen then
  33             UIErrorsFrame:AddMessage(self.db.profile.message,
				1.0,
				1.0,
				1.0,
				5.0);
  34 
				end
  35 
				end
  36 end

就象你看见的一样,每次我们都是读取保存文件中的值,他们绝对不会因为你的重载UI而变化了。 这个练习其实有一点点无聊,因为你以后做的插件总是在初始化的时候就读取这些变量了,不可能会直接在函数里去读,但是你要明白的整个过程和如何来获得这些值。

本地化

有一件事情,是大多数开发者(尤其是英语使用者)会经常忘记的,那就是很多使用他们开发的插件的玩家也许并不在一个英文服务器中。 这就是说,应该有一种简洁的方法能够使他们进行本地化的工作。(当然,那些本地化工作者能够将他们本地化的文件提供给原作者就更好了) 在ACE2中,我们使用AceLocale-2.2库来帮助大家。这个库不象前面能混合使用,所以用起来有点不同。

 楼主| 发表于 2007-7-11 17:33:22 | 显示全部楼层

加入AceLocale-2.2

首先,让我们把AceLocale-2.2 library包放到Libs文件夹中,并且我们要先建立一个空的文件来存放这些需要本地化的数据。先建立一个叫做Locale-enUS.lua空文件到你的文件夹下。

这个时候,你的文件夹结构应该是这样的:

然后,修改一下toc文件,你没忘记吧?

## Interface: 20000
## Title: Welcome Home
## Notes: Displays a welcome message when you get to your home zone.
## Author: Your Name Here
## Version: 0.1
## OptionalDeps: Ace2
## SavedVariables: WelcomeHomeDB
## SavedVariablesPerCharacter: WelcomeHomeDBPC
## X-Category: Interface Enhancements

Libs\AceLibrary\AceLibrary.lua
Libs\AceOO-2.0\AceOO-2.0.lua
Libs\AceAddon-2.0\AceAddon-2.0.lua
Libs\AceDB-2.0\AceDB-2.0.lua
Libs\AceConsole-2.0\AceConsole-2.0.lua
Libs\AceEvent-2.0\AceEvent-2.0.lua
Libs\AceLocale-2.2\AceLocale-2.2.lua

Locale-enUS.lua
Core.lua

注意,Locale-enUS.lua要写在Core.lua之前,这个是很重要的,记住!

这次,因为你修改了toc文件包含的库和文件,使用/reloadui将没用了,你一定要重新登陆一次了,确保插件可以正常运行。

绑定本地文件

现在,我们可以在Locale-enUS.lua这个文件中放入那些在英语环境下工作的数据,我们需要在原代码中仔细找一下哪些数据是需要本地化的。 当然,在你以后的写插件的过程中,这个步骤是要第一步做的。

在观察过Core.lua后,我找到了这些数据:

切换行号显示
   1 local L =
				AceLibrary("AceLocale-2.2"):new("WelcomeHome")
   2 
   3 L:RegisterTranslations("enUS",
				function()
				return
				{
   4 
				["Slash-Commands"]
				=
				{
				"/welcomehome",
				"/wh"
				}
   5 
			
   6 
				["Welcome Home!"]
				=
				true,
				-- default message
   7 
			
   8 
				["Message"]
				=
				true,
   9 
				["Sets the message to be displayed when you get home."]
				=
				true,
  10 
				["<your message>"]
				=
				true,
				-- usage
  11 
			
  12 
				["Show in Chat"]
				=
				true,
  13 
				["If set, your message will be displayed in the General chat window."]
				=
				true,
  14 
			
  15 
				["Show on Screen"]
				=
				true,
  16 
				["If set, your message will be displayed on the screen near the top of the game field."]
				=
				true,
  17 }
				end)

这个文件有两部分组成,第一部分我们建立了一个本地化的实例,叫做"WelcomeHome",第二部分我们建立了一个匿名的函数,用来返回需要的字符串,将值设置为true,表示返回的值将和标识名相同,比如我们需要Welcome Home!的时候,将会返回"Welcome Home!"这个字符串。

 楼主| 发表于 2007-7-11 17:33:47 | 显示全部楼层

在插件中使用本地化文件

前面我说过,不能使用混入方式来实例化AceLocale,我们要自己实例化一个出来。

切换行号显示
   1 local L =
				AceLibrary("AceLocale-2.2"):new("WelcomeHome")

好了,添加代码吧,把下面的代码添加到Core.lua的顶端,确保在数组建立前初始化。

切换行号显示
   1 local L =
				AceLibrary("AceLocale-2.2"):new("WelcomeHome")
   2 Now we can use this anywhere we need a string.
				For example the first part of our options table now becomes this:
			
   3 
   4 local opts =
				{
			
   5     type='group',
   6     args =
				{
   7          msg =
				{
   8             type =
				'text',
   9             name = L["Message"],
  10             desc = L["Sets the message to be displayed when you get home."],
  11             usage = L["<your message>"],
  12             get =
				"GetMessage",
  13             set =
				"SetMessage",
  14 
				},
  15 
				...etc...
  16 
				}
  17 }

代码很简单,我就不把多余的写出来了。你可以参照后最后的完整版本。

结论

到现在为止,你从一点也不会到自己完成了一个能够本地化的,拥有斜杠命令,能响应事件,能提供交互的插件。相信我,如果你继续努力,你会在插件中发现更多有趣的东西。

最后,希望这个教程能够使你踏上ACE2开发的道路,最终写出属于你自己的插件,祝你好运。

 楼主| 发表于 2007-7-11 17:34:12 | 显示全部楼层

在插件中使用本地化文件

前面我说过,不能使用混入方式来实例化AceLocale,我们要自己实例化一个出来。

切换行号显示
   1 local L =
				AceLibrary("AceLocale-2.2"):new("WelcomeHome")

好了,添加代码吧,把下面的代码添加到Core.lua的顶端,确保在数组建立前初始化。

切换行号显示
   1 local L =
				AceLibrary("AceLocale-2.2"):new("WelcomeHome")
   2 Now we can use this anywhere we need a string.
				For example the first part of our options table now becomes this:
			
   3 
   4 local opts =
				{
			
   5     type='group',
   6     args =
				{
   7          msg =
				{
   8             type =
				'text',
   9             name = L["Message"],
  10             desc = L["Sets the message to be displayed when you get home."],
  11             usage = L["<your message>"],
  12             get =
				"GetMessage",
  13             set =
				"SetMessage",
  14 
				},
  15 
				...etc...
  16 
				}
  17 }

代码很简单,我就不把多余的写出来了。你可以参照后最后的完整版本。

结论

到现在为止,你从一点也不会到自己完成了一个能够本地化的,拥有斜杠命令,能响应事件,能提供交互的插件。相信我,如果你继续努力,你会在插件中发现更多有趣的东西。

最后,希望这个教程能够使你踏上ACE2开发的道路,最终写出属于你自己的插件,祝你好运。

 楼主| 发表于 2007-7-11 17:34:30 | 显示全部楼层

代码

WelcomeHome.toc

## Interface: 12000
## Title: Welcome Home
## Notes: Displays a welcome message when you get to your home zone.
## Author: Your Name Here
## Version: 0.1
## OptionalDeps: Ace2
## SavedVariables: WelcomeHomeDB
## SavedVariablesPerCharacter: WelcomeHomeDBPC
## X-Category: Interface Enhancements

Libs\AceLibrary\AceLibrary.lua
Libs\AceOO-2.0\AceOO-2.0.lua
Libs\AceAddon-2.0\AceAddon-2.0.lua
Libs\AceDB-2.0\AceDB-2.0.lua
Libs\AceConsole-2.0\AceConsole-2.0.lua
Libs\AceEvent-2.0\AceEvent-2.0.lua
Libs\AceLocale-2.2\AceLocale-2.2.lua

Locale-enUS.lua
Core.lua

Core.lua

local L = AceLibrary("AceLocale-2.2"):new("WelcomeHome")

local opts = { 
    type='group',
    args = {
         msg = {
            type = 'text',
            name = L["Message"],
            desc = L["Sets the message to be displayed when you get home."],
            usage = L["<your message>"],
            get = "GetMessage",
            set = "SetMessage",
        },
        showInChat = {
            type = 'toggle',
            name = L["Show in Chat"],
            desc = L["If set, your message will be displayed in the General chat window."],
            get = "IsShowInChat",
            set = "ToggleShowInChat",
        },
        showOnScreen = {
            type = 'toggle',
            name = L["Show on Screen"],
            desc = L["If set, your message will be displayed on the screen near the top of the game field."],
            get = "IsShowOnScreen",
            set = "ToggleShowOnScreen"
        },
    },
}

WelcomeHome = AceLibrary("AceAddon-2.0"):new("AceConsole-2.0", "AceEvent-2.0", "AceDB-2.0")
WelcomeHome:RegisterChatCommand(L["Slash-Commands"], opts)

WelcomeHome:RegisterDB("WelcomeHomeDB", "WelcomeHomeDBPC")
WelcomeHome:RegisterDefaults("profile", {
    message = L["Welcome Home!"],
    showInChat = false,
    showOnScreen = true,
} )

function WelcomeHome:OnEnable()
    self:RegisterEvent("ZONE_CHANGED")
end

function WelcomeHome:ZONE_CHANGED()
    if GetBindLocation() == GetSubZoneText() then
        if self.db.profile.showInChat then
            selfrint(self.db.profile.message)
        end

        if self.db.profile.showOnScreen then
            UIErrorsFrame:AddMessage(self.db.profile.message, 1.0, 1.0, 1.0, 5.0)
        end
    end
end

function WelcomeHome:GetMessage()
    return self.db.profile.message
end

function WelcomeHome:SetMessage(newValue)
    self.db.profile.message = newValue
end

function WelcomeHome:IsShowInChat()
    return self.db.profile.showInChat
end

function WelcomeHome:ToggleShowInChat()
    self.db.profile.showInChat = not self.db.profile.showInChat
end

function WelcomeHome:IsShowOnScreen()
    return self.db.profile.showOnScreen
end

function WelcomeHome:ToggleShowOnScreen()
    self.db.profile.showOnScreen = not self.db.profile.showOnScreen
end

Locale-enUS.lua

local L = AceLibrary("AceLocale-2.2"):new("WelcomeHome")

L:RegisterTranslations("enUS", function() return {
     ["Slash-Commands"] = { "/welcomehome", "/wh" }
     
     ["Welcome Home!"] = true, -- default message
     
     ["Message"] = true,
     ["Sets the message to be displayed when you get home."] = true,
     ["<your message>"] = true, -- usage
     
     ["Show in Chat"] = true,
     ["If set, your message will be displayed in the General chat window."] = true,
     
     ["Show on Screen"] = true,
     ["If set, your message will be displayed on the screen near the top of the game field."] = true,
} end)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 17:20

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表