一、先弄清楚两套发光体系分别是什么
在绝大多数主流引擎里,装备发光并不是一个孤立的开关,而是分成两条并行的通道。
第一条通道是引擎内置的基础发光,走的是 SetItemsLight 这类命令,本质上是让引擎在装备外框上刷一层引擎预先定义好的光效。这条通道的特点是效果固定、编号固定,引擎里只给了两个值可用,也就是发光效果1和发光效果2,数量上就两种,不能自定义贴图。
第二条通道是自定义物品特效,走的是 M2 里的特效列表,把外部补丁文件里的动画帧绑到装备上,再通过 SETITEMEFFECT 或者物品特效列表来让它显示。这条通道可以自由选素材、自由设坐标、自由设播放帧数,理论上没有上限。
所谓的两种发光效果同时支持,指的就是让这两条通道在一件装备上一起工作,互相不覆盖。只要把命令用对,两者是叠加关系,不是替换关系。
二、内置发光命令 SetItemsLight 的取值含义
先把这条命令的参数彻底讲明白,这是能不能同时出两种效果的关键。
命令格式是 SetItemsLight 位置 值。
位置这一栏填的是装备槽位编号,取值0到12。值这一栏有三个合法取值,分别是1、2、0。这里要特别注意,1和2不是等级高低,而是两套互不相同的发光效果,0是清除发光。
也就是说,公开的写法是这样的:
[@发光效果1]
#IF
#ACT
SetItemsLight 3 1
[@发光效果2]
#IF
#ACT
SetItemsLight 3 2
[@取消发光]
#IF
#ACT
SetItemsLight 3 0
用1就是发光效果1,用2就是发光效果2。很多脚本作者误以为给同一个位置连着写两条命令就能叠出两种光,实际执行时后一条会把前一条顶掉,因为这条命令是赋值而不是累加。这也是为什么不少人做出来只有一个效果。
三、位置编号对照表
写脚本之前把位置编号记牢,写错位置就等于没写。
0 盔甲
1 武器
2 照明物,也就是蜡烛,这个位置的物品属性升级无效
3 项链
4 头盔
5 右手镯
6 左手镯
7 右戒指
8 左戒指
9 护身符位置,放毒和符
10 腰带
11 鞋子
12 宝石
要注意的是,内置发光这条通道对位置有硬限制。盔甲、武器、头盔这三个位置在多数版本里是不支持的,也就是说衣服和武器想靠 SetItemsLight 出内置光效是出不来的。这一点非常关键,它直接决定了两种效果该怎么分工。
四、把两种效果分配好位置
既然内置发光只对首饰、腰带、鞋子、宝石这类位置有效,而自定义特效对衣服和武器支持得更好,那同时支持两种效果的思路就很清楚了:让内置发光负责首饰那一批位置,让自定义特效负责衣服和武器,两条通道各管一段,互不打架,一件装备上自然就能同时看到两种光表现。
具体分工可以这样安排。
武器和衣服,走自定义特效,用 SETITEMEFFECT 绑特效编号,配上补丁里的动画帧,做出来的光效更炫,可调的参数也多。首饰一类,走 SetItemsLight,用发光效果1或者发光效果2,成本低、不用补丁、进游戏直接就亮。
如果想在同一个首饰位置上也叠一层自定义特效,那就用下面第五部分的写法,效果一和效果二不是互相覆盖,而是分层显示。
五、用 SETITEMEFFECT 的特效位置参数叠加多层光效
新版本引擎在 SETITEMEFFECT 这条命令上做了扩展,除了位置和特效编号之外,还能再跟一个特效位置参数,取值范围0到2,同一个物品上最多可以同时挂3个特效编号,分别占据位置0、位置1、位置2。这跟前面说的两种内置发光是两个层面的东西,但配合起来用,一件首饰上就能同时出现三种光表现。
命令格式是:
SETITEMEFFECT 位置 特效编号 特效位置
参数3为空或者写0,等于走默认位置。特效编号必须在 M2 的列表信息二、特效列表里事先编好,编号范围上限各引擎略有差别,有的给到255,有的给到65535。写0表示清除该位置的特效。
实际脚本例子:
[@主菜单]
#ACT
SETITEMEFFECT 6 1
SendMsg 6 左手镯附加了特效编号1,位置0
SETITEMEFFECT 6 1 1
SendMsg 6 左手镯附加了特效编号1,位置1
SETITEMEFFECT 6 5 2
SendMsg 6 左手镯附加了特效编号5,位置2
关闭指定位置:
SETITEMEFFECT 6 0
SETITEMEFFECT 6 0 1
SETITEMEFFECT 6 0 2
三条命令分别关掉位置0、位置1、位置2上的特效。只写 SETITEMEFFECT 6 0 是关位置0那一个,不会牵连另外两个。想让某个位置单独换效果,直接重新赋值那个位置即可。
这就是同时支持两种甚至三种发光效果的核心写法:不是写两条 SetItemsLight,而是用特效位置参数把多个特效编号分开挂在同一件物品上。
英雄这边如果也要同步发光,在命令前面加 H. 前缀,也就是 H.SETITEMEFFECT,参数完全一样。
六、在 M2 里先把特效编号编出来
命令里写的特效编号不是随便填的,必须先在引擎里创建。步骤是这样的。
打开 M2 服务器控制台,点查看,进列表信息二。里面有一项特效列表,对应的文本文件是 Envir 目录下的 EffectList.txt。点新增,填写资源文件、开始图片编号、播放数量、坐标偏移这些参数。
资源文件就是要用的补丁名,比如 HumEffect2.wil、stateitem.wil 这类。开始图片编号是在 wil 编辑器里数出来的帧号。播放数量决定动画播几帧,内观效果一般填1就够了,外观效果按实际帧数填。
同一个编号可以分别配内观特效和外观特效。内观是人物界面和装备栏里显示的那层光,外观是角色站在地图上时身上冒出来的那层光。两者可以给同一件装备都配上,这又是一层同时生效的叠加。
编辑完点保存,然后重新加载一次引擎的数据,编号才会真正生效。
七、把特效编号绑到装备上
编号编好之后,还要告诉引擎哪个编号对应哪件装备。这一步在 M2 的列表信息二里的物品特效项完成,对应文件是 Envir 下的 EffectItemList.txt。
格式很简单,一行一条,物品名加空格加特效编号。物品名必须和数据库里 StdItems.DB 的名字一字不差,多一个空格少一个字都会绑不上。
绑定完成后重新加载物品数据库,进游戏看效果。
八、不走脚本的另一种做法:直接改数据库
如果不想写命令,也可以在物品数据库里直接把发光字段填好,这样装备一掉落、一穿戴就自动带光,不需要任何 NPC 和触发。
用数据库工具打开 StdItems.DB,找到目标装备。武器和衣服这类走自定义发光的,把 Anicount 字段改成发光专用值,通常是190,意思就是启用自定义发光。引擎还内置了若干特殊发光值,比如138是吸血光效、241是倚天辟地光效、246到254这一段也是预留的发光编号,具体含义按自己引擎的说明来查。
然后手动写发光配置文件,放到客户端的 data 目录下。武器用的是 Sky_WeaponEffect.txt,衣服用的是 SKY_HumEffect.txt。
文件是按竖线分隔的,每一列的含义依次是编号、外观文件名、起始帧、内观文件、起始帧、结束帧、是否偏移、偏移X、偏移Y、备注。这里面的编号指的是装备数据库里 Shape 字段的值,不是随便填的顺序号。
写好之后进游戏,装备自带光效。这种做法和前面的脚本命令并不冲突,脚本负责动态开关和收费发光,数据库负责默认发光,两条路可以一起用。
九、两种效果同时生效时最容易出的四个问题
第一个问题,两个效果互相顶掉。原因基本是把两套体系当成一套了,在同一件装备上用两条同一体系的命令互相覆盖。解决思路就是按第四部分做分工,首饰用内置发光,衣服武器用自定义特效。
第二个问题,脚本写完没反应。九成是没在 M2 里重新加载对应的数据。改完特效列表要重载特效数据,改完物品特效要重载物品效果,改完数据库要重载物品数据库。少一步就看不到变化。
第三个问题,只有自己能看见光,别人看不到。这通常是补丁不一致造成的。特效素材是打在客户端里的,如果发光的资源文件没有随版本一起发布,或者玩家用的是旧补丁,服务端这边绑得再对,客户端也渲染不出来。检查补丁是否同步,是排查这类问题的第一步。
第四个问题,头盔、衣服、武器用 SetItemsLight 设不出来。这不是脚本写错了,是这几类位置本来就不支持这条命令。换成 SETITEMEFFECT 或者改数据库的办法来处理。
十、脚本骨架示例
下面给一份把两种效果都照顾到的脚本骨架,可以直接放进 NPC 脚本里改。
[@main]
欢迎光临装备发光处。
<首饰发光效果1/@首饰1>
<首饰发光效果2/@首饰2>
<武器自定义特效/@武器特效>
<取消全部发光/@清除>
[@首饰1]
#IF
CHECKUSEITEM 3
#ACT
SetItemsLight 3 1
SendMsg 6 项链已开启发光效果1
GOTO @main
[@首饰2]
#IF
CHECKUSEITEM 3
#ACT
SetItemsLight 3 2
SendMsg 6 项链已切换为发光效果2
GOTO @main
[@武器特效]
#IF
CHECKUSEITEM 1
#ACT
SETITEMEFFECT 1 1
SETITEMEFFECT 1 5 1
SendMsg 6 武器已附加两层特效
GOTO @main
[@清除]
#ACT
SetItemsLight 3 0
SETITEMEFFECT 1 0
SETITEMEFFECT 1 0 1
SendMsg 6 发光效果已全部清除
CHECKUSEITEM 是判断对应位置有没有佩戴装备,编号和前面位置表一致。加上这个判断可以避免玩家没戴装备也扣费、也发光。如果想做收费发光,在 #ACT 段里加一行扣元宝的命令就行,比如 GAMEGOLD - 50000,前面再用 CHECKGAMEGOLD 判够不够。
十一、命令选择上的几条经验
想省事、不折腾补丁,就用 SetItemsLight,它只认效果1和效果2两个值,做成菜单让玩家二选一,是最稳的做法。
想做出差异化的外观,比如武器冒火、衣服带翅膀、首饰有环绕光环,就用 SETITEMEFFECT 配自定义特效编号,靠特效位置参数在一件装备上叠多个编号。
想让装备天生就带光、不需要玩家操作,就走数据库 Anicount 加发光配置文件这条路。
三者可以并存。一件武器完全可以是数据库默认发光、脚本开启后叠加一层自定义特效、同时再在首饰位置挂上内置的发光效果1,玩家看到的是一整套光表现,引擎那边则是三条互相独立的通道在各自工作。
真正卡住大多数人的从来不是命令本身,而是没有把内置发光和自定义特效当成两条独立的线。把位置分工定好、把特效编号在 M2 里编好、把补丁同步好,三种光叠在一件装备上也能正常显示。

