雷 的个人资料AbbeyGong's Spaces照片日志 工具 帮助
2006/8/30

如何把SATA/RAID驱动集成到win xp 安装盘里?

让SATA"嫁给"Windows XP

   SATA硬盘有不少优点,但安装操作系统实在麻烦,不仅要抓住机会按"F6"键加载STAT的驱动程序,还要制作带驱动程序的软盘。要命的是如果新机器没有配置软驱,那可就大眼瞪小眼了……来制作一张含SATA驱动程序的WinXP安装光盘吧。你会发现:原来加载SATA硬盘驱动其实很简单。

为了不再让WinXP的安装过程需要通过软盘加载SATA驱动程序,很多人都梦想主板的SATA驱动程序集成到安装光盘中,本文就来DIY一张集成SATA驱动程序的Windows XP安装光盘!

Windows XP安装目录及文件准备

打开资源管理器,在一个拥有足够磁盘空间(空闲空间至少为700MB;如果将生成后的光盘镜像也放在该分区,则应当保证有一张光盘的双倍容量的空间,即1.4GB左右)的硬盘分区上创建一个文件夹,比如"D:\XPSATA",用于保存Windows XP的全部安装文件。

把一张完好的Windows XP安装光盘放入光驱,在资源管理器中将光盘中的文件全部选定,再复制到"D:\XPSATA"目录中。

准备驱动程序文件

一般随主板附送的驱动程序安装光盘中都有SATA的驱动程序。打开光盘目录,寻找名称中含有"SATA"或"RAID"字符的文件夹;也可在主板制造商的网站或其它驱动程序下载站点(如:驱动之家"http://www.mydrivers.com "等)寻找与自己的主板芯片组相匹配的SATA驱动程序。

在D盘中建立一个新的目录(如"STATDRV"),然后将找到的SATA驱动程序文件全部拷贝到这个目录中(D:\SATADRV)。这里我们以Si3112的SATA驱动程序为例进行介绍。其它类型的SATA驱动程序的集成步骤几乎完全相同,所不同的仅仅是驱动程序文件名的不同而已。

在这个"D:\STATDRV"的文件夹中,一定会有一个扩展名为".inf"或".oem"的小文件,如"oemsetup.inf"或者"txtsetup.oem"等(本例中为"txtsetup.oem"),用记事本程序打开它,随后要用!

编辑"txtsetup.sif"文件

打开"D:\XPSATA\I386"文件夹,找到一个名为"txtsetup.sif" 的文件,这是Windows XP在安装时加载驱动程序的信息文件,用记事本程序打开它。

按"Ctrl+F"快捷键,打开查找对话框,以"[SourceDisksFiles]"为关键字进行查找(图1)。找到这个字段后,其下面已经存在一些内容(图2)。翻页到这个字段的末尾(注意:不是整个文件内容的末尾),添加以下内容:"si3112.sys = 1,,,,,,3_,4,1"。

图1

图2

这里的"si3112.sys = 1,,,,,,3_,4,1"是描述驱动程序所在位置的代码。代码的格式为"filename_on_source=diskid,subdir,
upgradecode,newinstallcode,spare,spare,newfilename",在"txtsetup.sif"文件中的"[SourceDisksNames]"和"[WinntDirectories]"等字段中有详细的描述。有兴趣的朋友可以深入研究其它目录的对应关系,这里仅简单介绍。

在实际操作时,绝对不可以照搬代码!特别是扩展名为SYS的文件"si3112.sys",它是SATA驱动程序目录"D:\STATDRV"中的驱动程序文件名,如果读者的SATA驱动程序与本文所述的不同,则只需换成目录中相应的文件即可。

切换到前面打开的"txtsetup.oem"文件,以"[HardwareIds."为关键字进行搜索,应该可以找到类似"[HardwareIds.SICS.Si3112]"的字段。

该字段下的代码如:"id ="PCI\VEN_1095&DEV_3112 &SUBSYS_31121095", "Si3112""。

切换到刚才打开的"txtsetup.sif"文件窗口中,以"[HardwareIdsDatabase]"为关键字进行搜索。找到后,将"txtsetup.oem"文件中"[HardwareIds.SICS.Si3112_XP]"字段下的代码拷贝到"txtsetup.sif"文件的"[HardwareIdsDatabase]"字段末尾。不过,我们需要更改一下代码的格式,如将"id ="PCI\VEN_1095&DEV _3112&SUBSYS_31121095", "Si3112""改为:"PCI\VEN_1095&DEV_3112&SUBSYS_31121095 = "Si3112""(其他代码修改方法相同),更改后的代码如下:

PCI\VEN_1095&DEV_3112&SUBSYS_31121095 = "Si3112"

PCI\VEN_1095&DEV_3112&SUBSYS_34238086 = "Si3112"

PCI\VEN_1095&DEV_3112&SUBSYS_311215D9 = "Si3112"

PCI\VEN_1095&DEV_3112&SUBSYS_B0021458 = "Si3112"

PCI\VEN_1095&DEV_3112&SUBSYS_01661028 = "Si3112"

PCI\VEN_1095&DEV_3112&SUBSYS_82141033 = "Si3112"

PCI\VEN_1095&DEV_3512&SUBSYS_35121095 = "Si3112"

PCI\VEN_1095&DEV_3512&SUBSYS_01661028 = "Si3112"

提示:不同SATA驱动程序的代码内容各不相同,应该根据具体情况灵活处理。

检查拷贝修改的内容是否与原有的内容重复,如果有,则把重复的一行删除。接着在"txtsetup.sif"文件查找"[SCSI.load]"和"[SCSI]"字段,添加如下内容:

[SCSI.load]

si3112 = si3112.sys,4

[SCSI]

si3112 = "Silicon Image SiI 3112 SATALink Controller"

至此,我们就把自己的SATA驱动程序的相关信息添加到了Windows XP安装信息文件"txtsetup.sif"中了!

上述添加自定义SATA信息内容的步骤看似很复杂,其实也就是同时打开Windows XP安装文件目录中的"txtsetup.sif"文件和驱动程序目录中的".inf"或".oem"信息文件,然后将后者文件中相关字段下面的内容一一对应地移植到"txtsetup.sif"文件中。知道了方法,做起来就要容易些了!

修改"winnt.sif"文件内容

现在,我们已经完成了两个最重要的步骤:一是获取了SATA驱动程序文件,它们现在被保存在"D:\STATDRV"文件夹中;二是修改了Windows XP安装时自动加载驱动程序的信息文件"txtsetup.sif"。但现在有一个新的问题:Windows XP在安装时如何知道它所需要的驱动程序文件在哪个目录下呢?

这个问题则需要通过修改"winnt.sif" 这个文件来解决。这个文件是Windows XP系统在安装时的附加信息文件,可以在其中指定非微软提供的第三方驱动程序的安装路径。

对于本例,在"D:\XPSTAT\I386"文件夹中用记事本创建一个文本文件,写好内容后,再将文件名改为"winnt.sif"即可。

在用记事本保存文件时,一定要输入完整的文件名,并且一定要用半角的双引号将文件名引起来,如""winnt.sif"",否则实际上生成的实际上仍然是个文本文件(Winnt.sif.txt),这将导致安装过程中出错,STAT驱动程序无法自动加载!

在"winnt.sif"文件中添加以下内容(如果已经存在部分内容,则应进行修改或添加,且保证每行的内容不要重复):

[Unattended]

OemPreinstall=Yes

OemPnPDriversPath="STATDRV"

上述代码最后一句引号中的内容是指随后生成光盘时,驱动程序相对于光盘根目录所在的相对路径。由于我们打算把保存驱动程序的"D:\STATDRV"文件夹放到新生成的安装光盘的根目录,因此不必包含任何子目录路径(图3)。

图3

将SATA驱动压缩到安装文件中

使用支持CAB文件格式的工具(如WinRAR等),将驱动程序目录中扩展名为SYS的文件添加到WindXP安装目录的CAB文件中。

这里我们可以使用Windows XP本身附带的一个命令行工具"makecab.exe",它位于"C:\WINDOWS\System32\"目录下。由于"System32"是默认的搜索路径,因此使用时不需要程序所在的路径。

在开始菜单中打开"运行"对话框,输入如下命令:"MAKECAB D:\STATDRV\SI3112.SYS D:\XP-STAT\i386\SI3112.SY_"(图4)。

图4

具体的驱动程序文件名和保存路径请根据实际情况灵活更改。

重新生成安装光盘

经过上述步骤,现在已经是万事俱备,只待刻盘了!

准备任意一款支持制作可引导型光盘的工具程序,如经典的软件"WinISO"、"ISOCommander"及国产软件"UltraISO"等均可。生成可引导光盘的方法有很多种,为避免大家到处寻找那些生僻的工具软件,这里以UltraISO为例,分若干个步骤进行:

(1)制作原始安装光盘镜像

这一步的目的是方便从制作出来的光盘镜像中提取引导文件。其实也有专门的直接提取光盘引导区的工具,但操作稍麻烦,因此在这里多花费一两分钟还是很值得的。

将Windows XP的原始安装光盘放入光驱中,启动UltraISO,按"F5"键,或者执行"工具"菜单中的"制作光盘镜像文件"(图5),根据提示指定一个镜像文件的保存位置,随后程序会自动开始读取光盘并完成镜像文件的制作。

图5

(2)提取光盘镜像中的引导信息

在UltraISO主界面中,执行"启动光盘"菜单中的"保存引导文件"命令(图6),将引导信息保存到硬盘上备用,比如保存为"D:\Boot.bin"。

图6

(3)新建光盘镜像

在UltraISO的"文件"菜单中执行"新建"命令;从资源管理器中,将前面我们已经准备好的"D:\XPSTAT"文件夹中的所有文件拖入UltraISO右上侧的文件窗口中。

将"D:\STATDRV"目录直接拖放到UltraISO右上侧的文件窗口中,完成后在光盘的根目录中应当可以看到"STATDRV"的文件夹。

提示:

拖放时一定不要包含XPSTAT目录本身!也就是说,文件添加成功后,在光盘的根目录下应当可以看到"I386"文件夹。

(4)加载引导信息文件

执行"启动光盘"菜单中的"加载引导文件"命令,找到上一步提取的光盘镜像的引导文件,即"D:\Boot.bin"。现在,新建的光盘镜像就具备与原版Windows XP安装光盘相同的引导功能了。

(5)保存光盘镜像

按"CTRL+S"或者执行"文件"→"保存"命令,指定一个保存光盘镜像的路径和文件名(如"F:\XPSTAT.ISO"等),确定后UltraISO就开始向指定路径生成光盘镜像文件了。

(6)刻录安装光盘

使用Nero或者其他任意一款支持光盘镜像文件刻录的工具软件,将上述得到的光盘镜像文件(这里即F:\XPSTAT.ISO)刻录到光盘中。现在,用这张安装盘在支持SATA的硬件环境下全新安装Windows XP,你就既不必碏6,也不需使用什么软盘,非常方便。

制作集成SATA驱动程序的Windows XP安装光盘是一件比较复杂的工作,任何一个小小的失误都可能导致无法正确地加载驱动程序。此外,不同主板附带的SATA驱动程序的文件名称、数量、信息文件的内容各不相同,在集成时不能硬套,只有举一反三才能成功。

2006/8/27

用实例学习flexbar设计

前言

本文分为《前言》、《讲解》、《手册》三个模块。目录如下:

前言 ------- - 讲述flexbar是什么工具,我们为什么要选择flexbar

讲解 ------- - 又分为6个学习步骤
-- 基础语法 -----------2楼
-- 动作、事件和条件的概念 ----3楼
-- 常见应用实例 ---------4楼
-- 深入的例子---------- 5楼
-- flexbar设计的完整过程-----6楼
-- 完整的设计实例 --------7楼

手册 ---------又分为4个部分
-- 命令 -- -----------8楼
-- 事件 -- -----------9楼
-- 条件 -- -----------10楼
-- 变量 -- -----------11楼


××××××××××××××××××××××××××××××××××××××××××××××××××××××

在采用flexbar之前,我们先要明确4个问题。


flexbar是个什么样的工具呢?
简单地说这是个能让你随心所欲定制技能栏的工具。但flexbar能做的远不止这些,实际上flexbar能让你围绕按钮这个设计的核心,实现几乎所有功能。比如很多界面采用的statusbars在屏幕上显示双方血量,完全可以用flexbar模拟出来。所以使用flexbar要考虑的不是"能不能",而是"有没有必要"。真的很夸张。

wow总共有120个按钮,但我们在默认界面上只能看到72个。flexbar的功能就是把所有按钮都提供给玩家,让你随心所欲地安排和控制这些按钮。flexbar又把很多系统事件提供给玩家,比如"血量少于50%了"、"有人攻击你了"、"技能进入冷却期了"、"进入狂暴状态了"。在flexbar里你可以把事件和按钮绑定在一起,也可以单独处理这些事件。从而我们就可以做出这样的设计:"发生某某事,我们就怎么怎么应对"。当然,多数人使用flexbar主要的目的还是设计一个个性化的、趁手的、漂亮的操作界面,太复杂的功能需要lua的配合,不如直接写插件。呵呵。


flexbar能不能增强你的操作呢?
能,当然能。通过设置flexbar,你可以获得更佳、更智能化、更配合你操作习惯的界面设置。比如你是鼠标操作的,当你血量低于50%的时候在鼠标旁边自动出现一个喝血瓶的按钮,你就能更快地给自己补血。甚至你能设计"战斗中血量少于50%就自动喝血瓶",当然能增强操作了!但是由于暴雪禁止延时自动使用技能,你想操作真的强,还是得练习。flexbar是个初、中级玩家的捷径而已,再往上爬,还得靠自己。


设置flexbar前,我们需要如何整理自己的思路呢 ?
1 、我们的操作习惯是怎么样的。(大概分为全键盘、全鼠标、键盘+鼠标三种)
2 、我们喜欢的操作界面是怎么样的。(个人推荐越干净的越好)
3 、由上述两点,我们怎么去安排那些按钮。
4 、我们要对什么事件做出反应,如何反应。


设置flexbar,我们需要什么样的基础呢?
需要一点程序概念,但是很少很少。现在咱们的学校初中就有信息技术课,高中就接触VB或者数据库了。这就够了,你只需要一个概念而已。这个概念就是"发生xxx事情,我要做@@@"。再复杂一点,"发生xxx事情,我先看看我是否处于$$$状态,如果状态合适我就做@@@"。比如我们前面的例子:"战斗中血量少于50%就自动喝血瓶",翻译成设置思路就是:发生了"血量减少到50%以下"事件时,如果我"处于战斗状态",我就"喝血瓶"。然后再把思路翻译成代码就行了。翻译代码的过程完全是机械化的,最主要的还是你的思路。需要的程序基础很少。

我们只需要掌握flexbar语法,理解flexbar的动作、事件、条件的概念,再弄一个比较全面的手册就行了。英文好的朋友可以直接看flexbar包里面自带的手册,英文不好的我将提供一个整理补充版。


选择flexbar就意味着你选择了个性!

第一部分:基础语法


我们先看下面的这条命令,此命令将显示一个或者一组按钮。
/flexbar show [button=#] [group=#] [toggle='true'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']

其中:
/flexbar --是在系统聊天框里输入flexbar语句必须的,它告诉WOW"/flexbar后面的内容交给flexbar处理"。
flexbar的代码有3种执行方式:
1 、直接在聊天框输入
2 、在flexbar自带的代码窗口输入。方法是先在wow键盘设置那为flexbar代码窗口设置快捷键,然后按快捷键并选择script edit。在这个窗口里有7个部分。script name……代码名称;test script as script……将代码看作lua语句执行;test script as macro……将代码看作WOW宏执行;config……将代码看作flexbar配置脚本执行;import……加载FlexBar_Config.lua;restore……恢复前一次配置。
3 、编辑到flexbar目录下的flexbar_config.lua中。
如果你是在flexbar代码窗口和flexbar_config.lua中输入代码,"/flexbar "就不用输入了。三种代码设置方式中我推荐flexbar代码窗口,能批量输入又不象flexbar_config不方便修改。flexbar_config输入方式的优点是导入已经设计测试完成的代码比较简单。但有些语句是不能在flexbar_config里输入的,比如你的语句里包含双引号。

show --这就是命令词了,表示这条语句我们要执行什么动作。必须输入。

[button=#] --这表示你要显示的是一个按钮,或者一个按钮序列,或者一些按钮。在整个语句里这些按钮是动作的执行者。外面的那对方括号表示这部分可以没有。
只有一个按钮就直接把#替换为按钮编号,如 button=168 表示对第168号按钮进行操作。当操作对象是一个按钮序列时,如 button=1-12 表示对1到12号按钮进行操作。当操作对象是一些不成序列的按钮时:如 button=[1 2 5 7 ] 表示对1 2 5 7号共4个按钮进行操作。注意了,聪明的朋友可能会问 button=[1-12 37] 的写法对不对呢?很遗憾这样写是不支持的,而且flexbar设计者根本没有改进设计去支持它的意愿。

[group=#] --这表示你要显示的是一个按钮组,#表示组编号。在flexbar里你可以把一些按钮定义为一个按钮组,统一移动、修改各种属性等,很方便。定义组的方法是: /flexbar group button=1-12 anchor=1 把1至12号按钮定义为1号组。具体定义组的方法请参考后面的手册。

[on='event'] [target=<target>] --这两部分通常是一起写的,表示语句是在某事件发生时才起作用。其中on后面写事件,target后面写这事件发生在谁身上。如玩家血量低于50% 写作: on='healthbelow50' target='player' 。事件的含义和概念我们后面还要说的。

[if='condition'] --这部分写语句的执行条件,在flexbar里就是一个状态。如处于战斗状态 写作:if='affectingcombat<"player">' 。注意其中的 <"player"> ,这里指出是玩家处于战斗状态。当你在尖括号内写一个字符串而不是数字的时候,这对双引号是必须的。如果是数字就不用了,如 8号按钮内的技能处于冷却期 incooldown<8> 。条件的含义和概念我们后面还要说的。

[in=#] [tname=<timer name>] --这两部分应该属于WOW禁止的功能,我在使用的时候会提示出错。它们的含义分别是等(#×0.1)秒再执行,和某触发器在运行行时执行。这样就提供了完全自动化的使用技能的手段,有损游戏公平,我们在后面不会做介绍。


一个最常用的命令我们就介绍完了,内容好像挺多,实际对一个有丁点程序基础的人来说都是常识。呵呵。另一个要注意的问题是,在flexbar里所有涉及度量的数字都是单位的十分之一。例如:scale=5 其实是50%;color= [10 1 1]是暗红色;in= 50是5秒钟。

第二部分 动作、事件和条件的概念


前面我们反复强调flexbar设置的设计思路是:设想 翻译为 程序思路,然后再翻译为代码。
其中设想表现的是你的创意,翻译为代码则是按照手册机械翻译的过程,我都不多说了,我会给大家送一份手册。设想翻译为程序思路是我们学习的重点,程序基础好的朋友可以直接跳过这部分。

设想翻译为程序思路有两点:按钮放哪儿?什么情况下我要做什么?
"按钮放哪儿",我们需要显示按钮的命令show和移动命令moveabs和moverel,还有自动排列命令circlegroup、horizontalgroup和verticalegroup,请自行参考手册。"什么情况下我要做什么?"才是我们的设计重点。这就要依靠动作、事件和条件来实现了。

"动作"就是我们要干什么,如显示一个按钮、把某个技能放到某按钮里。
"事件"就是当什么事情发生的那一刻,如血量刚低于50%、刚进入或者退出战斗状态。
"条件"在flexbar里其实就是对你所处状态的一个判断。

很多朋友可能分不清事件和条件的区别。我试着讲一讲,不过这问题确实拗口。呵呵

事件和条件的主要不同就是:事件是一个时刻、一个时间点,而条件是一个状态、一个时间段。比如"你开始玩游戏",这是一个时间点,是一个事件;而"你在玩游戏"就是一个时间段了,就是一个条件。在语句执行的时候顺序是:当某事件(on后面的内容)发生的时候,等一段时间(in后面的内容),判断某条件是否成立(if后面的内容)。我们设计把设想翻译成程序思路的时候要特别小心事件和条件的区别。一个语句用程序思路来表示就是:
/flexbar 动作 button=动作的执行者 on='事件' target='谁发生这个事件' if='状态<"谁的状态">'



例1: mm生日那天,我经过花店的时候,我要买一束花。
"我"是动作的执行者;"买一束花"是动作;"mm生日那天"是个时间段是个条件;"经过花店"是个时间点,是个事件,这个事件是发生在"我"身上的。翻译成程序思路:
/flexbar 买一束花 button=我 on='经过花店' target='我' if='生日那天<"mm">'


例2: 玩家处于熊形态,而且玩家进入战斗时显示按钮组1 。
这里的动作是"显示";动作的执行者是"按钮组1"; "玩家处于熊形态"是时间段是条件;"进入战斗"是时间点是事件,这个事件发生在"玩家"身上。翻译成程序思路:
/flexbar 显示 group=1 on='进入战斗' target='玩家' if='处于形态<"熊形态">'
再按手册翻译成代码:
/flexbar show group=1 on='entercombat' target='player' if='hasaura<"熊形态">'



这样说不知道大家能不能理解。理解了事件处理,flexbar就变成一个简单却麻烦的工具了。有些大虾也把事件和条件的区别表述为:时间范围大的是条件,时间范围小的是事件。大家也可以作为参考。




小资料:对象有以下数种情况(具体某语句的对象请参考手册):
数字 --按钮 如左键点击按钮8时 on='leftbuttonclick' target=8
'player' --玩家 如玩家进入战斗 on='entercombat' target='player'
'target' --当前目标
'pet' --宠物
'party1' ~ 'party2' --队友1~4
'hostile' --目标是敌对的
'neutral' --目标是中立的
'friendly' --目标是友好的

第三部分 常见设计举例


本部分的学习主要涉及按钮的显示、隐藏、调整。所使用的事件和条件都是基础写法。
注:下面代码中前导字符是"--"的,表示这是一个注解。这种注解格式在flexbar中是一样的。


一 、显示并移动1-12号按钮到屏幕的底部,并排成横条

代码:
-- 先把1-12号按钮组合成按钮组1,方便操作。注意每个按钮组需要一个"锚",这个"锚"就是按钮组的组号。"锚"必须是按钮组里的一个按钮。
group button=1-12 anchor=1
-- 显示这些按钮。我们前面把它们组成了1号组
show group=1
-- 移动到屏幕底部。对组的移动,我们只需要移动它的"锚"。
moveabs button=1 xx=480 yy=80
-- 排列这些按钮成横条。其中padding是按钮之间的间距。
horizontalgroup group=1 padding=0 height=1





二 、用1-17号按钮设计一个在人物下方显示的技能栏(缩短鼠标点击技能的移动距离),此栏呈飞鹰状。


代码:

-- 这里逐渐显示各按钮并移动,方便观察整个调整过程
-- 1-5号按钮
show button=1-5
-- 移动第一个按钮到位
moveabs button=1 xx=500 yy=200
-- 其他按钮采用相对第一个按钮移动的方式,方便设计。其中dx是横坐标移动量,dy是纵坐标移动量。
moverel button=2 trgbtn=1 dX=-36 dY=16
moverel button=3 trgbtn=1 dX=-36 dY=-18
moverel button=4 trgbtn=1 dX=42 dY=16
moverel button=5 trgbtn=1 dX=42 dY=-18
-- 放大第一个按钮为1.2倍
scale button=1 scale=12

-- 6-9号按钮
show button=6-9
moverel button=6 trgbtn=2 dX=-35 dY=16
moverel button=7 trgbtn=2 dX=-35 dY=-18
moverel button=8 trgbtn=4 dX=35 dY=16
moverel button=9 trgbtn=4 dX=35 dY=-18

-- 10-12号按钮
show button=10-12
-- 修改按钮大小为60%。采用"按钮列表"写法主要为了示例。
scale button=[10 11 12] scale=6
moverel button=11 trgbtn=6 dX=-20 dY=0
moverel button=10 trgbtn=11 dX=-20 dY=0
moverel button=12 trgbtn=10 dX=1 dY=-22

-- 13-15号按钮
show button=13-15
-- 修改按钮大小为60%。采用了"按钮序列"的写法。
scale button=13-15 scale=6
moverel button=13 trgbtn=8 dX=34 dY=0
moverel button=14 trgbtn=13 dX=20 dY=0
moverel button=15 trgbtn=13 dX=1 dY=-22

-- 16-17号按钮
show button=16-17
scale button=16-17 scale=10
moverel button=16 trgbtn=10 dX=-32 dY=-8
moverel button=17 trgbtn=14 dX=20 dY=-8




三 、按钮组中的按钮,根据各按钮内技能设置的不同,在冷却期隐藏,完成冷却后显示。


代码:

-- 这段将按钮组横向排列,并以50%大小显示
group button=49-53 anchor=49
show group=49
scale group=49 scale=5
horizontalgroup group=49 padding=0
moveabs button=49 xx=522 yy=340
-- 49号按钮在技能完成冷却时显示。
-- 注意"冷却"的对象只能是一个按钮,所以我们下面对每个按钮都要做事件设计。
show button=49 on='cooldownmet' target=49
-- 49号按钮在技能开始冷却时隐藏
hide button=49 on='cooldownstart' target=49
show button=50 on='cooldownmet' target=50
hide button=50 on='cooldownstart' target=50
show button=51 on='cooldownmet' target=51
hide button=51 on='cooldownstart' target=51
show button=52 on='cooldownmet' target=52
hide button=52 on='cooldownstart' target=52
show button=53 on='cooldownmet' target=53
hide button=53 on='cooldownstart' target=53




四 、当战斗中血量少于50%的时候,在鼠标旁边显示一个按钮组。
这个按钮组里我们可以放入血瓶、血石、绷带等,方便补血


代码:(此段代码因为按钮一直跟随鼠标移动,所以占用比较多的资源)

-- 组起来,排列好
group button=23-25 anchor=23
scale group=49 scale=6
horizontalgroup group=23 padding=0
-- 当血刚刚掉到50%以下那一刻,并且玩家处于战斗状态,显示按钮并让按钮跟随鼠标。
movetomouse button=23 dx=-25 dy=25 on='healthbelow50' target='player' if='affectingcombat<"player">'
show group=23 on='healthbelow50' target='player' if='affectingcombat<"player">'
-- 血量升高超过80%那一刻,隐藏按钮。(不用再喝了吧)
hide group=23 on='healthabove80' target='player'





五 、选择敌对或中立目标时,弹出按钮组


代码:(flexbar不能在你不经取消当前目标就选择另一个目标时,对后一个目标进行判断。所以此代码有BUG,但无法解决)

-- 获得敌对和中立目标时显示第1组按钮。这里主要演示多事件对象时的写法
show Group=1 on='gaintarget' target=['hostile' 'neutral']
-- 获得友好目标时隐藏第1组按钮
hide Group=1 on='gaintarget' target='friendly'
-- 后面的代码省略




六 、给每个队友和自己头像旁边都弄个按钮
当他们被下了debuff时显示出来,方便治疗。(圣骑)


代码:

-- 布置按钮的语句省略
--
-- 在自己被弄上了毒、疾病、魔术伤害时,显示按钮24
show button=24 on='gaindebufftype' target=['中毒' '疾病' '魔术']
-- 当debuff被清除时,隐藏按钮24。注意语句最后的条件的写法。
hide button=24 on='losedebufftype' target=['中毒' '疾病' '魔术'] if='not hasdebufftype<["中毒" "疾病" "魔术"]>'
-- 后面省略队友的按钮设置




小资料:
1 、flexbar的屏幕坐标是一个直角坐标系,与其他系统的世界坐标系不同。flexbar认为屏幕的左下角是坐标原点。但是移动flexbar的按钮时,你移动的是按钮的左上角。这意味着你用 moveabs xx=0 yy=0 来显示一个按钮,此按钮将显示在屏幕之外了。


2 、WOW的技能条里面的按钮都是有一个号码的,这个号码和flexbar按钮号码相同。
系统主技能条对应1-12号按钮;第二技能条对应13-24号;右侧技能条对应25-36号;右侧2技能条对应37-48号;右下技能条对应49-60号;左下技能条对应61-72号。
我们在设计自己的技能栏时,最好以6或者12为单位把要显示出来的按钮定义在1-72号之间。这样我们就可以直接在系统按键定义的相应位置为这些按钮定义快捷键。那么我们即使离开了flexbar也不影响出招设置,这对全键盘操作的朋友很有益处。


3 、无论条件还是事件的对象都是可以有多个的。多个对象时要用中括号把所有对象括起来,多个对象之间要有一个空格作为间隔。如:['中毒' '疾病' '魔术']


4 、条件中是可以使用 and(而且)、or(或者)、not(否定)来连接多个条件的。比如
if='not hasdebufftype<["中毒" "疾病" "魔术"]>'
里面就有 not 来表示"没有"中毒、疾病、魔术等debuff的。这个条件还可以写作:
if='(not hasdebufftype<"中毒">) and (not hasdebufftype<"疾病">) and (not hasdebufftype<"魔术">)'
if='not (hasdebufftype<"中毒"> or hasdebufftype<"疾病"> or hasdebufftype<"魔术">)'
这就需要比较多的程序基础了。

第四部分:深入的例子


flexbar能做的远不止前面几部分所提到的,虽然掌握了前面的内容你已经能干得很漂亮。这部分我们将尝试接触flexbar的高级内涵!


一 、技能按钮映射
技能按钮映射为我们帮助战士、小德、撒满、盗贼等能转换自身状态的职业设计界面提供了方便。我们可以在界面上显示一组按钮,然后让这组按钮里的技能随我们的状态改变而改变。我们使用了映射技术时,多组按钮只需要定义一组快捷键。如果想使用前三部分的知识去实现是比较烦琐的。

我们前面也提到过,WOW的按钮都有一个编号,flexbar使用的就是WOW按钮,他们的编号是相同的。按钮映射就是把原来x编号按钮的功能映射到y按钮上。我们不能认为"映射"等同于"替换",被映射的按钮本身的功能并没有任何改变。只是我们点击x按钮时,我们的点击动作被转到Y按钮上去了。这时我们点击X按钮,实际等于点击了Y按钮。


映射语句:
/flexbar remap [button= #] [group=#] base= # [toggle= 'true'][reset='true'=] [on='event'] [target=<target>] [if='condition']

例子:
1 、映射13号按钮的功能到1号按钮上
remap button=1 base=13

2 、映射13-24号按钮的功能到1号按钮上
remap button=1-12 base=13
注意这里我们不需要写 base=13-24 ,因为flexbar会自动按顺序映射下去,直到你要求被映射的按钮都被映射为止。



看这个实用的例子:战士在战斗姿态、防御姿态、狂暴姿态,其身下的技能框将显示不能技能组合。

代码:

-- 这里只包含姿态转换时对按钮的处理。按钮布置请参考第三部分第2实例。
-- 将1-17号按钮定义为组
group button=1-17 anchor=1
-- 转换到防御姿态时,把25-41号按钮映射到按钮1-17号上。这样就保证了防御姿态时我们实际使用的是25-41号按钮。
remap button=1-17 base=25 on='GainAura' target='防御姿态'
-- 转换到狂暴姿态时把49-65号按钮映射到按钮1-17号上。
remap button=1-17 base=49 on='GainAura' target='狂暴姿态'
-- 当我们失去防御或者狂暴姿态时,都把1-17号按钮恢复到初试状态。也就是假设我们的初始状态是战斗姿态。
remap button=1-17 base=1 on='LoseAura' target='防御姿态'
remap button=1-17 base=1 on='LoseAura' target='狂暴姿态'
-- 获得仇恨或者进入战斗,显示1-17按钮。注意,因为有映射我们没有必要去显示18-65号按钮了。
show group=1 on='EnterCombat'
show group=1 on='gainaggro'
-- 失去仇恨或者离开战斗状态,隐藏1-17按钮。
hide group=1 on='loseaggro'
hide group=1 on='LeaveCombat'


在这里例子里,如果你能理解整个按钮变化的过程,你就完全明白所谓事件、所谓映射的含意了。我表述一下,你看咱们的理解相同吗?

1 、首先,我们先假设没有进入战斗时,我们正处于战斗姿态。我们没有进入战斗,所以我们的界面上将不显示按钮。
2 、开始进入战斗了,1-17号按钮显示出来,显示的是战斗姿态下使用的技能。
3 、因为是对方先出手,这位战士不能冲锋了。马上转为狂暴姿态,并用血换怒气。这时我们的代码将把1-17好按钮换成狂暴状态下的技能设置。
4 、战士一个拦截,马上转换为防御姿态充当肉盾。这时发生了两个事件:先是离开了狂暴姿态;后是进入防御姿态。那么我们的代码将先把1-17号按钮恢复成默认的战斗姿态下的技能设置;然后再把1-17按钮换成防御姿态下的技能设置!
5 、最后,PK完毕战士没有死。界面上的按钮也消失了,还视野一个干净。




二 、宠物技能的映射

宠物技能的映射对术士和猎人至关重要。可惜我所看到的中文资料都是从flexbar1.2版延续下来的,那时候可能没有这个功能。大家不得不求助于flexbar伴侣或者其他插件。现在宠物技能在flexbar里已经没有问题了!

看下面的代码:
把宠物技能映射到97-106上了。

-- 整理按钮97-106号
show button=97-106
group button=97-106 anchor=97
scale group=97 scale=7
Horizontalgroup group=97 height=1 padding=2
-- 映射宠物按钮1到技能按钮97上
-- 注意:宠物按钮的映射不能象技能按钮那样同时映射1-10号按钮的,只能一个一个来。
flexpet id=97 petid=1
flexpet id=98 petid=2
flexpet id=99 petid=3
flexpet id=100 petid=4
flexpet id=101 petid=5
flexpet id=102 petid=6
flexpet id=103 petid=7
flexpet id=104 petid=8
flexpet id=105 petid=9
flexpet id=106 petid=10
-- 在失去宠物时隐藏按钮,获得宠物时显示
hide group=97 on='losepet'
show group=97 on='gainpet'
-- 在进入游戏时,如果有宠物则显示按钮,如果没有则隐藏
hide group=97 on='profileloaded' if='not unitexists<"pet">'
show group=97 on='profileloaded' if='unitexists<"pet">'
-- 猎人的宝宝还存在复活的问题
show group=97 on='unitressed' target='pet'
hide group=97 on='unitdied' target='pet'


有人可能会有疑问:我招不同的宠物,宠物技能会跟随改变吗?
我试过,此技能栏会跟随宠物的不同而改变的。




三 、制作显/隐其他按钮的开关,并给开关弄上个性化贴图

代码:

-- 设置69号按钮的贴图
settexture id=69 texture='\\Interface\\AddOns\\FlexBar\\texture\\shenghuo.tga'
-- 建立一个技能组
group button=73-78 anchor=73
show group=73
scale group=73 scale=10
circlegroup group=73 padding=0
moverel button=73 trgbtn=57 dx=8 dy=-140
-- 此技能组在左键点击69号按钮时显示,右键点击69号按钮时隐藏。
show group=73 on='leftbuttonclick' target=69
hide group=73 on='rightbuttonclick' target=69


实际使用时你需要在flexbar目录下建立texture目录,并且把你的贴图拷贝进去。这些贴图要自己做(我的插件包里有),图片格式是tga,大小64*64pic ,色彩是24位色。或者使用WOW系统自带的贴图,如 texture='%macro120' 就调用了系统的第120号图标。




四 、在flexbar里调用系统函数

有段最常用的代码。在我们隐藏系统按钮栏后,要把系统的那些角色、技能书、天赋、任务、求助等按钮弄出来。我们可以找插件实现,不过flexbar能简单实现的事情实在没有那个必要。


代码:


-- 把系统主按钮实现在73-80号按钮上
flexscript id=73 texture='\\Interface\\AddOns\\FlexBar\\texture\\beibao.tga' script='OpenAllBags()' name='打开所有背包'
flexscript id=74 texture='\\Interface\\AddOns\\FlexBar\\texture\\quests.tga' script='ToggleQuestLog()' name='任务'
flexscript id=75 texture='\\Interface\\AddOns\\FlexBar\\texture\\character.tga' script='ToggleCharacter("PaperDollFrame")' name='人物属性'
flexscript id=76 texture='\\Interface\\AddOns\\FlexBar\\texture\\talents.tga' script='ToggleTalentFrame()' name='天赋'
flexscript id=77 texture='\\Interface\\AddOns\\FlexBar\\texture\\socials.tga' script='ToggleFriendsFrame()' name='好友'
flexscript id=78 texture='\\Interface\\AddOns\\FlexBar\\texture\\world.tga' script='ToggleWorldMap()' name='地图'
flexscript id=79 texture='\\Interface\\AddOns\\FlexBar\\texture\\help.tga' script='ToggleHelpFrame()' name='求助'
flexscript id=80 texture='\\Interface\\AddOns\\FlexBar\\texture\\spellbook.tga' script='ToggleSpellBook("spell")' name='技能书'


其中script后面的就是系统函数。贴图的做法与第二个例子相同。不过这些系统图标在WOW里没有相应编号,需要自己做或者拷贝别人的。


还有一个大家都喜欢的,在被恐惧和变羊之后回复正常视角。这些控制技真恶心啊!

runscript script='SetView(2)' on='losedebuff' target=['变形术' '心灵尖啸' '恐惧术' '破胆怒吼']
其中视角2是自己预先设置好的正常视角。





五 、在flexbar里调用一个自定义lua函数

如果代码比较短你可以用例三的语句自定义函数。
如 flexscript id=79 texture='\\Interface\\AddOns\\FlexBar\\texture\\help.tga' script='ToggleHelpFrame()' name='求助'

修改成flexscript id=79 texture='\\Interface\\AddOns\\FlexBar\\texture\\help.tga' script='ToggleHelpFrame()' name='myhelp'

就可以在runscript语句中用myhelp作为函数名调用。

如果代码比较长,你最好先用flexbar代码编辑器编辑好,或者写到flex_config.lua文件里作为一个自定义函数。

如发现部落,报告他的地点和坐标:
x,y=GetPlayerMapPosition("player");
SendChatMessage(GetMinimapZoneText().." <"..format("%.1f, %.1f", x * 100, y * 100)..">".." 有部落骚扰!!! ","yell");

写在flex_config.lua里是:
ShaoRaoBaoGao = {
x,y=GetPlayerMapPosition("player"),
SendChatMessage(GetMinimapZoneText().." <"..format("%.1f, %.1f", x * 100, y * 100)..">".." 有部落骚扰!!! ","yell")
}

然后在flexbar里用 runscript script='ShaoRaoBaoGao' 执行之。用代码编辑器定义,类似。




六 、在flexbar里调用一个自定义宏。

与定义和调用lua函数的方法类似。
我们用flexmacro语句定义宏,也可以用代码编辑器。执行宏是用runmacro命令。

例子:血量低于50%而且你有一个队伍时,执行宏。此宏在队伍聊天信息里显示"血+++++++++"和用表情喊救命。注意其中多行宏的写法。
runmacro macro=['/p 血+++++++++' '/求救'] on='healthbelow50' target='player' if='unitexists<"party1">'




flexbar既然能调用lua函数,那么其他插件能做到的,flexbar几乎都能做到了。呵呵。其限制只在于你知道多少WOW接口函数,你的设计能力去到什么地步而已。我自己不会去钻这些东西,需要的时候就用Winmpq解开暴雪所用的mpq文件看看,或者查查网上提供的函数表。




七 、为flexbar增加一个条件。

我们不但能使用flexbar提供的各种功能,还能自己为flexbar增加一些需要的东西。也就是为flexbar增加命令、事件、函数。flexbar的所有命令、事件、函数都用'数组名["<命令|事件|函数>名"]' 的方式定义,结合lua的非常灵活的函数定义方式,flexbar扩展性很强。开篇我们就说:flexbar能干什么?什么都能干,只看你愿不愿意这么干。

下面引用skor的牧师配置里的一个例子来说明,怎么为flexbar增加一个事件。

-- 为flexbar增加一个名为currentzone的条件。此条件判断当前是否在一个地域列表中(skor用来判断是否在副本)。

FBConditions["currentzone"] =
function(target)
if not target then return false end
if type(target) ~= "table" then
target = { target }
end

local index, value
for index, value in pairs(target) do
if type(value) == "string" then
value = string.lower(value)
local text = GetRealZoneText();
if text and (string.lower(text) == value) then
return true
end
end
end
return false
end

从这个例子我们可以看到flexbar的条件是定义在FBConditions数组里面的,这个数组的下标就是条件的名称。我们要为flexbar增加条件,只要往数组FBConditions里面加就是了。

执行了这串代码后,在flexbar语句中我们就可以使用currentzone作为条件名称进行条件判断了。
skor是这么使用新定义的条件的:

remap button=85-96 base=1 on='losebuff' target='暗影形态' if='not currentzone<["祖尔法拉克" "剃刀沼泽" "剃刀高地" "阿塔哈卡神庙" "奥达曼" "黑暗深渊" "黑石深渊" "玛拉顿" "诺莫瑞根" "斯坦索姆" "死亡矿井"]>'

含义为:当自己身上的暗影形态消失的时候,如果自己不在"…………"等地域中(实际就是不在副本),就把从1号按钮开始的按钮映射到85-96号按钮上。

注意其中新定义的currentzone条件的使用方法。





八 、为flexbar增加一个事件。

相对于增加条件,增加事件写起来简单些。但没有理解增加条件的原理,还是别贸然增加事件的好。增加事件的道理是一样的,只是增加一个事件不但要向flexbar声明这一新增事件,还需要调用FlexBar:RegisterEvent(event)方法向wow注册系统事件。

还是skor的牧师配置里的例子:

-- 为flexbar增加一个名为ZoneChanged的事件。

function Shirtan_ZoneChanged()
FB_RaiseEvent("ZoneChanged")
end
FB_RegisterEvent("ZONE_CHANGED_NEW_AREA","Shirtan_Zonechanged",Shirtan_ZoneChanged,true)

先看FB_RegisterEvent("ZONE_CHANGED_NEW_AREA","Shirtan_Zonechanged",Shirtan_ZoneChanged,true)
其中 第一个参数是系统事件的名称,这里是进入新地域。第二、三个参数是函数名,表明发生由第一个参数规定的系统事件后,由什么函数进行处理。这两个参数的区别是第二参数是个串,第三参数不需要加双引号,其实总是写成相同的就行了。原理上的分别,建议大家自己看FlexBar_HelperFunctions.lua文件里对此函数的定义,一两句说不清。第四个参数是一个逻辑值,说明第一参数是否是wow系统事件。


再看回
function Shirtan_ZoneChanged()
FB_RaiseEvent("ZoneChanged")
end

注意 Shirtan_ZoneChanged 这个函数名曾作为参数出现在 FB_RegisterEvent 的参数里面。 FB_RaiseEvent("ZoneChanged")是说在flexbar内部激发一个叫 ZoneChanged 的事件。

结合起来说,这些代码的含义为:用 FB_RegisterEvent 函数让flexbar向wow系统注册 ZONE_CHANGED_NEW_AREA 事件(地域改变)。并且告诉flexbar负责处理此系统事件的是 Shirtan_ZoneChanged 函数。当地域改变这一系统事件被flexbar接收到以后,flexbar就会自动调用 Shirtan_ZoneChanged 函数。在 Shirtan_ZoneChanged 函数里,我们简单地制造了一个flexbar内部的名为 ZoneChanged 的事件。这样我们就可以在命令中使用 ZoneChanged 事件了。


例如:
remap button=85-96 base=13 on='zonechanged' if='currentzone<["祖尔法拉克" "剃刀沼泽" "剃刀高地" "阿塔哈卡神庙" "奥达曼" "黑暗深渊" "黑石深渊" "玛拉顿" "诺莫瑞根" "斯坦索姆" "死亡矿井"]>'

含义为:当地域改变(我们自己定义的)时,如果自己是在副本中,那么将13号开始的按钮映射到85-96号按钮上去。



为flexbar增加函数和事件,已经不是单纯地玩flexbar了。如果你问"你怎么不写增加命令的方法啊?",那么让人脸红了,因为一直没想到需要增加命令的地方,我根本没办法举例。。。呵呵。。。强行弄个例子出来就违背了俺们"实用"的宗旨了。不过,我还能说一点:如果要自定义一个带target的事件,你在事件处理函数的定义那加上一个target参数就行了。。。呵呵



小资料

如何把自己增加的事件和函数放到flexbar里啊?

其实只要代码有机会运行就行了,方法很多。
最方便的就是把代码集中到一起输入到script编辑窗口中,用个名字存起来。比如上面的例子,存到一个叫 'Shirtan_ZoneChangeEvent' 的script中。
然后在flexbar载入设置的时候自动运行一次:
runscript script='Shirtan_ZoneChangeEvent' on='profileloaded'


在flexbar中输入配置和代码都有完善的机制. 对于初 中级玩家来说, 需要了解如下两图的内容:

图一: 到wow系统按键设置里为常用配置工具设定快捷键. 也可以只设flexbar主菜单的快捷键.

图二: flexbar代码编辑器的界面. 宏\lua代码\flexbar配置 都可以在这里编辑和运行. 而且可以进行命名保存, 方便在配置里进行调用. 前面初学者导入别人的界面只需要简单地将配置放到这里, 按config按钮运行一次flexbar设置代码就行了.比老版本的配置导入方式简单得多. 本节的内容都是以代码编辑器运行的, 后面的<完整实例>也一样.

第五部分 实际做一个设计的过程



一 、准备

回忆我们在前言里说的:设置flexbar前,我们需要如何整理自己的思路呢 ?
1 、我们的操作习惯是怎么样的。(大概分为全键盘、全鼠标、键盘+鼠标三种)
2 、我们喜欢的操作界面是怎么样的。(个人推荐越干净的越好)
3 、由上述两点,我们怎么去安排那些按钮。
4 、我们要对什么事件做出反应,如何反应。


这就是我认为必然的flexbar设计前的准备工作。我们设计一个界面,为的是配合我们的操作,而不是改变我们的操作。所以在设计代码前必须总结自己的操作方式,并设想需要通过界面优化改进的部分。界面越干净越好,这是我的一贯信念。界面越干净,我们观察到的环境细节就越多;而且从感觉上来说,我们就更能进入游戏而不是在操作一台电脑。操作习惯基本上分为:

全键盘操作 --实际第一次选择对手、对话、拣东西还是需要鼠标的。呵呵。全键盘操作下,右手负责出招,界面上就根本不需要保留按钮!界面设计工作量最低。不过我建议保留一些主要技能的冷却标志和射程标志。大家可以参考我的《全键盘操作法师界面》。

全鼠标操作 --出招都是用鼠标的,那么你的技能栏就要显示更多的按钮。并且要把这些按钮移到靠近身子的地方,通常是身下。尽量减少鼠标的移动距离。

鼠标和键盘混合操作 --需要显示按钮。可以象全鼠标那样显示一大堆按钮,也可以只显示鼠标操作那部分按钮。鼠标操作那部分也要尽量靠近身子,减少鼠标移动距离。

在准备工作阶段,脑子里要有一个比较清晰的界面和操作情形。要在纸上打个草稿做个规划,这个草稿丰俭由人了,呵呵。只要你自己能明白就行。另外还需要一个比较全面的flexbar手册放在手边。




二 、设计主要界面

我建议大家使用flexbar自带的编辑器进行编辑。聊天命令的方式不适合大量的代码输入和调整;flexbar_config文件修改不方便,而且最致命的是很多语句不能写到flexbar_config文件中,你还要用聊天命令的方式来补充。

1 、先清除flexbar里的垃圾,让flexbar恢复到干净状态。
/flexbar resetall confirm='yes'


2 、去掉系统技能栏。我们用上flexbar了,那系统栏就是累赘。
/flexbar runscript script='MainMenuBar:Hide()'


3 、在每次进入游戏的时候也要去掉系统技能栏啊。
/flexbar RunScript Script='MainMenuBar:Hide()' on='ProfileLoaded'


4、逐个显示你的按钮组,移动到合适位置。并记录它们的坐标(方法参考后面的小资料)。

5 、检查这些按钮,特别是其中你要自己指定贴图的按钮(包括自己画的和引用系统的)。保证这些按钮是干净的,否则flexbar试图定义贴图的时候将遭遇失败。


6 、隐藏不经常显示的按钮。并使用 lock button=1-120 命令把按钮位置固定下来。

7 、存盘当前设置: saveprofile profile='xxxx'
其中XXXX是你的存盘名。我建议你每做几步就存盘一次。如果不小心做了破坏性的操作,你可以用 loadprofile profile='xxxx' 恢复之。以减少损失。


注:在设计的过程中,我们通常要显示各个按钮的号码方便设计:
/flexbar text button=1-120 text='%d'




三 、为你的设计准备需要的宏

在代码编辑窗口输入代码后,在script name栏里写入一个名称。调试好后,按save按钮存盘。这样就建立了一个可以在flexbar里调用的宏或者lua函数。




四 、设计事件,并给自定义开关按钮贴图。

在这个阶段,我们要给一些按钮设计事件处理代码。比如什么时候隐藏、什么时候显示、什么时候映射、什么时候执行一个宏等。
设计的时候脑子里一定要清楚,你写的事件处理到底能干些什么。如果没把握,先写好调试语法没错误,就先放一放。后面我们还要进行总体调试的。

如果你在为一个按钮定义贴图、宏、lua代码时候出错。你就用 /flexbar clearflex id=# 命令清除那个按钮里的东西。这时肯定是原来按钮里面已经有定义了。

最后,记得每做几步就要存盘啊!




五 、对整个设计进行调试

你必须设想出和你的事件设计相关的所有情形和要求。包括一些作为开关的按钮。然后把这些情形都试一遍,没达到要求的马上改。实在想不到的就到论坛来问。这论坛高手还是很多的,笔者自己也快进入中级行列了,到时候我也许能帮上忙。呵呵。

然后,你还需要在实战中发现自己设置的缺陷并且改进之。
比如我的战士设计,朋友反应说:小组PK,我为了显示技能栏必须右键点击对手。我的人物就摆出了备战姿势。对手就会首先集中打击我。

我为他改进了设计,增加左键选择敌对和中立目标也能弹出技能栏的触发。避免了这个问题:
show group=1 on='gaintarget' target=['hostile' 'neutral']
hide group=1 on='losttarget' if='not affectingcombat<"player">'





六 、固化整个界面

这包括:
1 、去掉所有按钮里的文字。flexbar自己显示的东西 %d 显示按钮号码这时已经没有用了;%c 显示冷却时间,那字小得你要用放大镜;%b 按钮热键,也是没有用。反正咱们一律不要它!

/flexbar text button=1-120 text=


2 、锁定按钮里的技能。这些按钮的技能一定要锁,如果在PK的时候你不小心拖动了就麻烦。
/flexbar lockicon button=1-120


3 、让flexbar不要在执行命令后显示报告。你在flexbar里设计了宏尤其要锁,否则烦死。
/flexbar verbose state='off'


4 、如果你不稀饭鼠标经过按钮时,系统都显示一个提示,那么就把这个功能关掉。
/flexbar tooltip state='off'


5 、禁止在鼠标右键点击按钮的时候施放技能。特别是那些把按钮设计得比较靠近身子的人。我自己就试过在拣东西的时候无意把气定用掉了。心疼哦~~
/flexbar advanced button=1-120 state='on'


6 、你设计了100-110号按钮纯属装饰,不想让人按它?
/flexbar disable button=100-110 state='on'


7 、最后咱们再存一次盘。要知道各种死机会破坏我们的设置的,到时候我们只要载入存盘就行。


8 、整理你的所有代码,把历次修改都包含进去,作为存档。


9 、备份你的interface和wtf目录。省得以后测试其他插件的时候造成混乱。


10 、如果你愿意公布代码可以新开一个帖子。如果你不公布代码也没关系,只是千万别开新帖,这个版不允许开新帖贴效果图的。把你的界面贴到 http://bbs.wowar.com/viewthread.php?tid=96729 和大家分享你的快乐吧。



小资料:

第一次设置flexbar的时候,我们通常先用 unlock button=1-120 接锁所有按钮,然后手动拖动按钮到合适的位置的。最后再记录这些按钮的位置形成最终脚本。

那么如何找到我们的按钮坐标呢 ?

wow安装目录下 wtf\ 是保存系统参数的地方。
其中 <你的账号>\account\SavedVariables.lua 保存系统和各个插件的配置,flexbar的所有配置和存盘文件都保存在这里。各个按钮的坐标也是保存在这里的。

找到 "FBSavedProfile = {" 项目,在这句的下面有些类似 "[1]"之类的项目就是各个按钮的存盘了。其中" ["ycoord"] = 108,["xcoord"] = 299, "分别是y轴和x轴坐标。

升级到1.53。。。flexbar终于提供了更方便的获取坐标的方法:

在快捷键设置里,给 Button info tooltip toggle 设置一个键。按下去就能在鼠标移动到按钮上时现实组、映射、坐标等信息了。。。是不是方便多了 ?

第六部分 完整的例子


这里请大家移步查阅俺的另一个帖子,里面有全键盘法师和全鼠标战士的设置,还有俺的插件包:
http://wowbbs.mop.com/viewthread.php?tid=138181


其他朋友也有好些优秀设计,请看置顶贴版主做了索引。





小资料:

wow安装目录下的 interface\addons\ 是我们放插件的地方,想删除一个插件直接在这里删除就行了。

wow安装目录下的 wtf\ 是保存系统参数的地方。
config.wtf -------- 视频设置、登陆服务器等。
<你的账号>\account\ --------- 此目录保存插件、键盘、等设置。其中:
---- addons.txt --------保存你的插件名称,和各插件是否被你选用
---- SavedVariables.lua ---------保存系统和各个插件的配置,flexbar的所有配置和存盘文件都保存在这里。
---- bindings-cache.wtf ---------保存键盘设置.
---- macros-local.txt ---------保存WOW系统里的宏设置.

<你的id>\account\ 下还为你的各个人物建立了文件夹。这些文件夹下主要有两个文件:
chat-cache.txt --------- 聊天窗口设置
layout-cache.txt ---------各弹出窗口的位置等设置

第七部分 flexbar手册--flexbar命令


这些是俺收集整理,并啃e文手册补充成文的。设计的时候一般手边3本书:基础语法、实例、手册,俺算是一并提供了,质量如何大家评判。呵呵。





界面命令:

/flexbar show [button=#] [group=#] [toggle='true'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求显示按钮和组。

/flexbar hide [button=#] [group=#] [toggle='true'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求隐藏按钮和组。

/flexbar scale [button= #] [group=#] scale= # [toggle= #][reset='true'=] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求调整按钮的大小。scale的取值范围是5-50,也就是默认大小的50%-500%。

/flexbar shade [button=#] [group= #] color= [## #] [toggle= [###]][reset='true'=] [on='event'] [target=<target>] [if='condition'] [iftarg=] [in=#] [tname=<timer name>] [ttoggle='true']
按要求调整按钮的色彩。color实际上是rgb值,取值范围是0-10 ,1就表示红色最大值255的1/10

/flexbar fade [button= #] [group=#] alpha= # [toggle=#] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求调整按钮的透视效果。alpha的取值范围是1-10 ,取值为1时几乎看不见按钮。

/flexbar text [button=#] [group=#] [text='text'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求调整按钮的第一文字标识。flexbar的按钮有两个文字标识,第一个位于按钮的右上角,第二个位于右下角。text有三个特殊的取值,%c 显示冷却时间;%d 显示按钮编号;%b 显示按钮绑定的热键。

/flexbar text2 [button=#] [group=#] [text='text'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求调整按钮的第二文字标识。<其它同上>

/flexbar text3 [button=#] [group=#] [text='text'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
按要求调整按钮的第三文字标识,此文字标示显示在按钮中心。<其它同上>

/flexbar justifytext [button=#] [group=#] [pos=<position>] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
移动按钮里第一文字标识的位置。pos参数有9个选择:'topleft', 'top', 'topright', 'right', 'bottomright', 'bottom', 'bottomleft', 'left' , 'center'

/flexbar justifytext2 [button=#] [group=#] [pos=] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
移动按钮里第二文字标识的位置。<其它同上>

/flexbar shadetext [button=#] [group= #] color= [## #] [toggle= [###]][reset='true'=] [on='event'] [target=<target>] [if='condition'] [iftarg=] [in=#] [tname=<timer name>] [ttoggle='true']
/flexbar shadetext2 [button= #] [group= #] color= [toggle= 'true'][reset='true'=] [on='event'] [target=<target>] [if='condition'] [iftarg=] [in=#] [tname=<timer name>] [ttoggle='true']
分别调整按钮第一、第二文字标识的颜色。<其中color参数含义同 /flexbar shade 命令>

/flexbar showgrid [button=#] [group=#] [toggle='true']
/flexbar hidegrid [button=#] [group=#] [toggle='true']
显示和隐藏按钮背景的栅格。



操作命令:

/flexbar lock [button=#] [group=#]
锁定按钮或者组,使之不能移动。

/flexbar unlock [button=#] [group=#]
解锁按钮或者组,使之能够移动。按钮的左上角会出现一个标志,拖动这个标志就能移动按钮。

/flexbar moveabs button= # xx=# yy= # [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
移动按钮到屏幕的某个位置。xx,yy是坐标,flex的坐标系0点位于屏幕左下角。

/flexbar moverel button= # trgbtn= #dx= dy= [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
相对于另一个按钮移动。trgbtn是作为参照的按钮,dx,dy是相对移动量。注:默认的按钮长宽各38点。

/flexbar movetomouse button=# dx= dy= [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
相对于鼠标移动按钮。<其它同上>


组命令:

/flexbar group button= # anchor= #
将一些按钮组合为组。组合后的按钮将有一个共同的锚"anchor",此锚必须是组里的一个按钮。当按钮组合为组后,移动锚按钮就可以整体移动整个组。如果没有自定义组号,例如:group=2 ,那么锚的按钮号就成为组的编号。

/flexbar ungroup group=#
解散一个组。

/flexbar listgroups [group=#]
列出当前所有被定义的组。如果指定了组号,则列出该组内的按钮。

/flexbar circlegroup group=# [padding=#]
按环形排列一个组内的按钮。第一个按钮位于10点钟方向,第七个按钮位于环形的中央。padding是按钮的间距。这种排列方式最多只能有7个按钮。

/flexbar horizontalgroup group=# [padding=#] [height=#]
水平排列一个组内的按钮。padding是按钮间距,height是把按钮分成多少个行。

/flexbar verticalgroup group=# [padding=#] [width=#]
垂直排列一个组内的按钮。padding是按钮间距,width是把按钮分成多少个列。



其它命令:

/flexbar remap [button= #] [group=#] base= # [toggle= 'true'][reset='true'=] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
将一个ID的动作映射到一个按钮或组上。base参数指出了被映射的ID。flex和wow中的按钮都有一个ID,flex1.37版之后把两者的ID统一起来了。wow主技能栏对应flex 1-12号按钮;次技能栏对应13-24;右侧技能栏对应25-36 ;右2技能栏对应37-48 ;右下技能栏对应49-60 ;左下技能栏对应61-72 ;73以上分职业对应,如战士的攻击、防守、狂暴状态等。
此命令还能实现序列按钮的映射。例如:/flexbar remap button=1-12 base=13 将把ID 13 的动作映射到按钮1上,同时自动将14-24号ID的动作映射到按钮2-12上。
这个命令在和事件结合的时候特别有效,可以实现针对不同的情况设置技能栏的内容。

/flexbar advanced [button=#] [group= #] state= <'on'| 'off'>
将按钮设置为高级模式。高级模式下,只有左键才能使按钮动作,右键不能。这样就方便我们分别定义左右键的功能。

/flexbar disable [button=#] [group=#] state=<'on' | 'off'> [toggle='true'] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
使按钮保留设置但丧失功能。

/flexbar use button=# [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
模拟单击某按钮。(实际受WOW接口限制多多,呵呵)

/flexbar echo [button= #] [group=#] base= # [toggle= 'true'][reset='true'=] [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
引起按下某按钮的事件 ??

/flexbar lockicon [button=#] [group=#] [off='true']
锁定按钮里的技能,使之不能改变。

/flexbarraiseevent='event name' [source= <source>][on='event'] [target=<target>] [if='condition'] [in=#] name= [toggle='true'] [tname=<timer name>] [ttoggle='true']
创建一个定时器。即给flex创建一个事件类型?

/flexbar loadconfig config= 'config name'
/flexbar restore confirm= 'yes'
/flexbar safeload state=<'on' } 'off'>
载入一个flex设置文件。后一个命令用于恢复载入前的状态。第三个命令是载入保护的开关,如果关闭将不能使用第二个命令进行恢复。

/flexbar loadprofile profile= 'profile name'
/flexbar saveprofile profile= 'profile name'
载入或者保存文件

/flexbar resetall confirm= 'yes'
重新载入flex和设置。如果当前设置没手动保存,则会丢失。

/flexbar tooltip state=<'on' | 'off'>
鼠标经过某按钮是否显示提示的开关。

/flexbar verbose state=<'on' | 'off'>
flex执行某命令后是否显示报告的开关。

/Flexbar scripts
/Flexbar Events
/Flexbar Perf
/Flexbar AutoItems
/Flexbar Options
打开或者关闭 flexbar自带的相应编辑窗口。

/flexbar flexmacro id=# texture='texture name' name= 'macro name' macro= 'macro'[toggle='true'] [reset='true'= ]
创建flex宏。texture表示宏的图标;macro=后面写宏代码。
例1:/flexbar flexmacro id=120 texture='%macro120' name='DANCE' macro='/dance'
创建一个名为dance的宏,宏的内容是跳舞。
例2: /flexbar flexmacro id=120 texture='%macro120' name='Dance2' macro='dance macro'

/flexbar runmacro macro= 'macro' [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
运行一个宏。

/flexbar flexscript id=# texture= 'texture name' name= 'name' script= 'script'[toggle='true'] [reset='true'= ]
创建使用lua语言的flex宏。

/flexbar runscript script= 'script' [on='event'] [target=<target>] [if='condition'] [in=#] [tname=<timer name>] [ttoggle='true']
运行一个lau宏。

/flexbarflexpet id= # petid= # '[toggle= 'true'][reset='true'= ]
映射宠物按钮ID的动作到某ID的按钮上。

/flexbar clearflex id=#
清除某按钮ID的设置。

/flexbar Info
在text显示热键\组\映射信息

第八部分 flexbar手册--flexbar事件

事件:
事件只是在刚刚获得某状态的时候触发。事件、延时、条件的执行次序是 事件 → 延时 → 条件。


mouseleavebutton
mouseenterbutton
mouseentergroup
mouseleavegroup
Target=鼠标进入的按钮或者组
鼠标进入或者离开一个按钮或者组的范围

entercombat
eavecombat
不需要目标
玩家进入或者退出近战状态

gainaggro
loseaggro
不需要目标
玩家获得或者失去仇恨

startcombat
endcombat
Target=('player','target','pet','party1'-'party4')
进入或者脱离战斗效果(仇恨,近战等)

cooldownstart
cooldownmet
Target=按扭
动作开始进入或者完成冷却

outofrange
nowinrange
Target=按扭
动作超出或者进入射程范围

notenoughmana
enoughmana
Target=按扭
动作无或者获得足够魔法来释放

notusable
isusable
Target=按扭
动作无法或者可以使用时。

gaintarget
losttarget
Target='hostile', 'neutral', 'friendly'
获得或者失去当前目标时(只能由无目标"获得")

targetreactionchanged
Target='hostile','neutral','friendly'
目标类型变换的时候

gainaura
loseaura
Target=状态名称(例如:'潜行','战斗状态','熊形态')
状态获得或者失去的时候

gaindebuff
losedebuff
Target=损害法术的名称
玩家获得或者失去一个新的损害法术

gaindebufftype
losedebufftype
Target=损害法术的类型
玩家获得或者失去一个新的损害法术类型。

gainbuff
losebuff
Target = 增益法术的名称
玩家获得一个新的增益法术时

unitdebufftype
Target=('player','target','pet','party1'-'party4')
获取/失去某种类型的损害法术(例如:毒,疾病,混乱等)
用条件来检测是否是你感兴趣的类型。
例如:on='unitdebufftype' target='target' if='unitdebufftype<"target" "poison">

unitdebuff
Target ='pet','target','party1'-'party4'
获取/失去一个损害法术(例如:"破伤风")
用条件来检测是否是你感兴趣的损害法术。
例如:on='unitdebuff' target='target' if='unitdebuff<"target" "十字军审判">

unitbuff
Target ='pet','target','party1'-'party4'
获取/失去一个增益法术(例如:"力量祝福")。
用条件来检测是否是你感兴趣的增益法术。
例如:on='unitbuff' target='target' if='unitbuff<"target" "力量祝福">

gainitembuff
Target = 'MainHand' 或者 'OffHand'
(主手)或者(副手)的物品获取一个增益时。

offhandcharge
Target =副手武器剩余的作用数
副手物品剩余的作用数到达指定数目时

gainpartymate
losepartymate
Target = 'party1' - 'party4'
队伍成员加入或者退出时。

losepet
不需要目标
宠物未召唤状态(不是宠物死亡)

gainpet
不需要目标
唤醒于宠物已经召唤状态,

unitdied
unitressed
Target = 'player','pet','party1'-'party4'
指定单位死亡或者复活时

bindingkeydown
bindingkeyup
Target = 按扭号
绑定按键按下或者放开时

leftbuttonclick
rightbuttonclick
Target = 按扭号
鼠标左键或者右键点击指定按钮时

leftbuttondown
rightbuttondown
Target = 按扭号
鼠标左键或者右键按压指定按钮时

leftbuttonup
rightbuttonup
Target = 按扭号
鼠标左键或者右键放开于指定按钮时

altkeydown
altkeyup
controlkeydown
controlkeyup
shiftkeydown
shiftkeyup
不需要目标
分别是alt 、ctrl 、shift键按下或者弹起的时候。

combopoints
Target =设置值
当玩家组合点数(盗贼)到达设置值时

healthabove##
healthbelow##
manaabove##
manabelow##
Target ='player','target','party1'-'party4','pet'
指定单位的血量或者蓝高于或者低于指定百分数##的时候
注:##只能设置为10, 20,30,40,50,60,70,80,90 ,如果是满的话不是写成healthabove##而是写成healthFULL

playercombat
Target =某种特定的战斗状态
玩家发出某种特定的战斗状态。
例如:玩家受到伤害,玩家躲闪,玩家招架,玩家格挡,玩家重击。

targetcombat
Target =某种特定的战斗状态
目标发出某种特定的战斗状态。
例如:玩家受到伤害,玩家躲闪,玩家招架,玩家格挡,玩家重击。

autoitemout
Target=用完的物品的名字
指定物品用完的时候

autoitemrestored
Target=获得的某样物品的名字
一个物品再次填充于按钮。

actionbarpage
Target = 1-6 (指技能栏编号)
玩家切换到某技能栏时

trackingchanged
Target = 某种追踪状态
玩家追踪状态改变时
追踪状态:herbs, minerals, treasure, beasts, humanoids, hidden, elementals, undead, demons, giants, dragonkin, senseundead, sensedemons , none。 none指不追踪了。

第九部分 flexbar手册--flexbar条件

条件

tingcombat<target>
target ="player","target","party1"-"party4","pet"
引起仇恨或者任何战斗状态。

altdown<>
无目标
Alt建按下

comboptseq<target>
target=0-5
玩家获取与target相同的组合点数

comboptsgt<target>
target=0-5
玩家获取高于target的组合点数

comboptslt<target>
target=0-5
玩家获取低于target的组合点数

controldown<>
无目标
Ctrl键按下

enoughmana<target>
target=按钮(1-120)
该ID对应的动作有足够魔法释放

faded<target>
target=按钮(1-120)
指定按钮被染色

hasaggro<>
无目标
玩家获得仇恨

hasaura<target>
target=状态名称(例如:"潜行","战斗状态")
处于指定状态,用于:盗贼潜行,德鲁依变形形态,战士各种状态,圣骑士的脚环

hasbuff<target>
target=Buff名称(例如:"力量祝福")
玩家具有指定的Buff

hasdebuff<target>
target=Debuff名称(例如:"破伤风")
玩家具有指定的Debuff

hasdebufftype<target>
target=Debuff类型(例如:"毒")
玩家具有指定类型的Debuff

hasitem<target>
target=物品名称(例如:"小型防御药水"
玩家背包中具有指定的物品

healthabove10<target>
Target="player","target","party1"-"party4","pet"
当指定单位的血量高于/低于指定的数字或者全满。
healthabove20<target>
healthabove30<target>
healthabove40<target>
healthabove50<target>
healthabove60<target>
healthabove70<target>
healthabove80<target>
healthabove90<target>
healthbelow10<target>
healthbelow100<target>
healthbelow20<target>
healthbelow30<target>
healthbelow40<target>
healthbelow50<target>
healthbelow60<target>
healthbelow70<target>
healthbelow80<target>
healthbelow90<target>
healthfull<target>

hidden<target>
target=按钮(1-120)或者Frame名称(如"MainMenuBar")
指定的按钮或者Frame是隐藏的。

incombat<>
无目标
打开于玩家处于近战状态。

incooldown<target>
target=按钮(1-120)
按扭处于冷却状态时

ingroup<target>
Target=组号码(1-120)
鼠标指针处于指定组范围

inrange<target>
target=按钮(1-120)
按扭对应的技能处于射程中

isadvanced<target>
Target=Button(1-120)
按钮设置为高级模式

isdisabled<target>
target=按钮(1-120)
按钮设置为禁止

isrunning<target>
Target =计时器名称
名称对应的计时器运行中

mainhandchargeseq<target>
Target=数字
主手武器的附魔数(施毒数?)等于指定数目

mainhandchargesgt<target>
Target=数字
主手武器的附魔数(施毒数?)多于指定数目

mainhandchargeslt<target>
Target=数字
主手武器的附魔数(施毒数?)少于指定数目

mainhandenchant<>
无目标
玩家是否在主手武器上有附魔(物品buff,毒等)

manaabove10<target>
Target="player","target","party1"-"party4","pet")
当指定单位的魔法高于/低于指定的数字或者全满的时候打开。
manaabove20<target>
manaabove30<target>
manaabove40<target>
manaabove50<target>
manaabove60<target>
manaabove70<target>
manaabove80<target>
manaabove90<target>
manabelow10<target>
manabelow100<target>
manabelow20<target>
manabelow30<target>
manabelow40<target>
manabelow50<target>
manabelow60<target>
manabelow70<target>
manabelow80<target>
manabelow90<target>
manafull<target>

offhandchargeseq<target>
Target=数字
副手武器的附魔数(施毒数?)等于指定数目

offhandchargesgt<target>
Target=数字
副手武器的附魔数(施毒数?)多于指定数目

offhandchargeslt<target>
Target=数字
副手武器的附魔数(施毒数?)少于指定数目

offhandenchant<>
无目标
玩家是否在副手武器上有附魔(物品buff,毒等)

remapped<target>
target=按钮(1-120)
指定按钮被映射

scaled<target>
target=按钮(1-120)
指定按钮被缩放

shaded<target>
target=按钮(1-120)
指定按钮被染色

shiftdown<>
无目标
Shift键按下

unitbuff<[unitcode target]>
UnitCode="party1"-"party4","pet","target" Target= Buff名称
指定单位具有指定Buff,例如:unitbuff<["party1" "力量祝福"]>

unitdebuff<[unitcode target]>
UnitCode="party1"-"party4","pet","target" Target= Buff名称
指定单位具有指定DEBuff,例如:unitdebuff<["party1" "破伤风"]>

unitdebufftype<[unitcode target]>
UnitCode="party1"-"party4","pet","target" Target= DEBuff名称
指定单位具有指定类型的Buff,例如:unitdebufftype<["party1" "疾病"]>

unitcreaturetype<[unitcode target]>
UnitCode="party1"-"party4","pet","target", Target = 生物类型
指定单位为指定生物类型,例如:unitdecreaturetype<["target" "人形"]>

unitexists<target>
Target="player","target","party1"-"party4","pet"
指定单位存在

unitisalive<target>
Target="player","target","party1"-"party4","pet"
指定单位生存

unitiscorpse<target>
Target="player","target","party1"-"party4","pet"
指定单位死亡

unitisfriendly<target>
Target="player","target","party1"-"party4","pet"
指定单位友善

unitishostile<target>
Target="player","target","party1"-"party4","pet"
指定单位敌对

unitisneutral<target>
Target="player","target","party1"-"party4","pet"
指定单位中立

usable<target>
target=按钮(1-120)
按扭对应动作可用。
这个命令对一系列的状态进行检测:在正确的战斗状态,并且预备完毕。所以,如果你在战斗状态,并且你的对手正好被躲避,而你的压制技能设置于按扭1,那么条件:usalbe<1>将会返回真,如果你不在战斗状态,将会返回失败。


visible<target>
target=按钮(1-120) 或者 一个框体的名称,比如系统主动作条"MainMenuBar"
按钮或框体是可见的.(显示在屏幕上的)

第十部分 flexbar手册--flexbar变量

可以用在text中的变量:

%allbagsnumslots
%allbagsnumslotsleft
%allbagsnumslotsused
全部背包总的可用、总数、已用 空间

%backpacknumslots
%backpacknumslotsleft
%backpacknumslotsused
系统背包的可用、总数、已用 空间

%bag1numslots
%bag2numslots
%bag3numslots
%bag4numslots
各背包可用空间

%bag1numslotsleft
%bag2numslotsleft
%bag3numslotsleft
%bag4numslotsleft
各背包总空间

%bag1numslotsused
%bag2numslotsused
%bag3numslotsused
%bag4numslotsused
各背包被用掉的空间

%combopts 可用的战斗点
%playerhealth 自己的血量
%playermana 自己的法力值
%pethealth 宠物的血量
%petmana 宠物的法力值
%targethealth 目标的血量
%targetmana 目标的法力值

%party1health
%party1mana
%party2health
%party2mana
%party3health
%party3mana
%party4health
%party4mana
队友的血量和法力值

%fbs 最后一个事情激活的flexbar事件
%fbe 最后一个flexbar事件

Windows 2000/03域和活动目录

本文缩略词语



MS:Microsoft 微软公司
95:Windows 95
98:Windows 98
XP:Windows XP
NT:Windows NT Server
2000:Windows 2000 Server
03: Windows 2003 Server
S:Server
AS:Advanced Server AD:Active Directory 即活动目录
DC:Domain Controller 即域控制器
GC:Global Catalog 全局编录
TS:Terminal Service 终端服务
PDC:Windows NT Server域中的主域控制器
BDC:Windows NT Server域中的备份控制器
SAM库:安全帐号管理器数据库
FQDN:完全有效域名,如:mcse.com
NetBIOS名称:形如mcse


  本文的目的,是作为域和AD的一篇入门文章,使没有安装过域,或刚刚接触域的年轻网管能对域和AD有一个全面的了解,并利用此文入门,将所管理的网络实现一个基于域的管理模式。

一、认识Windows的域
  本小节重点从理论上阐述域的概念、作用和Windows中域的产生。
  一台Windows计算机,它要么隶属于工作组,要么隶属于域。所以说到域,我们就不得不提一下工作组,工作组是MS的概念,一般的普遍称谓是对等网。工作组通常是一个由不多于10台计算机组成的逻辑集合,如果要管理更多的计算机,MS推荐你使用域的模式进行集中管理,这样的管理更有效。你可以使用域、活动目录、组策略等等各种功能,使你网络管理的工作量达到最小。当然这里的10台只是一个参考值,11台甚至20台,如果你不想进行集中的管理,那么你仍然可以使用工作组模式。
  工作组的特点就是实现简单,不需要域控制器DC,每台计算机自己管理自己,适用于距离很近的有限数目的计算机。另外工作组名并没有太多的实际意义,只是在网上邻居的列表中实现一个分组而已;再就是对于“计算机浏览服务”,每一个工作组中,会自动推选出一个主浏览器,负责维护本工作组所有计算机的NetBIOS名称列表。用户可以使用默认的workgroup,也可以任意起个名字,同一工作组或不同工作组在访问时也没有什么分别。
  域(Domain)是一个共用“目录服务数据库”的计算机和用户的集合,实现起来要复杂一些,至少需要一台计算机安装NT/2000/03 Server版本使其充当DC,来实现集中式的管理。
  若考虑到容错的话,至少需要两台。对于NT4域就是一台PDC(具有唯一性),一至多台BDC,对于2000/03域,已经没有PDC和BDC的概念,要容错就需要两至多台DC。
  域是逻辑分组,与网络的物理拓扑无关,可以很小,比如只有一台DC;也可以很大,包括遍布世界各地的计算机,比如大型跨国公司网络上的域(当然实际中他们多采用多域结构,还可以利用AD站点来优化AD复制)。
  这个“目录服务数据库”,在NT4时,保存用户帐号名称和密码等安全安全信息,以及安全规则设置,又被称作安全帐号管理(SAM)数据库,简称SAM库。在非DC上的本地的SAM库与DC上域所用的SAM库类似,只不过对于NT4域的SAM库文件,保存有整个域的用户和计算机,用“域用户管理器”和“服务器管理器”来管理,本地的SAM库文件,保存有本地机的用户,由“用户管理器”来管理。
  从2000开始,MS引入了活动目录AD,DC通过AD来提供目录的服务,例如它负责维护AD数据库、审核用户的账户和密码是否正确、将AD数据库复制到其它的DC等。AD库的核心文件就是winnt\ntds\ntds.dit文件。注意组策略的具体设置值,并不存在这个文件中,而是保存在winnt\sysvol\sysvol这个共享夹下,用于向其它DC复制,传播给域成员,来生效。但需要说明的是:2000/XP/03的非DC域成员计算机上仍使用和NT4一样的SAM库文件来保存本地帐号。
  正是由于所有域成员计算机和域用户都共用这个域的“目录服务数据库”,域管理员就可以基于域的“目录服务数据库”来进行集中管理、共享资源,如用户、组、计算机帐号、权限设置、组策略设置等等。目录服务为管理员提供从网络上任何一个计算机上查看和管理用户和网络资源的能力。目录服务也为用户提供唯一的用户名和密码,用户只需一次登录,即可访问本域或有信任关系的其它域上的所有资源(当然用户得有权限才行),而不需要多次提供用户名和密码登录。
  
二、构建Windows 2000的域
  这个过程简单说就是:选一台2000S/AS计算机,运行AD安装向导,在其上安装活动目录,使其成为DC。然后将其它的计算机加入到这个域。
  说明:至于是用2000S,还是用2000AS,对于一般的用户差别不大。2000S支持最多4个CPU,最大4G内存;2000AS支持最多8个CPU,最大内存8G,还支持群集功能。但这些我们一般用户都用不到,所以对于普通用户来说,选择S或AS都是一样的。
  
1、系统要求
  *一台2000S或2000AS独立或成员服务器,2000DS只有OEM版,随厂商硬件发售,平常我们是见不到的。
  * 其上必须有一个NTFS 5.0分区,用来保存AD的sysvol文件夹。注意:2000的NTFS分区是NTFS 5.0,NT4的是NTFS 4.0,NT4必须安装SP4后,才可访问2000的NTFS分区。
  * 网络上必须有可用的DNS服务器,并且必须支持SRV记录(Service Locaion Resource Record)和动态更新功能。如:MS Win2000S DNS,UNIX的DNS BIND 8.12及以上版本,使用已有的NT4 DNS是不行的。

说明:
  构建NT4域并不需要DNS的支持,但2000域必须有DNS,且满足上述要求。
  SRV记录的作用是指明域和站点(site)的DC、PDC仿真、GC是谁。动态更新也是2000DNS的新特色,管理员不必再象NT4 DNS那样手动为计算机创建或修改相应记录,在域成员计算机重启,或改名、改IP时依赖周期性更新,自动动态实现。
  如果没有DNS服务器的话,也不一定非得预装DNS,可以在安装AD过程中,选择在本机上安装2000 DNS。而且推荐初学者使用这种方法,因为系统会根据你提供的FQDN域名,自动创建好DNS区域(zone),并配置成AD集成区域,仅安全动态更新。如果需要向外连或反向解析,用户只需配置上转发器和反向区域即可,不需要的话,直接就可以用了。
  如果决定在安装AD过程中在本机安装DNS,应在安装前,将本机TCP/IP配置/DNS服务器指向自己,这样在安装AD完成后重启时,SRV记录将被自动注册到DNS服务器的区域当中去的,生成四个以下划线开头的文件夹,_msdcs, _sites, _tcp, and _udp,03DNS在这里的层次结构有所变化,但本质没变。当然如果忘了指,也可以后补上,只不过需要多重启一次。

2、安装步骤、注意事项、常见问题、经验技巧

(1)启动AD安装向导
  方法一:开始/程序/管理工具/配置服务器/ Active Directory /启动AD安装向导。
  方法二:熟练后一般常用,开始/运行:dcpromo。

(2)安装选项:指定服务器角色
  三个界面,实现四种组合:



新域                           新树                  新林
附加DC                       子域                 加入林


即:
* 新域—新树—新林
* 附加DC
* 新域—子域
* 新域—新树—加入林

全新安装:新域—新树—新林,这样来建立第一个域中的第一台DC。

  2000的多域模型采用层次结构,不同于NT4域的平面结构,NT4的多个域之间只是通过信任关系关联起来。接下来以下图为例,对2000的域、树、林进行简要说明:




                ms.com
               /   \
trainning.ms.com    lotus.com


  这整个是一个林,ms.com为林根域,有两个树,一个由ms.com和它的子域trainning.ms.com组成,另一个由lotus.com单独组成,林中有ms.com,trainning.ms.com,lotus.com三个域。相关概念如下:
  林根域:在林中第一个建立的域,如:ms.com
  树:共用连续的命名空间的多层域,如ms.com和trainning.ms.com
  树根域:树最高层的域,名最短。如:ms.com

说明:

  2000可采用多层域结构,但最有效、最简便的管理方法仍是单域,所以大家在实际工作中要记住一个原则“能用单域解决,就不用多域”。

  再者2000AD是针对大中型网络设计的,而我们一般管理的网络也就几百个节点,属于小型网络,一般来讲用一个单域结构就够用了,不要人为将管理环境复杂化。在实验中,我们甚至可以一个林中只有一个树,一个树中只有一个域,一个域里只有一台DC。

  另外前面已经说过了,域是逻辑分组,与网络的物理拓扑无关,不要总试图规划一个子网一个域。当然实际中多个子网一个域,子网中若有95/98/NT老计算机,无法利用DNS直接登录到域,可以安装一台WINS服务器解决问题。将所有计算机,包括WINS服务器本身的TCP/IP配置中的WINS服务器指向此WINS服务器即可。

(3)安装选项:新域的DNS全名
说明:
  在这里应该输入新域的完全有效域名FQDN,形如:mcse.com。系统会打算以mcse作为此域的NetBIOS名称,并在网络中检查是否存在重名,需要等一会儿。不重名则设为mcse,建议用户不要修改此名;重名则设为mcse0,建议用户最好换个名字。这也就是说,网络中如果已有一个域,名字叫做mcse.org,也会出现NetBIOS名称冲突的问题。

(4)安装选项:为新域指定一个NetBIOS名称
说明:
  NetBIOS名称,只是为95/98/NT等老版本用户通过“浏览服务”或WINS来识别这个域用的,如果确信域用户都是2000及以上系统(它们通过DNS定位域),其实NetBIOS名称冲不冲突,都无所谓。

(5)安装选项:指定AD库和日志文件位置
说明:
  如果仅是实验,用默认值即可。若是在真正的服务器上,都会有多块物理硬盘,最好分开存放,以提高性能。另外需要强调的是:AD库和日志文件并不要求非得NTFS 5.0分区,很多2000/03书在此语焉不详。

(6)安装选项:指定sysvol文件夹位置
说明:
  是sysvol这个文件夹要求必须得NTFS 5.0分区。在它当中存储有DC间AD要同步的内容,包括组策略的设置值。

(7)安装并配置DNS:
说明:
     这时网络中若无可用DNS服务器,就会出现提示:找不到DNS服务器,需要考虑在本机上安装一个DNS服务器。可先不必理会,点“确定”,接下来选“是,在本机上安装并配置DNS”。初学者在此不要选“否,我将自己安装并配置DNS”。




(8)几分后,安装完成,需要重启。
说明:
  若硬盘或网络上没有可用的2000S源文件,会提示要2000S光盘。
  最好用新装2000S来安装AD,这样不容易出问题。如果你是用一个台运行了一段时间的2000S/AS,来安装AD,使其成为DC。重启及登录时可能会很慢(有时可能长达20分钟),这是较常见的现象。一般2-3次以后就好了,如果多次重启后还那样,那就要重装系统及AD了。



3、域成员计算机




(1)将计算机加入到域
  首先将客户机TCP/IP配置中所配的DNS服务器,指向DC所用的DNS服务器。然后我的电脑/右键/属性/网络标识/属性/隶属于,选择域:输入域名,确定。提示输入用户口和口令,确定后提示重启。
说明:
  加入域时,如果输入的域名为FQDN格式,形如mcse.com,必须利用DNS中的SRV记录来找到DC,如果客户机的DNS指的不对,就无法加入到域。
  加入域时,如果输入的域名为NetBIOS格式,如mcse,也可以利用浏览服务(广播方式)直接找到DC,但它不是一个完善的服务,有时就会不好使。
  这样虽然也可把计算机加入到域,而且在等较长时间后也可以登录到域上去,但不推荐。因为客户机的DNS指的不对,则它无法利用2000DNS的动态更新动能,也就是说无法在DNS区域中自动生成关于这台计算机的A记录和PTR记录。那么同一域另一子网的2000及以上计算机就无法利用DNS找到它,这本应是可以的。
  再者,管理员无法在客户机上利用域的管理工具来远程管理域,因为这些管理工具必须使用DNS,出错提示:找不到域命名信息(有时客户机的DNS Client服务有问题也会出现上述提示,重启服务即可)。这种情况下,要进行远程管理,就只能利用TS(终端服务)基于IP来连了。
  当然用户也可以手动配置WINS或Lmhosts文件,来查找DC。这主要用于95/98/NT老版本计算机跨子网(路由)查找DC或加入域,因为这些老版本计算机无法利用DNS来查找DC,浏览服务又是广播方式,只能在本网段进行,因为广播信息是无法通过cisco路由器的,RFC1542标准的cisco路由器,可设置成允许DHCP的广播数据通过,仅是一个特例。需要说明的是:95/98可以使用域用户帐号登录到域,但并不能加入到域,在AD中也没有计算机帐号,而NT可以
   计算机加入域成功后,未重启,即已在AD用户和计算机/computer容器下生成计算机帐号了,实验中查看时,需要手动刷新一下。而在DNS中记录必须在计算机重启后(不必登录)或15分钟后才能自动注册或更新到DNS区域。但若我们平常修改一个计算机的名字或IP,要马上更新到DNS区域,倒不一定非得重启,可利用ipconfig /registerdns命令就行。明白以上讨论可用于排错,不一定非得重启登录后才知道结果。
  加入到NT4域时,需要有管理特权才行;从Windows 2000开始,微软作了改进:在Windows 2000/03域中,默认Authenticated Users即可在域中最多创建 10 个计算机帐户。Authenticated Users指被验证的用户组,也就是说任何经过身份验证的普通域用户都可以加最多10台计算机到域。常见问题:在实际中用普通域帐号加计算机到域,有时会不好使,原因是同名计算机帐号(极可能是它自己已经失效的计算机帐号)已存在而无权覆盖,这时就得用域管理员帐号了




(2)在加入域的计算机上,用域用户帐号登录到域。
说明:

  在域中的非DC计算机上,可以选择登录到域或本机,这是因为它同时还拥有本地用户帐号。而在DC上只能选择登录到域了,因为整个域都是DC的,它没有必要再保留本地帐号了。2000是个红叉,03干脆就没有了
  安装AD时,会自动删除本地帐号,即使将来删除AD,也无法将本地帐号复原,而是重新生成的。这一点一定要注意:如果本地有EFS加密的文件,一定要将证书导出或将文件解密后,再在这台计算机上做AD安装实验
  在2000及以上计算机上登录到域的过程是这样的:域成员计算机根据本机DNS配置去找DNS服务器,DNS根据SRV记录告诉它DC是谁,客户机联系DC,验证后登录。

(3)深入讨论:
  如果是在林中跨域登录,是首先查询DNS服务器,问林的GC是谁。
  前面我们在步骤(1)中强调“加入域前,首先将客户机TCP/IP配置中所配的DNS服务器,指向DC所用的DNS服务器。”其实如果域中有多个DNS服务器,也可以指向其它的DNS服务器,当然这些DNS服务器之间得有区域复制关系。这样做的目的恰恰是:大中型网络为了平衡DNS负载。

三、建立其它域控制器
  前面我们讨论了“建立第一个域中的第一台域控制器”,分析得很细。以下相同知识点的内容将不再赘述。

1、安装附加DC
(1)以本机管理员身份登录,在独立或成员服务器上,启动AD安装向导。
说明:
  将成为附加DC的计算机,不必非得先加入域。
  DNS指向已有DC所用DNS服务器,以便找到已有DC。安装结束后,一般应该手动在本机上再装一个DNS服务器,以实现DNS的容错。
(2)选择:现有域的额外域控制器
(3)输入域管理员帐号,如:administrator,password,mcse.com(或mcse)。
  常见找不到域的出错提示:域“mcse.com”不是AD域,或用于域的AD域控制器无法联系上。
  解决:确保DNS指向已有DC所用DNS的服务器。
  其它:Ping一下,检查物理连通性。高级用户是否设过TCP/IP筛选器或RRAS筛选器。
(4)输入域名,如:mcse.com。
(5)指定AD库和日志文件位置
(6)指定sysvol文件夹位置
(7)一般选:“与Windows 2000服务器之前的版本相兼容的权限”
(8)目录服务恢复模式的管理员密码
(9)几分后,安装完成,需要重启。
(10)手动在本机上安装DNS服务器,以实现DNS的容错。
   A、开始/设置/控制面板/添加删除程序/Windows组件/网络服务/域名系统(DNS)。
   B、开始/程序/管理工具/DNS
   C、正向搜索区域/右键/新建区域,建议选择“AD集成区域”,区域名:已有区域的名称,如mcse.com。自动生成起始授权机构(SOA)、名称服务器(NS)、主机(A)三条记录,但此时SRV记录并未被复制过来。需要等待5-15分钟后,利用刷新或重新加载就可以看到复制过来的DNS记录了(对于03马上就可以看到复制过来的全部DNS记录)。



深入讨论:
  03和2000比,功能更强大了。但在域和AD的体系结构上并没有什么大的变化,而且MS的产品十分讲究向前兼容。在一个域中可以既有2000DC,又有03DC;也可以既有2000DNS,又有03DNS,并且DC间的AD复制,DNS间的区域传输,都好像没有版本差异一样。
  在我们这里要说的就是:2000可作为03域的附加DC,03也可以作为2000域的附加DC,但第二种情况需要在2000DC(SP2及更高)上运行03光盘/I386/adprep命令来做准备。
具体第一步:adprep /forestprep进行林准备,第二步adprep /domainprep进行域准备。


2、建立子域

(1)以本机管理员身份登录,在独立或成员服务器上,启动AD安装向导。
说明:
  DNS指向林根域已有DC所用DNS服务器,以便找到已有DC。
  保证域命名主控必须有效,它默认在林根域的第一台DC上,且具有林唯一性。利用管理工具“AD域和信任关系”可转移域命名主控。
(2)选择:新域的域控制器,下一步,在现有的树中创建一个新的子域
(3)输入林管理员帐号,如:administrator,password,mcse.com(或mcse)。
  常见出错提示:域“mcse.com”不是AD域,或用于域的AD域控制器无法联系上。解决方法见前
(4)输入父域名,如:mcse.com;输入子域名,如sub,注意不要输成sub.mcse.com。
(5)指定AD库和日志文件位置
(6)指定sysvol文件夹位置
(7)一般选:“与Windows 2000服务器之前的版本相兼容的权限”
(8)目录服务恢复模式的管理员密码
(9)几分后,安装完成,需要重启。

  如果域命名主控失效将会出现如下出错提示:“由于以下原因,*作失败:AD无法与域命名主机xxx联系。指定的服务器无法运行指定的*作。”
  解决:保证域命名主控联机,如果确信其已无法正常工作,可强制传给林内的任意一个DC,子域的DC也可以。原来的主机将必须被重做系统后,才可连入网络,以保证域命名主控的林唯一性。

深入讨论:
  关于子域(子Domain)所对应的DNS子区域(子zone)是否委派的问题。(以下简称:子区域)
  如果网络规模不是很大,虽然实现了子域,但总部、二级单位的网管可能就是同一个人。这种情况下就不需要委派了。可以把区域、子区域都放在同一个DNS服务器上,由同一名管理员来管理就可以了。默认值即如此,不需要手动设置。
如果网络规模较大,且二级单位需要能够控制自己的DNS子区域,比如自己增加www1,www2……这样的主机记录;在自己的子区域下再建子区域。这种情况下就需要委派子区域了,由二级单位的DNS管理员自己来管理。否则二级单位涉及DNS的每一个小变化,都需要找总部DNS管理员批准。

  子区域委派,*作步骤如下:(最好按如下步骤进行,不容易出问题)
  A、DNS指向林根域(如:mcse.com)已有DC所用DNS服务器
  B、利用AD安装向导,安装子域(如:sub.mcse.com),重启机。
  C、在林根DNS控制台上查看,确保已在mcse.com生成子文件夹sub,且sub下有4个以下划线开头的,保存有SRV记录的子文件夹(_msdcs、_sites、_tcp、_udp)已生成;sub下还应有如下2条A记录:(第二条记录如果未生成,手动补上也可以。)

(与父文件夹相同)主机 IP
      SUBdc 主机 IP

  D、在父域(如:mcse.com)右键/新建委派/下一步/子区域名:sub。(不必担心重名,因为委派完成后,灰颜色的委派的sub夹将取代黄颜色的sub夹,但注意*作过程中会共存一段时间)接下来,指定负责子区域的名称服务器:SUBdc.sub.mcse.com及它的IP,以生成粘合记录,下一步,完成。
  E、在子域DC上安装DNS,*作:开始/设置/控制面板/添加删除程序/Windows组件/网络服务/域名系统(DNS)。
   F、开始/程序/管理工具/DNS
   G、正向搜索区域/右键/新建区域,建议选择“AD集成区域”,区域名:sub.mcse.com。自动生成SOA、NS、A、A四条记录(后两条A记录,如C步中述),此时SRV记录也被复制过来了。
  H、在DNS服务器的计算机名上/右键/属性/转发器:指向上一级或林根DNS的IP。
  I、将子域DC的DNS指向自己,以后加入子域的计算机也使用子域的DNS,以实现DNS分担负荷。(当然,子域中的计算机可以使用林中任一台DNS,也都好使)

注意:
  由上述过程,大家可以了解到,做为被委派的DNS子区域的二级单位DNS管理员,是不能随意更改自己的DNS服务器的。比如修改DNS服务器的IP,需要通知上级管理员,及时更新委派子区域的NS记录,否则林中其它用户就会找不到你这个子域的计算机。

3、新域—新树—加入林
  此种情况平常较少用到,因为一般企业只用一套命名体系,很少采用两个或两个以上的树。微软举的例子:一个大企业兼并另一企业,并且想保留它的命名体系,技术上对应实现就是目录树和DNS名称空间。
   说明:此种应该预先建好DNS正向搜索区,因为它不能像建子域那样,利用AD向导自动在已有DNS区域中创建子区域。下面以前文中的mcse.com,sub.mcse.com,my.com图示为例进行说明。

(1)在林根DNS上,与mcse.com并列,创建区域my.com,最好选AD集成区域。
(2)以本机管理员身份登录,在独立或成员服务器上,启动AD安装向导。
说明:
DNS指向林根域已有DC所用DNS服务器,并保证域命名主控必须有效。
(3)选择:新域—新树—加入林
(4)输入林管理员帐号,如:administrator,password,mcse.com(或mcse)。
说明:
输入的欲登录的林根域名,也就告诉了系统要加入哪个林。
(5)输入新域的DNS全名,如:my.com;域NetBIOS名:MY。
(6)指定AD库和日志文件位置
(7)指定sysvol文件夹位置
(8)一般选:“与Windows 2000服务器之前的版本相兼容的权限”
(9)目录服务恢复模式的管理员密码
(10)几分后,安装完成,需要重启。

说明:
  用预建DNS这种方式加入林,使用的是林根上已有DNS服务器,所以此计算机在林根DNS的my.com区域下,仅生成一条主机(A)记录(如需要可手动添加:treedc 主机 IP),SOA和NS记录都是林根DNS服务器,但在my.com区域会有相应的SRV记录来标识它是这个树根域的DC。这种并没有实现DNS的分担负荷,如想实现,利用辅助区域来做。

  实验中发现:万不可像全新安装那样,在安装过程中,选择在本地安装一个DNS,这样将会这把个树根域安装成一个独立的林根域。原因吗?去问微软吧。


四、卸载AD
   在实际工作中有时我们需要改变服务器角色,或者将实验中安装的DC回复到普通成员/独立服务器身份,这就要进行AD的卸载。
1、卸载时会提示给新的本地管理员设置密码
2、附加DC卸载后,仍在域中。
3、如果AD不能卸载,应从以下几方面考虑:
(1)权限
  权限要求与安装AD类似,若一个林中只有一个域,那么你要卸载的就是林根域,需要林管理员权限;卸载附加DC需要该域的域管理员权限;卸载子域或树,涉及到林结构的改变,也需要林管理员权限。
(2)DNS
   一般应保证与安装时所用DNS一致。如果做了DNS规划,必须保证1中权限所要求的管理员身份能找到相应DC验证。
(3)域命名主控
   卸载时只要涉及到林结构的改变,就需要保证域命名主控有效;卸载附加DC时不要求域命名主控有效。

但要注意的是:卸载时的出错信息与安装时的“AD无法与域命名主机xxx联系”提示不同,具体是:由于以下原因,*作失败。以提供的凭据绑定到服务器xxx失败。“RPC服务器不可用”。
(4)卸载的顺序
  与安装顺序相反,应该先逐级卸载下面的子域,最后卸载树根域、林根域。否则将导致子域无法卸载,而存在的子域还有问题。
  因为极有可能此时架构和域命名主控及GC未转移,林管理员组和架构管理员组(Schema Admins)已经随林根域的删除而没有了。为什么这么说呢?因为如果管理员考虑到主控及GC等的转移问题,也就不会误删林根域了。


五、从NT4域升级到2000域

1、预备知识:
  NT4域采用单主控复制,DC分为PDC和BDC,BDC存储的只是PDC“目录服务数据库”文件的只读复本。在“服务器管理器”中可以将一台BDC提升为PDC,原PDC自动降为BDC。
  一个域中只能有一台PDC,零到多台BDC以提供容错和分担负荷。但大家不要理解为一个网络中只能有一台PDC,域是逻辑分组,我们可以在一个子网中建多个域。
  2000域开始采用多主控复制,DC不再有PDC和BDC之分,DC间的AD复制是双向的。但2000域中会唯一有一台DC担当PDC仿真主控,负责充当NT4 BDC的PDC,并为早期版本客户机提供服务。PDC仿真主控还负责管理运行NT、95/98计算机的密码变化,写入AD。接受密码变化的DC必须通知PDC仿真主控,比如:用户登录时,如密码错误,必先送至PDC仿真主控。因为普通DC不能确认到底是密码错误,还是它没有及时与PDC仿真主控同步。它还负责同步整个域中计算机的时间。通过以上我们可以知道:在2000域中存在的NT4域控制器,它的身份只能是BDC。
   2000域模式分为:混合(mixed)模式和本机(natived)模式。默认为混合模式,如果管理员确认域中所有DC(注意:这里强调的是DC,2000域本机模式下可以有NT4的成员服务器)都是2000DC,没有NT4的域控制器,可以手动在“AD用户和计算机中”将域模式更改为本机模式,以充分利用AD的新功能,比如使用“通用组”。
  通过以上分析,我们可以知道:如果在2000域中存在NT4域控制器,那么你只能使用2000域混合模式了。有人可能会想那我就不让它再当域控制器了,但是NT4域的DC和成员服务器之间角色转换必须重装NT4系统,不能象2000那样利用AD安装向导,方便地进行安装/卸载。

2、原则:
    由NT4域向2000域升级,第一个被升级的必须是NT4域的PDC。这样才可以把帐号、安全设置、配置等带到2000域

3、MS推荐策略:
    由于升级是一个极易出现各种问题的过程,必须考虑备份。再有就是实际*作时,可以先将NT4的BDC提升为PDC,再升级到2000。如果顺利的话,再升级其它BDC。如果不顺利的话,可将原来PDC复原,以此方法来避免损失。

4、深入讨论:
     我们可以把前面的问题再深入讨论一下,假设你的域中有NT4的PDC,并且在它上面运行的老程序不允许你把它升级为2000,但你还想要通过升级NT4域,得到2000域,那么应该怎么办呢?答案很简单,可以先将这台PDC降为BDC,再将新PDC升级为2000。这样你既得到了2000域,又保留了NT4的BDC。

5、我的推荐原则:
     在实际工作中,只要能进行2000域的全新安装,就用全新安装。因为NT4升级后得到的2000安全策略设置等等是继承NT4时的设置,与2000域的默认值有较大出入,以后出问题,不易排错,也不易与其它人交流沟通、解决问题。

把女友升级为老婆的时候发生的BUG

亲爱的技术支持: 我急需您的帮助。我最近将"女朋友7.0"升级到"妻子1.0",发现这个新程序意外地启动了孩子生产程序,而且占用了大量的空间和珍贵的资源。这在产品的使用手册中没有提到。此外"妻子1.0"自动将自己安装到其他的所有的程序中,它随系统同时启动,监控整个系统的状态。男人夜出2.5"和"高尔夫5.3"无法再运行,一旦运行该程序系统即行崩溃。试图运行"周日足球6.3"经常失败,而"周六购物 7.1"却代之运行。看来我无法保留"妻子1.0",因为它和我喜欢运行的任何程序都不相容。我打算回到"女朋友7.0",可是这个程序又无法卸载。 请您帮帮我吧! 乔 给乔的回信: 亲爱的乔: 这是个很普通的问题,产生于你对基本原理的不了解。 很多的男人健"女朋友7.0"升级到"妻子1.0",以为"妻子1.0"是一个"实用与娱乐程序"。然而"妻子1.0"却是个操作系统,是被设计用来运行所有程序的。你不可能清除"妻子1.0",也不可能回到"女朋友7.0",因为"妻子1.0"的设计中不具有这个功能,无论是卸载、删除或是清除已经安装在系统中的这些程序文件,都是不可能的。 有些人曾试图安装"女朋友8.0"或者"妻子2.0",结果是产生了更多的问题(参见手册中的赡养费/孩子的养育/律师费用)。我安装过"妻子1.0",我建议你保持现在的安装状态,妥善解决遇到的困难。 当任何错误或问题出现的时候,不论你认为是什么原因引起的,你必须运行"C:\我道歉"程序,并且避免使用"退出键"。必要时可能需要运行"C:\我道歉"多次,希望最终能使操作系统恢复到初始状态。 "妻子1.0"虽然是一个需要高保养的程序,但同时对人可能是非常有益的。充分地利用它,需要买些额外的软件比如"鲜花2.0"和"巧克力5.0"。 不要在任何情况下安装"秘书(短裙版)",因为"妻子1.0"不支持这种程序,而且系统多数时候肯定会崩溃。 祝你好运

2006/8/22

划分子网的方法

  子网的划分,实际上就是设计于网掩码的过程。子网掩码主要是用来区分IP地址中的网络ID和主机ID,它用来屏蔽IP地址的一部分,从IP地址中分离出网络ID和主机ID.子网掩码是由4个十进制数组成的数值"中间用"。"分隔,如255.255.255.0。若将它写成二进制的形式为:11111111.11111111.11111111.00000000,其中为"1"的位分离出网络ID,为"0"的位分离出主机ID,也就是通过将IP地址与子网掩码进行"与"逻辑操作,得出网络号。
  例如,假设IP地址为192.160.4.1,子网掩码为255.255.255.0,则网络ID为192.160.4.0,主机ID为0.0.0.1。计算机网络ID的不同,则说明他们不在同一个物理子网内,需通过路由器转发才能进行数据交换。
  每类地址具有默认的子网掩码:对于A类为255.0.0.0,对于B类为255.255.0.0,对于C类为255.255.255.0。除了使用上述的表示方法之外,还有使用于网掩码中"1"的位数来表示的,在默认情况下,A类地址为8位,B类地址为16位,C类地址为24位。例如,A类的某个地址为 12.10.10.3/8,这里的最后一个"8"说明该地址的子网掩码为8位,而199.42.26.0/28表示网络199.42.26。0的子网掩码位数有28位。
  如果希望在一个网络中建立子网,就要在这个默认的于网掩码中加入一些位,它减少了用于主机地址的位数。加入到掩码中的位数决定了可以配置的于网。因而,在一个划分了子网的网络中,每个地址包含一个网络地址、一个子网位数和一个主机地址,如图1所示。
  在图1中,子网位来自主机地址的最高相邻位,并从一个8位的位组边界开始,因为默认的子网掩码总是在8位位组的边界处结束。随着主机位中加入于网位的增加,我们可以从左到右计数,并用和它们位置相关的值。将它们转换为十进制。
  图1:
   
  
  从每个主机位加入的子网位中,得到子网的对应十进制数,总结在表1中
  表1:
   
  
  下面举例说明,使用没有子网的子网掩码和使用于网的子网掩码的区别。若有二个B类IP地址172.16.2.160,其默认的子网掩码是255.255.0.0,则完成下面任务
  若不使用子网,即只使用默认的子网掩码,其运算过程如图2所示。
  若使用8位子网位,则其运算过程如图3所示。
  注意:在图3中,使用了8位子网位,其子网掩码值从默认的255.255.0.0转变为255.255.255.0,从而使逻辑"与"之后的网络号发生了变化。 
  图2:
   
  
  图3:
  

在域环境中配置ISA Server 2004

很多朋友提出了在域环境中不能正确配置ISA Server 2004的问题,主要集中在无法引用域用户和DNS无法解析。在这篇文章中,我以一个域环境实例,来给大家介绍如何在域环境中配置ISA Server 2004。从这篇文章,你可以学习到如何在域环境中配置ISA防火墙、启用域用户的身份验证、配置内部客户、配置域控上的DNS转发和建立访问规则。

这个试验的网络拓朴结构如下图所示:

这是一个由三台计算机组成的域环境,也许看起来很简单,但是却已经足以模拟域环境中配置ISA Server中的大部分操作。其中:

  • Denver(DC/Dns server)
    FQDN:denver.contoso.com;
    IP :10.2.1.2/24;
    DG:10.2.1.1;
    DNS:10.2.1.2;

备注:这是一台域控,默认网关是ISA Server的内部接口,DNS设置为本机。

  • Florence (ISA Server 2004)
    FQDN:Florence(目前还处于工作组环境,没有加入域,我会在后面的操作中将其加入域);
    (1)Internal
    Interface:
    IP:10.2.1.1/24
    DG:none
    DNS:10.2.1.2
    (2)External Interface:
    IP:61.139.1.1/24
    DG:61.139.1.1
    DNS:none

备注:ISA Server上的IP设置比较讲究,首先DNS只能设置为内部AD的DNS服务器,然后默认网关为外部出口。

  • Sydney(Dns/Web server)
    FQDN:www.isacn.org
    IP:61.139.1.2/24
    DG:61.139.1.1
    DNS:61.139.1.2

备注:这台计算机用来模拟外部的DNS和Web服务器。后面我们会在内部的DC上设置DNS的转发,将非域的DNS解析请求转发到此DNS服务器上,然后通过域名www.isacn.org来访问这台Web服务器上的一个Web站点。

在这篇文章中,我们会通过以下步骤来为内部域中配置ISA Server 2004防火墙:

  • 在独立服务器上安装ISA防火墙;
  • 将ISA防火墙计算机加入域;
  • 在ISA防火墙上对域管理员进行ISA完全控制的授权;
  • 建立通过验证的域管理员访问外部所有协议的访问规则;
  • 测试该访问规则,通过IP地址来访问外部的Web服务器;
  • 在内部AD的DNS服务器上设置DNS转发;
  • 建立访问规则,允许内部网络的所有用户访问外部的DNS服务;
  • 测试内部DNS解析请求的转发,并通过域名来访问外部的Web站点;
  • 配置ISA防火墙,允许其访问外部站点

1、在独立服务器上安装ISA防火墙

关于ISA Server 2004的安装已经有多篇文章介绍了,在此就不重复。根据本次试验的网络拓朴结构,在内部网络选择时,通过添加适配器来勾选内部网络接口就可以了。安装好后,内部网络如下图所示:

此时,在防火墙策略中只有默认规则:

虽然只有默认规则,但是ISA防火墙的系统策略中是允许ISA防火墙访问域服务,所以我们依然可以访问内部的域。

 

2、将ISA防火墙计算机加入域

现在我们需要将Florence加入到内部域中。使用管理员账号登录Florence,右击我的电脑,打开系统属性,然后在计算机名页,点击更改;在弹出的计算机名称更改页,点击隶属于列表下面的,然后输入内部域的名字Contoso.com,然后点击确定

此时,系统会让你输入有加入该域权限的账户,输入域管理员账号和密码,点击确定

系统验证无误后,会弹出欢迎加入contoso.com域的对话框,点击确定

系统会提示你需要重启计算机,点击确定,然后重启ISA防火墙计算机;


3、在ISA防火墙上对域管理员进行ISA完全控制的授权

由于我是先安装ISA Server 2004,然后再加入域,此时,域管理员没有对ISA Server的管理权限。如果是计算机先加入域然后再安装ISA Server,那么域管理员也会有完全的管理权限,这一步就可以省略了。

现在,我们需要对域管理员进行ISA Server的完全管理授权:

首先使用本地管理账户登录ISA计算机,

打开ISA管理控制台,点击常规,再点击右边面板的管理委派

此时弹出ISA服务器管理委派向导,点击下一步

委派控制页,点击添加

管理委派对话框,点击浏览

选择用户和组对话框,输入contoso\domain admins,点击确定

由于此时是登录到本机,没有contoso域的浏览权限,所以系统会提示你输入对contoso.com有权限的账号,在此输入域管理员账号,点击确定

然后在管理委派页点击确定

委派控制页,点击下一步

完成管理委派向导页,点击完成;


4、建立通过验证的域管理员访问外部所有协议的访问规则

现在我们可以使用域管理员账号来登录了,

然后打开ISA管理控制台,右击防火墙策略,然后点击新建,选择访问规则

在新建访问规则向导页,输入规则的名字,在此我们命名为Allow Domain Admins access External,点击下一步

规则操作页,选择允许;点击下一步

协议页,选择所有出站通讯,点击下一步

访问规则源页,选择内部,点击下一步

访问规则目标页,选择外部,点击下一步

用户集页,删除默认的所有用户,点击添加

添加用户对话框,点击新建

欢迎使用新建用户集向导页,输入用户集名称,在此我们命名为Domain Admins,点击下一步

用户页,点击添加,选择Windows用户和组

选择用户或组页,输入contoso\domain admins,点击下一步

因此我是使用域管理员账户登录,所以系统可以很顺利的读取域中账号。在用户页,点击下一步

然后在正在完成新建用户集向导页,点击完成

然后在添加用户对话框,双击新建的Domain Admins,点击关闭

然后在用户集页点击下一步

最后在正在完成新建访问规则向导页,点击完成

在防火墙策略面板,点击应用以保存修改和更新防火墙策略;

 

5、测试该访问规则,通过IP地址来访问外部的Web服务器

现在我们来测试这条规则。首先先转到Sydney上看看,这是一台Dns和Web服务器,其中建有两个Web站点,一个是默认站点,一个是必须通过www.isacn.org域名才能访问的Web站点,

由于我们在访问规则中使用了身份验证,所以需要设置内部客户为Web代理客户或者防火墙客户。首先,我们使用域管理员账号登录域控Denver,然后设置它为Web代理客户,通过ISA防火墙的默认Web代理来浏览。

此时Denver通过IP地址访问外部的Sydney是可以的,

同时,你可以在ISA的管理控制台中发现Denver提交的身份验证信息,

但是你会发现,你不能解析外部的DNS名字,同时也不能ping外部,这是为什么呢?

我们使用的DNS服务器是内部的DNS,没有设置对于外部的DNS解析请求应该如何处理,在没有设置转发的时候会被DNS服务器丢弃,自然不能解析出外部的DNS名字。同时由于我们启用了身份验证,只有使用Web代理客户或者防火墙客户才能提交身份验证信息。Web代理客户只支持从Web浏览提交身份验证信息,不支持其他的程序,所以在Web代理客户环境下,其他访问是不被ISA防火墙允许的(没有提交身份验证信息);而防火墙客户不支持ICMP信息的转换,所以,无论在Web代理客户环境和防火墙客户环境,都是不支持ICMP的。

6、在内部AD的DNS服务器上设置DNS转发

现在我们在内部的域控上设置外部DNS名字解析请求的转发。使用管理员账号登录域控Denver,在管理工具中打开DNS控制台,右击服务器名,选择属性

在转发器页,选中上面的"所有其他DNS域",然后在下面的转发器列表中输入外部的DNS服务器地址,在此我输入外部的DNS服务器Sydney的IP 61.139.1.2,然后点击添加;再点击确定

注意:如果你的DNS服务器属性中转发器被禁用,这是因为你DNS服务器被作为根DNS服务器所至。在正向区域中删除"."后重启DNS服务即可。

 

 

7、建立访问规则,允许内部网络的所有用户访问外部的DNS服务

其实这一步也不是必须的。只要在内部客户上安装防火墙客户端,那么由于前面我们有条允许内部的域管理员访问外部的所有服务的规则,就可以达到这一目的,但是在域控上是不推荐使用防火墙客户的。所以,在此,我另外新建一条规则来允许内部网络的所有用户访问外部的DNS服务。

在Florence上打开ISA管理控制台,建立访问规则的步骤和第4步基本一致,对应的规则元素为:

  • 规则名:Allow DNS from Internal to External;
  • 规则操作:允许;
  • 协议:所选的协议 DNS;
  • 访问规则源:内部;
  • 访问规则目标:外部;
  • 用户集:所有用户;

最后点击应用来保存修改和更新防火墙策略;

8、测试内部DNS解析请求的转发,并通过域名来访问外部的Web站点

此时,我们再在域控Denver上进行DNS解析请求的测试,

转发的DNS解析已经正常了。

现在我们通过域名来访问外部的Web站点,

你可以很清楚的看到不同访问方式下页面的不同。

 

9、配置ISA防火墙,允许其访问外部站点

现在我们在ISA防火墙上进行测试,首先是解析域名,看是否正常,

ISA防火墙很容易的通过内部域控的DNS服务解析出了外部的域名;

同样的,我们设置其为Web代理客户,让它来访问外部网络的Web站点试试,

但是,被拒绝了....Why?

很简单,你没有在防火墙策略中允许它访问外部的Web站点。可能有朋友问,我不是可以解析DNS吗?这个功能是由ISA的系统策略来允许的,主要是方便管理和访问一些基础服务,但是HTTP不是基础服务,需要你另外建立访问规则来允许。

所以,我们现在需要建立一条允许本地主机访问外部的访问规则:

打开ISA管理控制台,建立规则的步骤和第4步基本一致,对应的规则元素为:

  • 规则名:Allow Localhost to External;
  • 规则操作:允许;
  • 协议:所选的协议 HTTP;
  • 访问规则源:本地主机;
  • 访问规则目标:外部;
  • 用户集:Domain Admins;

最后点击应用来保存修改和更新防火墙策略;

现在我们只需要简单的刷新一下...访问就已经OK了;

建立内部的DNS服务器

DNS服务是一个很重要的基础服务,很多应用是基于DNS服务的,例如最常用的HTTP浏览。很多朋友在论坛里面说不能上网,其实只是不能解析FQDN名字,就是访问DNS服务有问题,如果只是使用IP访问,如QQ就是使用IP进行访问,还是可以的。所以在不能浏览Web页面的时候,你得先区分,是连接有问题还是DNS有问题,通过这篇文章中,你可以学习到如何建立内部的DNS服务器。


很多使用NAT软件的情况,往往是网关的外部网卡上获得了ISP的DNS服务器地址,并且可以进行解析,但是内部的客户想要解析DNS名字的话,方法只有两种:1、在内部客户机上设置DNS地址为外部ISP的dns服务器;2、在内部建立一个DNS服务器,内部客户使用这个内部的DNS服务器,然后内部的DNS服务器转发到外部ISP的DNS服务器上。从客户机的效率上来说,第一种方式要好;但是从可控性和扩展性,还有网络的效率来说,第二种方式要好,特别是对于采用了域的环境,必须采用第二种方式进行DNS的转发。

KWF自带有个DNS转发器,而且效率比Windows的DNS服务器要高,只是功能太过于单一,只能进行DNS的转发。ISA不带有DNS转发器,不过,利用Windows服务器版本中的全功能DNS服务器,可以很完美的实现内部的DNS服务器。


需要注意的是,Web代理客户浏览Web是不需要配置DNS服务器的。因为Web代理客户在浏览Web 时是通过ISA 的Web 代理服务中转,不会直接访问DNS 服务的,只要ISA 服务器可以解析DNS 名字就行了。但是Web 代理客户其他的访问(非Web 浏览的访问)如果是需要DNS解析的,不配置DNS服务器时就会导致失败。


而防火墙客户虽然默认也会配置为Web代理客户,但是防火墙客户端(FWC)会直接把所有非本地的TCP/UDP 数据发往ISA Server,所以,不管你是否在本地配置了默认网关和DNS 服务器,FWC 总是会把数据发送给它所连接的ISA Server,所以,只要ISAServer 能够正确的解析DNS,那么防火墙客户就可以正常的解析DNS。


下面,我以实例给大家来讲解,由于结构很简单,我没有就网络结构画图,客户机IP为192.168.0.41,网关(ISA Server 2004英文版)的IP为192.168.0.1。此次试验的步骤如下:


1、客户机上没有设置DNS服务器,但是通过设置为Web代理客户,可以上网;

2、在ISA Server上建立一个内部的DNS服务器并进行配置;

3、客户机设置DNS服务器地址为新建的内部DNS服务器,此时,可以正常上网;

现在进入试验:

 


1、客户不能解析DNS,但是通过Web代理,可以浏览网页


如图,客户机上没有设置DNS服务器,



此时,使用ipconfig/all,没有显示出DNS服务器,ping www.isaservercn.org显示无法解析;



Web浏览自然是不行的了




但是可以ping通我的DNS服务器,这表明,网络连接是通的,只是DNS不能解析;




但是通过我在连接里面设置代理服务器,如下图,又可以正常访问了;



 

 

2、建立内部的DNS服务器

在ISA Server上打开控制面板下的添加/删除程序,点击添加/删除Windows组件,在Windows组件向导中双击网络服务,勾选域名系统(DNS),点击确定,再点击"下一步",安装过程中可能需要你插入Windows的安装光盘。




安装好后,在管理工具中可以看见"DNS"管理控制台,点击后弹出界面如下,右击服务器,选择属性;



DNS服务器的设置很简单,主要的几个地方:


(1)接口:由于只是给内部使用,可以只绑定在内部接口上;




(2)转发器:这个地方的设置比较重要,先选择上面的"所有其他DNS域",然后在下面的转发器IP地址列表中,添加你从ISP获得的DNS服务器的IP。




内部的DNS服务器就设置完了,当然,你自己也可以建立名字解析和DNS名字域来使用。另外还需要说明的一点,DNS可以独立使用的,不是一定要和活动目录结合的。

 


3、配置内部客户使用内部的DNS服务器


如下图,对客户进行配置,设置DNS服务器地址为新建的内部DNS服务器地址;



此时,通过ping
www.isaservercn.org,已经可以解析出名字了。



进行浏览,成功。



至此,内部DNS服务器的应用就已经成功完成了。

部署Windows2003 DNS服务

"贵有恒,何必三更起五更勤;最无益,只怕一日曝十日寒。"前一段时间巴哥因为一些生活琐事而中止了对Server 2003经典服务的学习,现在终于将所有的事情都安排妥当,学习当然要继续……
  
  在前面几次学习中,老伟向巴哥介绍了部署文件服务、部署DHCP服务和部署WWW服务的基本方法,并且对每一种服务都做了进一步的技术延伸。这种安排让巴哥受益匪浅,既掌握了基础知识,又能有所提高。成功部署WWW服务后,局域网内部用户可以使用IP地址访问内部网站了。然而如果能够让内部用户像访问Internet上的网站一样使用友好的名称(如"www.yesky.com")访问内部网站,那么肯定会更有意义。巴哥跟老伟谈起了自己的打算,老伟轻松地说:"这有何难,部署一台DNS服务器就可以实现你的想法了。"
  
  可是巴哥并不了解DNS是什么,于是老伟对DNS做了简短的解释。DNS(Domain Name System,域名系统)是一种组织成层次结构的分布式数据库,里面包含有从DNS域名到各种数据类型(如IP地址)的映射。这通常需要建立一种A(Address)记录,意为"主机记录"或"主机地址记录",是所有DNS记录中最常见的一种。通过DNS,用户可以使用友好的名称查找计算机和服务在网络上的位置。DNS名称分为多个部分,各部分之间用点分隔。最左边的是主机名,其余部分是该主机所属的DNS域。因此一个DNS名称应该表示为"主机名+DNS域"的形式。
  
  小提示:要想成功部署DNS服务,运行Windows Serve 2003的计算机中必须拥有一个静态IP地址,只有这样才能让DNS客户端定位DNS服务器。另外如果希望该DNS服务器能够解析Internet上的域名,还需保证该DNS服务器能正常连接至Internet。
  
  一.安装DNS服务器
  
  默认情况下Windows Server 2003系统中没有安装DNS服务器,老伟所做的第一件工作就是安装DNS服务器。
  
  第1步,依次单击"开始/管理工具/配置您的服务器向导",在打开的向导页中依次单击"下一步"按钮。配置向导自动检测所有网络连接的设置情况,若没有发现问题则进入"服务器角色"向导页。
  
  小提示:如果是第一次使用配置向导,则还会出现一个"配置选项"向导页,点选"自定义配置"单选框即可。
  
  第2步,在"服务器角色"列表中单击"DNS服务器"选项,并单击"下一步"按钮。打开"选择总结"向导页,如果列表中出现"安装DNS服务器"和"运行配置 DNS 服务器向导来配置DNS",则直接单击"下一步"按钮。否则单击"上一步"按钮重新配置(如图1)。
  

 
  图1 选择"DNS服务器"角色
  


  第3步,向导开始安装DNS服务器,并且可能会提示插入Windows Server 2003的安装光盘或指定安装源文件(如图2)。
  

 
  图2 指定系统安装盘或安装源文件


  
  小提示:如果该服务器当前配置为自动获取IP地址,则"Windows 组件向导"的"正在配置组件"页面就会出现,提示用户使用静态IP地址配置DNS服务器。
二.创建区域
  
  DNS服务器安装完成以后会自动打开"配置DNS服务器向导"对话框。用户可以在该向导的指引下创建区域。
  
  第1步,在"配置DNS服务器向导"的欢迎页面中单击"下一步"按钮,打开"选择配置操作"向导页。在默认情况下适合小型网络使用的"创建正向查找区域"单选框处于选中状态。而巴哥所管理的网络就不太大,因此保持默认选项并单击"下一步"按钮(如图3)。
  

 
  图3 选择配置操作


  
  第2步,打开"主服务器位置"向导页,如果所部署的DNS服务器是网络中的第一台DNS服务器,则应该保持"这台服务器维护该区域"单选框的选中状态,将该DNS服务器作为主DNS服务器使用,并单击"下一步"按钮(如图4)。
  

 
  图4 确定主服务器的位置


  
  第3步,打开"区域名称"向导页,在"区域名称"编辑框中键入一个能反映公司信息的区域名称(如"yesky.com"),单击"下一步"按钮(如图5)。
  

 
  图5 填写区域名称


  
  第4步,在打开的"区域文件"向导页中已经根据区域名称默认填入了一个文件名。该文件是一个ASCII文本文件,里面保存着该区域的信息,默认情况下保存在"windowssystem32dns"文件夹中。保持默认值不变,单击"下一步"按钮(如图6)。
  

 
  图6 创建区域文件


  
  第5步,在打开的"动态更新"向导页中指定该DNS区域能够接受的注册信息更新类型。允许动态更新可以让系统自动地在DNS中注册有关信息,在实际应用中比较有用,因此点选"允许非安全和安全动态更新"单选框,单击"下一步"按钮(如图7)。
  

 
  图7 选择允许动态更新


  
  第6步,打开"转发器"向导页,保持"是,应当将查询转送到有下列IP地址的DNS服务器上"单选框的选中状态。在IP地址编辑框中键入ISP(或上级DNS服务器)提供的DNS服务器IP地址,单击"下一步"按钮(如图8)。
  

 
  图8 配置DNS转发


  
  小提示:通过配置"转发器"可以使内部用户在访问Internet上的站点时使用当地的ISP提供的DNS服务器进行域名解析。
  
  第7步,依次单击"完成/完成"按钮结束"yesky.com"区域的创建过程和DNS服务器的安装配置过程。
三.创建域名
  
  老伟利用向导成功创建了"yesky.com"区域,可是内部用户还不能使用这个名称来访问内部站点,因为它还不是一个合格的域名。接着还需要在其基础上创建指向不同主机的域名才能提供域名解析服务。老伟准备创建一个用以访问Web站点的域名"www.yesky.com",具体操作步骤如下:
  
  第1步,依次单击"开始"→"管理工具"→"DNS"菜单命令,打开"dnsmagt"控制台窗口。
  
  第2步,在左窗格中依次展开"ServerName"→"正向查找区域"目录。然后用鼠标右键单击"yesky.com"区域,执行快捷菜单中的"新建主机"命令(如图9)。
  

 
  图9 执行"新建主机"命令


  
  第3步,打开"新建主机"对话框,在"名称"编辑框中键入一个能代表该主机所提供服务的名称(本例键入"www")。在"IP地址"编辑框中键入该主机的IP地址(如"192.168.0.198"),单击"添加主机"按钮。很快就会提示已经成功创建了主机记录(如图10)。
  

 
  图10 创建主机记录


  
  最后单击"完成"按钮结束创建。
四.设置DNS客户端
  
  尽管DNS服务器已经创建成供,并且创建了合适的域名,可是如果在客户机的浏览器中却无法使用"www.yesky.com"这样的域名访问网站。这是因为虽然已经有了DNS服务器,但客户机并不知道DNS服务器在哪里,因此不能识别用户输入的域名。用户必须手动设置DNS服务器的IP地址才行。在客户机"Internet协议(TCP/IP)属性"对话框中的"首选DMS服务器"编辑框中设置刚刚部署的DNS服务器的IP地址(本例为"192.168.0.1",如图11)。
  


  图11 设置客户端DNS服务器地址


  
  然后再次使用域名访问网站,你会发现已经可以正常访问了。

在部署DNS服务(安装篇)中,老伟向巴哥介绍了部署DNS服务的基本方法,现在局域网用户已经可以使用域名访问局域网中的内部站点了。要想使DNS服务器更好地发挥作用,还需要对其进行更细致的配置和管理。本篇内容将对DNS服务的一些常用配置作一下介绍。

  一.添加正向搜索区域

  什么正向搜索区域呢?所谓正向搜索区域是指将域名解析为IP地址的过程。也就是说,当用户输入一个服务器域名时,借助于该记录可以将域名解析为IP地址,从而实现对服务器的访问。虽然在DNS服务的安装过程中已经创建了一个正向搜索区域,但是如果网络中存在两个或两个以上的域,就必须执行添加正向搜索区域操作。

  添加正向搜索区域的步骤如下:

  第1步,依次单击"开始/所有程序/管理工具/DNS",打开"dnsmgmt"控制台窗口。在左窗格中展开目录树,用鼠标右键单击"正向搜索区域"选项,在弹出的快捷菜单中执行"新建区域(Z)…"命令(如图1)。


图1 执行"新建主机"命令

  第2步,打开"新建区域向导",单击"下一步"按钮。在打开的"区域类型"向导页中点选"主要区域"单选框,将该计算机设置为主DNS服务器,单击"下一步"按钮(如图2)。


图2 选择区域类型
第3步,在打开的"区域名称"向导页中键入区域名称(本例输入"cpcw.com"),并单击"下一步"按钮(如图3)。



图3 键入区域名称

  第4步,打开"区域文件"向导页,保持"创建新文件、文件名为"单选框的选中状态,文件名采用默认值,单击"下一步"按钮。

  第5步,在打开的"动态更新"向导页中可以设置是否允许该区域进行动态更新。如果用户对安全性要求比较高,可以保持"不允许动态更新"单选框的选中状态,单击"下一步"按钮(如图4)。


图4 不允许动态更新

  第6步,最后打开"正在完成新建区域向导"向导页。向导页中显示出搜索区域的名称、类型和文件名等信息,单击"完成"按钮完成创建过程。
二.添加主机记录

  主机记录用于静态地建立主机名与IP地址之间的对应关系,只有添加了主机记录后才能真正实现DNS服务。当用户键入域名(即主机名和区域名称的组合)时,DNS服务器才能将域名解析为对应的IP地址,从而实现用户对相应站点(如WWW、FTP、BBS等站点)的访问。

  添加主机记录的步骤如下:

  第1步,打开"dnsmgmt"控制台窗口,在左窗格中展开"正向搜索区域"目录,用鼠标右键单击准备添加主机的区域名称,在弹出的快捷菜单中执行"新建主机"命令(如图5)。


图5 执行"新建主机"命令

  第2步,在打开的"新建主机"对话框中键入名称(如"WWW"),并在"IP地址"编辑框中键入提供该服务的服务器IP地址(本例为"192.168.0.169")。单击"添加主机"按钮(如图6)。


图6 新建主机

  第3步,打开"DNS"对话框,提示用户已经成功创建了主机记录。单击"确定"按钮即可。

  第4步,重复上述步骤可以建立对应多个服务的主机记录,最后单击"完成"按钮结束创建过程并返回DNS控制台窗口。在右窗格中可以显示出所有创建的映射记录(如图7)。


图7 查看映射记录

三.设置DNS转发器

  通过设置DNS转发器,可以在DNS服务器收到客户端发出的DNS请求将本地DNS服务器无法解析的DNS请求自动转发给指定的DNS服务器。用户可以设置多个DNS转发器,设置步骤如下:

  第1步,打开"dnsmgmt"控制台窗口,用鼠标右键单击DNS服务器名称,在弹出的快捷菜单中执行"属性"命令,打开"ServerName 属性"对话框。

  第2步,在"服务器名 属性"对话框中单击"转发器"标签,单击选中"DNS域"列表框中的"所有其他DNS域"选项,然后在"所选域的转发器的IP地址列表"编辑框中键入目标DNS服务器的IP地址,单击"添加"按钮。重复这一步骤可以添加多个DNS服务器的IP地址,最后单击"确定"按钮保存对DNS转发器的设置(如图8)。


图8 添加转发器IP地址

  小提示:目标DNS服务器建议使用本地ISP提供的DNS服务器。另外用户可以在转发器的IP地址列表中选中某个DNS服务器的IP地址,然后单击"上移"或"下移"按钮调整顺序,从而将响应速度较快的DNS调整至顶端,加快解析速度。

  四.创建辅助DNS服务器

  辅助DNS服务器用于当主DNS服务器发生故障后,立即启动并承担域名解析服务。当主DNS服务器正常运行时,辅助DNS服务器只起到备份的作用,并自动从主DNS服务器获取相应的数据,用户无需在辅助DNS服务器中添加主机记录。

  创建辅助DNS服务器必须在另一台运行Windows Server 2003的服务器中进行,其步骤如下:

  第1步,首先完成DNS服务器的安装,并进入"配置DNS服务器向导"。在"选择配置操作"向导页中保持"创建正向查找区域"单选框处于选中状态,并单击"下一步"按钮。

  第2步,在打开的"主服务器位置"向导页中点选"ISP维护该区域,一份只读的次要副本常驻在这台服务器上"单选框。选择这个选项可以将该计算机设置为辅助DNS服务器,单击"下一步"按钮(如图9)。


图9 创建辅助区域
第3步,打开"区域名称"向导页,在"区域名称"编辑框中键入和主要区域完全一致的域名(本例为"yesky.com"),单击"下一步"按钮(如图10)。



图10 键入相同的区域名称

  第4步,在打开的"主DNS服务器"向导页中键入主DNS服务器的IP地址,以便使辅助DNS服务器从主DNS服务器中复制数据,并依次单击"添加/下一步"按钮(如图11)。


图11 键入主DNS服务器IP地址

  第5步,打开"转发器"向导页,设置本地ISP提供的DNS服务器IP地址,并单击"下一步"按钮(如图12)。


图12 设置DNS转发器地址

  第6步,最后打开"正在完成新建区域向导"向导页,确认设置结果准确无误后依次单击"完成/完成"按钮完成创建过程。

  至此,在局域网中已经成功部署了一套较为完善DNS服务(暂不考虑安全方面的设置)。


2006/8/21

中国男人泡妞的七大误区

一、总以为丑女好泡
我在我过去的文章中曾经说过我有一位大学同学,因为自身条件很不好,所以他就去泡全校最丑的一位女生,结果泡了大半年也没泡到,遭到对方N次地拒绝,并被很多人嗤之以鼻。后来在我的提醒下,他把他那锲而不舍的精神用来追求一位"千人瞩目"的"系花",结果一个月之后那女孩就怀了他的孩子,并为之成功打下了有史以来第一胎。后来他们俩毕业不久就结婚了,现在日子过得很好,两人都非常感激我。
对于这件事而言,我认为我的作用是微乎其微的,发挥决定性作用的还是泡妞主体的个人觉悟及其爱情自信心。我今天不想用"丑女多作怪"来形容一些女性,这样毕竟有些太不人道,但我今天想说的是,有些长相一般的女人对自己太不自信从而导致了爱情良知的缺失,她们总不相信这个世界上真的会有男人来主动追求她们,即便是有了,她们也会毫无理由的将姿态放得很高很高,努力想要获得比那些美女更多的荣耀和自尊。我觉得这么做,很容易让她们患上心理上与智力上的双重疾病。--这就是导致丑女难泡的心理因素与智力因素。
当然,我并不是想建议广大的泡友同志们要有意地抵制丑女、崇尚美女,丑女一样可以平易近人,美女一样可以傲气凌人,从某种程度上说,丑女的母性特征较为明显,而美女的兽性特征较为明显。那些缺乏母爱的男人最好去泡丑女,那些性冷淡的男人有条件的话尽量去泡美女。
总体说来,女人的长相与我们泡之的难易程度没有必然的联系,但根据量子力学的原理,我勉强可以告诉大家:在同等条件下,美女较之丑女,泡起来会更加容易一点。

二、总以为处女都是纯洁的
处女具有肉体和精神的双重属性,世上只有一半的处女能够保持肉体和精神上的双处女,而剩下那另一半的处女也就图有一层光鲜的处女膜,在精神上她们早就不是处女了,在精神上,她们比非处还要非处。有些处女结婚前谈了很多次恋爱,跟很多人都睡过觉,五花八门的性游戏全都见识过了,每当男人想要捅破她的下半身,她就大喊"暂停",在这类处女的眼中,无论多么美好的爱情无论多么深刻的情感都不及那层处女膜来得珍贵,所以这样的"处女膜捍卫者"永远都得不到真正的爱情,她们是可悲的,她们总是在结婚之后,凭借一张处女膜向自己的丈夫诉说着自己的贞洁,她们想要索取的比那些非处新娘要多得多,一但她们发现自己坚守了那么多年的贞操价值并不能被家庭和社会所承认,她们就会疯狂地去找寻她们曾经失去的青春年华,于是,她们学会了偷情。所以说,那些娶了处女为妻的男人也许活得并不开心。
  处女只是个生理特征,而非道德因素,如果有谁将她作为婚姻的筹码那将是可笑的。
  处女,与妻子无关,对于男人来说,只要拥有过就算没有白活,哪怕你在临死前才遇到,那也不失为一种可爱的人生,就算永远遇不到,那也无须悲伤,因为这个世界已经足够悲伤。

三、总以为送上门的都是烂货
有很多人总是以为一些送上门来让自己白玩的女人都是别人玩剩下来的烂货,其实这是男人们对女人们的最大误会。今天我想说的是:那些真正的垃圾女人是绝对不会送上门来让你白玩的!为了体现她们肮脏肉体与卑微灵魂的低廉价值,他们对男人会百般刁难,提出种种借口与条件逃避一次又一次的牵手、亲吻和性爱。我宁可相信那突如其来的爱情故事,我也不相信那些经过死缠烂打、唇枪舌战之后看似如火纯青、洁白无暇的爱情协议。爱情是种情感而不是个和约,爱情没有任何附加条款,她是无条件的感情世界赋予人们的幸福感受,哪怕她是痛不欲生的或是昙花一现的,她最终都将是刻骨铭心的。
无论送上门的女人还是我们自己辛苦寻得的女人,她们都是平等的,都值得我们用心去爱。从泡妞的角度来看,如果我们能够选择守株待兔,为何非要大海捞针呢?如果我们错过了那些爱慕自己的女人,我们的幸福生活将会葬送在那片无边的死海之中。

四、总以为有钱就能通吃
前天晚上我在酒吧买醉,跟朋友喝了几瓶洋酒,与身边的一位陪酒女郎玩了很多猜拳游戏,于是她跟我就似乎有了"感情",问了我很多私人问题,如果不是因为我带了一个临时女友,我想那天晚上我一定跟那陪酒女郎上床了。是的,哪天晚上我们表现得挺有钱的,很多女人都簇拥过来。我心理明白,这样的女人全部可以用金钱来换取的,所以我觉得她们并不珍贵。世上凡是可以用货币来购买的商品都算不上珍贵。世上有很多女人都不吃金钱这一套,真正有本事的男人搞的都是这样的女人。有很多男人动不动就鄙视某女人财迷心窍,那其实很清楚地说明了他本人的无能。两手空空干女人与白手起家干事业同样可以证明一个男人的能力。
古人视金钱如粪土,我认为他们是在说慌。只有当女人爱上男人的时候,金钱才真正地成了粪土。


五、总以为长得帅就有魅力
有天晚上,我老婆看"莱卡好男儿",突然她说:怎么现在的男人都长得跟娘儿们似的,我听说过古代女人以胖为美,听说过文艺复兴时期欧洲人以留胡子为美,却没见过现代男人以变态为美的。是的,不仅是我老婆,我想很多女人都已经对所谓的帅哥审美疲劳了。莱卡好男儿是我们男人的耻辱。女人用她的美貌来获得他人的追捧和宠爱是无可厚非的,倘若男人也用他的长相来博取他人施舍的同情与恩典那将是非常卑鄙的。我早就说过,欣赏男人相貌的女人是低俗的也是愚蠢的,是没有教养和没有层次的,是鼠目寸光和没有见过世面的。即便我本人长得不算难看,我还是要这么说。所谓的帅哥之所以到最后总没有好的下场就是这个缘故,是他们一开始就动用了自己的色相。女人,在长大之后,她们总会选择有内涵的男人,而不是一个弱不禁风的软腿帅哥。漂亮女人,无论被多少人玷污过,依然谁都想要;漂亮男人,被人玩到最后,肚子大了,谁都不想要。男人长的帅绝对没有错,只要你不将它当做武器或资本,因为青春不是以帅作为衡量尺度的。


六、总以为可以逃避惩罚
很多的情场老手玩弄了无数女性,却不曾付出任何的责任和代价,一贯以调情大师自居,伤害了很多人,洋洋得意风流成性。这样的人出来混久了迟早要还的,我从来不相信世上存在那种毫无感情的人,只是他们偿还的日期没有来到而已。他们辜负了很多女人的真心,待他们吐出来的那一天,他们会觉得生不如死、天昏地暗,整日以泪洗面,人生失去意义。我可以看着我的情人当面玩弄妓男,我却不能容忍她背着我去跟别的男人约会。你可以占有很多的肉体却不可以欺骗很多的感情,谁都逃避不了应有的惩罚。男人是这样,女人也是这样,谁都不知道谁会玩弄谁,谁都不知道谁会突然爱上谁,谁也不知道谁会背叛谁,谁也不知道最终谁会惩罚谁。


七、总为家庭愧疚
既然要泡妞,那就好好地泡,坦坦荡荡地泡,不要唯唯诺诺、胆惊受怕,那样不但捉鸡不成蚀把米,还要遭到众妞的鄙视。一个男人一生不可能只爱上一个女人,一个女人一生也不可能只爱上一个男人,如果没有出轨,那只是机会没到。想泡就泡吧,无需愧疚,无需忏悔,偷情或泡妞是我们人生道路的必由之路,如果缺乏了这一点,我们的人生就是不完美的。我们有了情人,并不意味着我们就背叛了家庭,我们可以对待我们的妻子更加美好。丈夫总不希望妻子偷情,妻子总不希望丈夫出轨,可谁也无法真正地约束自己,只要有机会,他们谁也不会放弃。与其彼此责备、互相愧疚还不如坦然地享受。
我对我的情人说:我一生嫖妓无数,并未做过身体检查,我害怕我患上了爱滋,请让你的老公做个检查吧,别被我无辜地传染了。
我的情人对我说:如果你哪天死了,我一定陪你一起死,但我希望你的妻子和孩子都活着......

StatusBars的使用方法

Statusbars 是第二个 玩家/宠物/目标接口,不会跟 魔兽 原本的冲突到的,
可以移动,算是在战斗中,放在中间使用的,这样就不用一直看窗口左上方的血,一边看窗口中间的怪物了,
建议配合 MobHealthMobHealth2 使用,这些就可以看到怪物的血量了
也是用指令,嘿嘿
…:P:P
/statusbars (lock|unlock) --
锁住和解开 Statusbars ,移动时才会用到的。

/statusbars (load|save) name (defaults) --
读取和储存某个玩家的设定檔,name 就打玩家的名字,Defaults 就是原先的设定。
/statusbars target option (print|reset) --
主要功能简介,Target 目标,Option 选项,Print 显示该选项的设定,Reset 回复到该选项原来的设定。

Target
目标功能指令 :
all --
一次把所有的 目标功能 全部设定成同一个选项功能,关于选项功能请看下面的 Options 选项指令。

player --
所有关于玩家的接口,像是 BUFF/DEBUFF/HP/MANA/RAGE/ENERGY
target --
所有关于目标的接口,像是 BUFF/DEBUFF/HP/MANA/RAGE/ENERGY
pet --
所有关于宠物的接口,像是 BUFF/DEBUFF/HP/MANA/RAGE/ENERGY
power --
所有关于力量的接口,像是 MANA/RAGE/ENERGY
tpower --
所有关于目标力量的接口,像是 MANA/RAGE/ENERGY
ppower --
所有关于宠物力量的接口,像是 MANA/RAGE/ENERGY
health --
血量列表。
mana --
魔法力量列表。
rage --
战士专用的怒气列表。
energy --
盗贼专用的力气列表。
focus --
宠物力量列表。
combo --
盗贼的 COMBO POINT 列表。
druid --
德鲁伊的列表。
buff --
这个就是 BUFF 列表,有中文吗?
debuff -- DEBUFF
列表。

thealth --
目标血量列表。
tmana --
目标魔法力量列表。
trage --
目标怒气列表。
tenergy --
目标力气列表。
tfocus --
目标宠物力量列表
tbuff --
目标 BUFF 列表。
tdebuff --
目标 DEBUFF 列表。
phealth --
玩家宠物血量列表。
pmana --
玩家宠物魔法力量列表。
prage --
玩家宠物怒气列表。
penergy --
玩家宠物力气列表。
pfocus --
玩家宠物力量列表。
pbuff --
玩家宠物 BUFF 列表。
pdebuff --
玩家宠物 DEBUFF 列表。

Options
选项指令 :
alpha -- Statusbars
的接口透明度,可以调 0.01.0,预设是 1.0

enable --
设定在什么状况下,。目标功能 才会显示,状况有分 :
----------- Always (
任何时候),永远显示,不会消失的。

----------- Auto (
自动),自动显示和隐藏,例如当被打到,MANA 不满的时后,所有战斗中会发生的,都会显示,没有这些的话,则会隐藏。
----------- Combat (
战斗中),和 自动 一样,不过,在战斗中也会显示。
----------- Combatonly (
只有战斗中),只有在战斗中才会显示。
----------- Never
任何时候不显示。
color, tcolor,pcolor -- Statusbars
的颜色设定,颜色相关设定请看下面的 -- 颜色设定 --
----------- color
就是指 Statusbars 的列表的颜色。
----------- tcolor
则是在列表里血量,魔法力量,怒气等等数字或是怪物名字和等级的颜色。
----------- pcolor
则是血量,魔法力量,怒气等等列表旁边的百分比数字的颜色。
flash --
闪动,就是当血量,魔法力量,怒气等等低于所设定的时后,列表会闪动,on 就是打开,off 则是关闭。需要配合 warn 功能设定什么时后会闪动。
group --
设定列表的所在位置,每个列表都有单独的位置,所以可以相互对调,列如 : playerpetgroup1group2group3 等等
percentage --
设定血量,魔法力量,怒气等等的百分比数字的位置,有 none (不显示)left (左边)right (右边)

ptext --
百分比的数字的自订设定,相关设定请看下面的 -- 文字设定 --
scale --
列表的大小,只有当所有的列表都是属于同样大小的时后才有用。
text --
列表里面的数字的自订设定,相关设定请看下面的 -- 文字设定 --
warn --
闪动,就是当血量,魔法力量,怒气等等低于所设定的时后,列表会闪动。预设是 0.6,也就是 60% 的时后会闪动。需配合 flashon/off 功能。

Statusbars
使用方法 : 一定得先打 /statusbars ,然后再打 目标功能 (Target),然后再用 选项 (Options) 加上各自的指令来改变目标接口。
例如 :
/statusbars all (
目标功能) enable (选项) combatonly (选项指令),打这样就会把所有的接口设定成只有当战斗中才会显示出来。

/statusbars pet (
目标功能) alpha(选项) 0.0 (选项指令),打这样就会把宠物的接口设定成透明。

需要使用到 Print,来显示该选项的设定的话,则是这样
/statusbars player health print
就会跑出一个类似这样的讯息
: StatusBars: health.text = &cur / &max
Reset
则是把 print 改成 reset 就行了,像

/statusbars player health reset
讯息一样,也是
: StatusBars: health.text = &cur / &max
当然,如果没改过的话,PrintReset 的讯息当然就是一样的啰



==============
颜色设定
==============
颜色只能输入颜色语法,像是 f00ff8000,或者直接打颜色的英文单字也行,像是 GREEN (绿色)RED (红色) 和预设的魔法力量的颜色,BLUE (蓝色)

例如 :
/statusbars health color red
,这样写的话,玩家的血量列表就会变成红色的。

/statusbars thealth color white
,这样写的话,目标的血量则会变成白色的。

也可以设定成几 % 的时后,变一种颜色,到几 %,再变另一种颜色,
像预设的血量颜色就是 25% 以下是红色 (red)50% 以下是橘色 (orange)75% 以下则是黄色 (yellow)100% 以下或是其它则是(green)…
指令则是这样
: /statusbars health color <25%:red <50%: orange <75%:yellow green
---------------------------------------------
注意 : 上面 50% 那边,50%:orange 中间是没有空格的,是因为没空格的话,会变成论坛图案,所以才加的

<
的意思就是小于,和数学公式一样,其它则是 =!=<><==>

像是如果盗贼需要在 12 COMBO时变颜色,34 再变,5的时也会变时,就是这样。
/statusbars combo color =5:green >=3:yellow red
=5:green
就是当 5 COMBO 时改成 绿色,>=3 就是当 34 COMBO 时是黄色,1/2 或是其它就是红色。
这个部分满复杂的,像是那些数学公式 !=<==>,我也不太明白的说…>_< !!

==============
文字设定
==============
文字设定的语法有这些,&cur (现在数字)&max (最大数字)&frac (百分比)&-cur (减少多少)&name (名字)&lvl (等级)

设定时的话,则是这样 :
/statusbars thealth text &name, &lvl (&frac%)
目标的血量列表里不再显示血量数字,改成 &name,目标名字,&lvl,目标等级,(&frac%),目标血量百分比。

会变成这样,The Beast, 500+(50%)

喜欢显示血量数字的话,也可以,像是这样

/statusbars thealth text &cur / &max (-&-cur)
目标的血量列表里有,&cur,目前血量,&max,最大血量,(-&-cur),减少多少。

会变成这样,4000 / 8000(-4000)