返回首页

介绍
魔兽世界服务器的客户端应用程序是一些居住居住在客户端上的服务器和其他游戏功能的游戏功能。大多数服务器的功能包括由其他玩家共享的游戏环境。客户端功能,包括球员的用户界面,演示从服务器的消息,发送到服务器的玩家行动的消息。一些信息显示在渲染的三维世界球员的头像或香椿位于n的文本和/或在各种方式,为玩家提供状态信息显示的图形信息的形式和一些资料介绍。
魔兽世界提供了一个机制,为人们添加自己的组件,插件,游戏客户端。大部分插件都创建添加到标准的用户界面,以提供更多的信息。一些旨在取代标准的用户界面组件提供精简的控制和更紧凑的集或更换一些标准的用户界面组件,提供更丰富的环境,一些活动(如拍卖行插件拍卖,以帮助球员)。
大部分是由暴雪娱乐提供的用户界面,在Lua编写一个插件扩展,增强,或取代现有的客户端功能,还必须在Lua编写。插件程序员的一个相当大的社会存在着几个网站专门的插件管理,这些网站提供的源代码和想法的插件生成器源丰富的网站。安装标准的用户界面,似乎是一个Lua代码的编译版本,但是暴雪娱乐提供了一个工具包,世界魔兽界面插件包,它可以让一个人看到原始的Lua源和XML文件。该套件可通过暴雪的技术支持论坛和搜索提供最先进的日期链接。
有一个网站的数量以及出版,提供一个公平的信息的书籍。为深入讨论编写一个插件,在看的书籍和网站。这些书往往提供从各网站的讨论缺少的水平。另一方面,各种网站提供有关API的具体细节是相当好,可能提供的信息,更比一本书日期。这篇文章的目的是提供样本魔兽插件,将提供一个启发性的例子适合初学者。背景
有插件的用户界面,大致可分为几大类:插件来协助作战协助农业的插件(收集,如采矿活动)插件协助与其他玩家互动与管理公会,插件协助与拍卖行和非玩家角色的供应商。
有几种类型的战斗,并有专门的插件,以协助玩家对环境(PVE)战斗(往往是一个或两个也许五个球员打对人工智能的小组),玩家对玩家(PvP战斗)(倾向于同其他人打的人是较大的群体),在空袭作战(趋于大对人工智能玩的人组)。
已经成熟,各人民创造的插件与特别行动,以帮助由于魔兽世界的游戏,暴雪已经修改了API和暴雪提供的用户界面,因为他们已经学会的人在游戏中做什么。一些变化已经导致旧插件不再使用暴雪已经纳入他们的客户功能。一些变化,导致旧的插件暴雪修改API,使这些插件不再起作用时,暴雪决定,与游戏的理念相冲突的插件提供的功能不再起作用。使用代码
这个例子插件的功能是简单明了。它提供了状态信息的球员只有这使得源代码要简单得多。显示状态,也避免了一些插件执行的行动需要考虑。暴雪娱乐的开发者已修改的API​​的功能,是多年来对插件做许多开发商认为的行动提供额外的警卫,应只由一个球员。由于这是一个信息显示插件,这些规定,以减少软件代理商扮演一个角色的可能性不考虑。源代码包含了大量的意见,以帮助他人了解源。
此示例插件是作战信息类型的插件。它显示了一个球员的性格,玩家的宠物的健康和功率(法力,重点,愤怒等),如果有,以及当前选定的目标(目标的健康和力量的简单框架在这个意义上说是在世界其他一些玩家,非玩家角色,兽,或其他演员,球员字符作为目标选择)。这个插件还显示威胁级别的目标,这是一个攻击目标的意愿表示。
在这个插件的基本步骤以及大部分是:初始化任何全局变量注册的第一个事件,当玩家进入虚拟世界魔兽世界一旦进入虚拟世界,建立在魔兽API提供的各种部件的用户界面注册更新用户界面所需的事件,事件收到更新的用户界面
在这个例子中有两个文件,​​其中包含插件的内容表的插件和SimpleCombatHud.toc的main.lua其中包含的Lua源代码。因为这个插件创建的用户界面,使用Lua,有没有必要为一个XML文件来描述用户界面窗口结构。 。toc文件的名称必须是在该文件所在的文件夹,这些名称,文件夹的名称。toc文件名称相同,必须是相同的插件本身的名称。
命名一个插件是很重要的,所有的插件南空间以及魔兽世界客户端是一个全局命名空间。程序员必须小心地使用一些全局变量,尽可能在其插件,他们使用的名称应该是唯一的。这是为什么插件程序员将用一个Lua表变量是一个全球性的名称,作为自己的插件,然后由插件所需要的任何持久性数据到表。中等全局变量,如设置数据将使用衍生工具的插件名称,以减少与其他任何全局变量的名称冲突的可能性。利用当地的关键字是重要的临时变量,以减少混乱的全局名称空间和可能与现有的变量碰撞。TOC文件
。toc文件说明条目包含一个版本号,插件的描述,和插件功能,需要加载的文件列表插件。也有意见,允许程序员提供信息,任何人在寻找。toc文件。一些插件的网站使用信息。toc文件中提出的人正在寻找一个特定类型的插件的描述信息的一部分。这些网站可能有他们需要在网站分析,以确定类型的插件和如何分类的。toc文件中使用的特殊指令。
的前几行。toc文件的一个例子是以下。接口行表示版本的魔兽世界客户端,插件目标。如果指定的值是一个早期版本的魔兽客户端,插件将被禁止,除非球员选择日期插件加载。注释行提供了一个基本的介绍,将在魔兽插件管理对话框将标题行是什么。
实际的意见,可在该行的开头使用一个单一的井号(#)添加到该文件。

## Interface: 40000



## Title: A simple combat HUD

## Version: 1.0.0.1

## Author: Richard Chambers

## Notes: Provides a simple status bar showing the amount of health and 

   power of the player as a Heads Up Display.

...

。toc文件允许两个变量允许一个插件保存状态信息,当玩家退出,以便返回到相同的状态下一次玩家登录保存的变量是一个插件的基础上保存的指令,这意味着这些变量和它们的值可以为玩家的所有字符,和/或字符的基础上,这意味着这些变量及其值只提供给特定的字符。{C}main.lua文件
的文件main.lua包含的Lua源代码的插件。魔兽世界客户端事件驱动。有许多事件和各种事件,所以该插件必须注册为特定的事件,它希望得到的。每一帧部件有一个onEvent方法需要被重写,以收到的帧注册的事件。这样的基本程序是:创建框架添加您自己的OnEvent处理框架 注册你想要的事件处理框架部件
为了使Lua源代码更容易阅读和理解,使用的惯例是创建一个事件处理程序,有一个源的小身体,只是派遣事件消息等功能。事件处理程序编写为特定的事件和事件调度检查看到,如果一个函数的事件或不存在的功能。如果帧都有一个函数定义的事件的名称,然后在事件调度调用函数来处理事件。如果框架没有该名称的功能,则该事件将被忽略。这样的OnEvent处理程序如下所示使用无名,匿名,或lambda函数覆盖派遣事件消息帧的正常功能的框架onEvent方法。
-- Create our main table for this addon

SimpleCombatHud = SimpleCombatHud or {};



-- Create the frame that we will use for our events

SimpleCombatHud.frame = CreateFrame("Frame", "SimpleCombatHud", UIParent);

SimpleCombatHud.frame:SetFrameStrata("BACKGROUND");



-- Override the OnEvent() method to dispatch events to our processing functions.

-- Notice first argument is self referring to the frame allowing use of colon (:) notation.

SimpleCombatHud.frame:SetScript("OnEvent", 

function(self, event, ...) if self[event] then return self[event](self, ...) end end);

使用上述公约的框架重写onEvent方法后,我们现在可以做两件事情处理的事件:注册事件使用相同的名称作为事件本身提供了一个事件处理函数
这样做的一个很好的好处是函数来处理事件,在某些情况下,可以以其他方式重用。在下面的Lua源代码片段中,我们有一个事件处理函数,在某些情况下使用另一个事件处理函数。这个函数处理事件PLAYER_TARGET_CHANGED通过检查,看看是否有一个已经有针对性的单位。如果是的话,那么它更新显示目标的健康和电源。如果没有,那么目标的健康和电量显示帧被隐藏。{体C3}景点
播放魔兽世界和虚拟世界的乐趣是大和有趣的,虽然在次重复。由暴雪娱乐提供标准的用户界面看起来相当不错,一般玩游戏特别是一些精选的加入宏。然而严重的,硬的核心球员找到标准的用户接口,在许多方面缺乏。通过各种世界魔兽插件网站,人们可以找到在各种状态下的维修和实用性数以百计的插件。一些小的和基本的,像这样的例子和其他大型和复杂,如玩家在警告的形式提供了大量援助插件致命的老板MODS。
写魔兽世界插件的问题是缺少文档。已经写了许多书籍,有庞大的身躯是一个源代码例子,还有人提问,并接受援助的多个论坛。但是缺少文档是一个障碍,尤其是作为魔兽世界的编程环境的插件程序员也一个移动的目标,作为开发团队的补丁和扩展的变化,必须适应插件处理的变化。很多什么是插件的礼物上的各种活动和程序员转换的事件所提出的资料,使用Lua语言和魔兽API为基础。插件作家必须意识到事件与一个特定的标签不得与关联似乎什么关联。和使用在早期版本的魔兽事件在以后的版本可能不再有用。各网站可以帮助确定什么是有用的,什么是不。那些被作为新的扩展和补丁维护和升级插件被释放,是一个插件程序员有用的资源,这是由魔兽世界社会的一个庞大的身躯。
在发展过程中,你将最有可能进入聊天区需要打印变量和信息,以测试发生了什么事情。一个非常简单的调试,如下面的print语句可以帮助印刷信息。也有一些样品中插件的地方,在那里我用这个调试功能检查值,并看到了事情的原委。它被用来在那些地方,我已经离开函数注释掉,说明它可以用来看到什么可能会造成一个问题。只要确保当您使用面积的源代码,删除调试调用。这不仅是一个严重的性能问题,它也将是一个球员的一大烦恼。大多数球员都希望做一个插件,其功能并没有更多。{的C4}
播放测试一个插件在开发和维护是必须的。虽然暴雪娱乐提供了一个版本的魔兽客户端免费下载并播放世界,也有数量限制,其中之一是不允许使用的插件。所以,如果你有兴趣写魔兽世界插件,您将需要一个用户。播放测试需求,包括所有的球员在各种情况下的各种类。建立你自己的插件之前,你应该先看看一个类似的插件。它很可能是你可以把该插件的源代码,并使用它了一些调整,使您想看到的修改。如果他们是有用的MODS,联系插件的开发,或许他们将纳入整个社会的变化。
发挥这个插件测试的一个例子是使用宠物和那些没有的字符。播放测试以及调试功能的使用,允许我的经验,收集了各种检查,插件,提供合理准确的信息显示。我需要检查在各种环境和各种字符类的插件,然后调查不寻常的行为。一个这样的行为是显示不当作为目标时,一些非玩家角色选择的目标的权力。原来是由于一个事实,即一些非玩家角色有一个零的最大功率,在结束了原始的源代码在鸿沟零问题。
流行的插件的开发人员将发现有用的插件,使开发团队捐赠的人往往有一个机制。暴雪娱乐有一个插件的政策,介绍了一些基本做什么和不做的插件。如果你去魔兽世界网站,并做一个搜索插件政策,你应该能够找到它。基本是:虽然你可以接受捐赠,你不能收取该插件必须没有广告(包括捐赠广告)或反感的材料源必须是开放的,有形和视察,插件行为不能影响比赛和必须遵守的使用条款和许可协议。这基本上是指的是魔兽世界插件编写的大多数人,将是一个有趣的和有趣的努力,而不是一个赚钱的方式,至少不会是在官方插件政策。历史2011年11月25日 - 更新main.lua文件,以纠正缺陷发现后做一个区域的变化,健康和力量的显示值可能是过时的。

回答

评论会员:nortee 时间:2012/02/06
尼斯M8 ...我个人还没有时间去看看去哪里,以及为什么关于Lua和哇,这肯定是我的呼吸新鲜空气......这有一定帮助{S0} ...
欢呼声中,
,格伦Vlotman
"你不能为愚蠢代码"
评论会员:游客 时间:2012/02/06
nortee:我喜欢你的方法M8...伟大的工作...{S0的}
nortee:它是在那里(该死滞后)
欢呼声中,
,格伦Vlotman
"你可以不编写愚蠢"
:理查德・钱伯斯:更新到这个头,作战信息显示是几个事件,协助在战斗中的生存能力或走动时显示警告

一个很好的补充,将警告球员告诉球员移动环境的破坏源,如消防池。

战斗事件是从标准的事件,到一个帧不同。战斗事件是那么COMBAT_LOG_EVENT
一个简单的源代码更改为以下代码行添加到现有的main.lua源代码,创建一个为的COMBAT_LOG_EVENT_UNFILTERED标准事件处理程序。这段代码的作用是创建一个处理程序,如果有战斗事件类型的处理程序或功能,然后用适当的参数调用该函数的事件。如果没有,没有完成。

{C5的}
在此之后,您可以添加功能,将处理特定的事件和做什么都需要做通知球员。简单的东西使用的聊天记录看起来像下面的源代码。

{5233}
现在时收到,如果子类型的战斗记录事件是ENVIRONMENTAL_DAMAGE收到损坏的字符,如果是球员字符,一条消息将被打印的聊天记录
评论会员:游客 时间:2012/02/06
理查德的COMBAT_LOG_EVENT_UNFILTERED标准事件钱伯斯:事件UNIT_POWERUNIT_HEALTH更新各自的状态时,收到的事件酒吧(见SimpleCombatHud.frame:UNIT_POWER()和SimpleCombatHud.frame:UNIT_HEALTH(在文件main.lua))。更新状态栏,取决于该事件的描述变化(处理函数收到的第一个参数)的单位。这个插件的第一个版本使用声明,检查参数,如果参数是支持的单位之一:"球员","宠物",或"目标"如果您访问的表不存在的成员,你将获得零值,而不是实际值。这个值是逻辑假值相同。因此,在两个功能,而不是检查,看看如果函数的参数是一个支持的单位类型("玩家","宠物",或"目标"),相反,我们可以测试看看表,其中包含的状态栏各单位为单位的项目。{C7-}这一变化使小步朝着更简单,更可读的源代码。这种变化的结果是,我们可以添加额外的状态栏,其他单位和处理函数就不需要改变
理查德・钱伯斯:进一步发挥测试使用的随机地牢取景器离开时发现了一个问题,看到例如,在状态栏会显示不正确的状态。

这种行为可以看出一个字符,如死亡骑士或战士,当他们的权力栏显示一些符文能量,或者愤怒的金额,然后他们离开的实例。如果从区域变化的闪屏的量是足够的时间,状态栏将显示一些少量剩余,但在实际上没有权力。状态栏的更新,也不会进一步减少。它基本上显示的字符,当离开的实例相同的地位。

我怀疑是字符的符文能量或愤怒是在零上的服务器和服务器不再发送更新事件。其结果是,状态栏不再被更新,因为服务器不再发送字符的权力变化正在监视的事件。

我已经修改了我的这个示例插件的工作副本,加入监测的另外三个事件:
{C8的}
接下来,我添加了这些事件的事件处理程序:
function SimpleCombatHud.frame:ZONE_CHANGED()

	self:UNIT_HEALTH("player");

	self:UNIT_POWER("player");

	self:UNIT_HEALTH("pet");

	self:UNIT_POWER("pet");

	self:PLAYER_TARGET_CHANGED();

end

 

function SimpleCombatHud.frame:ZONE_CHANGED_NEW_AREA()

	self:ZONE_CHANGED();

end

 

function SimpleCombatHud.frame:ZONE_CHANGED_INDOORS ()

	self:ZONE_CHANGED();

end


现在,当我做了一个建立我的死亡骑士的符文能量,要实例门口,等待几乎耗尽,然后进入入口后,到该实例的条目与闪屏完成的测试,状态栏更新显示正确的状态