传奇服务端同时实现两种装备发光效果脚本的完整写法与参数详解

来源: 作者: 点击:
很多人在改版本的时候会遇到同一个需求:一件装备要同时带两层光,一层是装备本身的发光效果,另一层是额外的特效叠加,比如武器既要有引擎自带的那种常驻光晕,又要在穿戴后叠一层炫彩动画。做成脚本之后发现只能设一种,设了第二种第一种就没了,或者两种效果互相顶掉。问题出在把两套发光体系当成了一套来写。这里把两种发光效果拆开讲清楚,再给一套能同时生效的脚本写法。

 

一、先弄清楚两套发光体系分别是什么

在绝大多数主流引擎里,装备发光并不是一个孤立的开关,而是分成两条并行的通道。

第一条通道是引擎内置的基础发光,走的是 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 里编好、把补丁同步好,三种光叠在一件装备上也能正常显示。