传奇重新分配人物附加属性点脚本命令用法与实战案例详细解析教程

来源: 作者: 点击:
先分清附加属性点和基础属性点

服务端脚本里,人物的属性分两层。一层是职业成长带来的基础属性,战士升级涨攻击和血,法师涨魔法,道士涨道术,这层由引擎自己算,脚本基本不碰。另一层是玩家自己点上去的附加属性点,转生送的、赞助档位给的、活动发的都算这种,玩家能在NPC那里把这些点分配到攻击、魔法、道术、防御这些位置上。

两层混在一起,命令就容易记串。很多人在做洗点功能时把 BONUSPOINT 当成直接加攻击去用,洗完点属性一团乱,问题就出在没搞清脚本操作的是点数池还是已经加好的属性。

重新分配这个动作的本质,是把已经分配到各属性上的附加点全部收回,放回未分配状态,让玩家重新点一遍。干这件事的核心命令只有一个,RESTBONUSPOINT。

RESTBONUSPOINT 重新分配的核心命令

功能说明很直白,把人物附加的属性点复位到未分配状态。

text
#IF
#ACT
RESTBONUSPOINT
#SAY
你的属性点已经重新分配


执行完,玩家之前点上去的攻击、魔法、道术、防御这些附加数值全部清零,点数回到可分配池,之后通过加点NPC重新分配。它不动等级,也不动基础属性,只处理附加这一块。

配套的还有两条,BONUSPOINT 调整点数,CHECKBONUSPOINT 检查点数。三条属于同一套系统,缺一条洗点流程就写不完整。

BONUSPOINT 调整点数池

作用是调整人物属性点,格式是 BONUSPOINT 控制符(=,+) 点数(0-1000)。

设置点数:

text
[@BONUSPOINT0]
#IF
#ACT
BONUSPOINT = 0
#SAY
你的属性点已全部清0了。


增加点数:

text
[@BONUSPOINT1]
#IF
#ACT
BONUSPOINT + 1
#SAY
你的属性点已经加了1点。


区别在于,BONUSPOINT = 是把这个池子的数量直接设成多少,BONUSPOINT + 是往上累加。给转生角色发点、按赞助档位发点,用的都是加号那条;清空某一类点数,用等号设0。

点数上限要留意,多数引擎卡在1000。一次想发几千点的,得分批发或者改引擎参数,直接写 BONUSPOINT + 5000 大概率被截断,玩家最后到手的比预期少。

CHECKBONUSPOINT 检查点数

做洗点NPC时得先知道玩家手里有多少点,再决定能不能洗、洗完退多少。这条负责读数值,写法通常是:

text
#IF
CHECKBONUSPOINT > 0
#ACT
RESTBONUSPOINT


判断有没有未分配的点,判断某个属性上加了多少,都靠它。部分引擎还会返回具体点数值,方便在对话里显示当前可分配点数。

USEBONUSPOINT 和上面不是一回事

这条最容易被搞混,单独拎出来说。格式是 USEBONUSPOINT 属性位置(1-9) 控制符(+,-,=) 点数。

属性位置对应关系,1攻击力,2魔法力,3道术力,4防御力,5魔防力,6生命值上限,7魔法值上限,8准确,9躲避。有部分引擎把位置扩到了14,后面几位依次是防御下限、防御上限、魔御下限、魔御上限、吸收伤害。

关键点在定义不统一。GEE一系的文档写的是永久增加人物属性分配点,给的是分点池里的点数,不是直接加属性。分配规则要是17点换1点攻击,那么 USEBONUSPOINT 1 + 20 只会让你多出20点可分配点,实际加1点攻击还剩3点。另一批引擎的说明则是直接增加人物基础属性。写脚本前翻自己引擎自带的命令说明,别照搬别的版本的例子。

text
[@Main]
#ACT
USEBONUSPOINT 1 + 20
SENDMSG 7 攻击力增加20点.

英雄的对应命令

合击版本里英雄也有一套属性点,命令前面加H加点。RESTBONUSPOINT 变成 H.RESTBONUSPOINT,BONUSPOINT 变成 H.BONUSPOINT,USEBONUSPOINT 同理。写双人洗点时两套都要处理,只洗主号不洗英雄,玩家点开英雄属性发现点没退,回头就找你。

一个完整的洗点NPC脚本

把上面的命令串起来,能用的洗点功能大概长这样,以GOM和GEE常见写法为例。

text
[@洗点]
#IF
#ACT
RESTBONUSPOINT
#SAY
属性点已全部收回,请重新分配。\
<返回分配/@分配> <关闭/@exit>

[@分配]
#IF
CHECKBONUSPOINT > 0
#SAY
你还有未分配的点数。\
<加攻击/@加攻击> <加魔法/@加魔法> <加道术/@加道术>

[@加攻击]
#IF
CHECKBONUSPOINT > 0
#ACT
USEBONUSPOINT 1 + 1
BONUSPOINT - 1
GOTO @分配


思路是先全部收回,RESTBONUSPOINT 一把清,再让玩家一点一点分配,USEBONUSPOINT 加点,每分一点从池子里扣一点,BONUSPOINT - 1。用 CHECKBONUSPOINT 卡住,池子空了不让再点。这三条命令在这里是闭环的。

引擎里 USEBONUSPOINT 加的就是池子里的点的话,这段要反过来写,分配多少直接扣池子,以自己引擎为准。

QF里的防作弊字段

上面这套只放在NPC脚本里,有个隐患。玩家可能用WPE这类工具直接改客户端发过来的加点数据,绕开NPC白拿属性。引擎留了个钩子,玩家每次调整附加属性点,都会触发QF文件里的 [@ClientAdjustBonus] 字段。

在这个字段里加判断,发现异常直接复位:

text
[@ClientAdjustBonus]
#IF
#ACT
RESTBONUSPOINT
BONUSPOINT = 0
SENDMSG 5 非法操作!
BREAK


版本里如果没有转生送点这类正常加点入口,直接这么写是安全的,玩家每一次加点都会被清掉。有正常入口的,要在字段里加条件区分,只拦非正常来源。M2上开了操作信息显示的话,调整附加属性点的记录会打出来,方便查谁在异常加点。

ChangeHumAbility 和上面的区别

有人把 ChangeHumAbility 也当成属性点命令,其实它管的是另一件事,临时改属性。格式:ChangeHumAbility 属性(1-20) 操作符(+ = -) 效果(1-65535) 时间秒。

属性位置的完整表:1防御下限,2防御上限,3魔御下限,4魔御上限,5攻击下限,6攻击上限,7魔法下限,8魔法上限,9道术下限,10道术上限,11MaxHP,12MaxMP,13HP恢复,14MP恢复,15毒恢复,16毒躲避,17魔法躲避,18准确,19敏捷,20幸运。

它跟属性点最大的不同是带时间参数,调出来的属性人物下线就没了,不带时间则在线期间一直有效。装备临时buff、药水效果、地图加成用的都是它。少数引擎还有 ChangeHumAbilityEX,属性位是1到12。

高频改属性时加锁

一套洗点或buff脚本,一次动十几条属性,直接改会明显吃CPU,被反复触发时游戏跟着卡。翎风一类引擎给了两个命令来优化,LockUpdateAbil 和 UpdateAbil。

执行一长串属性修改前先 LockUpdateAbil 锁住刷新,改完再 UpdateAbil 解锁并刷新一次,中间所有的 ChangeHumAbility 都夹在两者之间。

text
[@加]
#IF
#ACT
LockUpdateAbil
ChangeHumAbility 1 + 5
ChangeHumAbility 2 + 5
UpdateAbil


配合 PrintUseTime 还能测耗时,把1和2分别放开头和结尾,结算微秒数。高频脚本能压到1毫秒以内算正常。

不同引擎的差异要留意

同一条命令在不同引擎里细节不一样。

GOM和GEE一系,RESTBONUSPOINT、BONUSPOINT、CHECKBONUSPOINT、USEBONUSPOINT 这套是全的,写法也基本一致。

LEGEND和BLUE一系多了一条 AbilityAdd,格式 AbilityAdd 属性(0~6) 点数(0~65535) 时间(秒),0是HP,1是MP,2防御,3魔御,4攻击,5魔法,6道术。加的是有时间的附加属性,时间到了自己消失。配套变量是
𝐴
𝐵
𝐼
𝐿
𝐼
𝑇
𝑌
𝐴
𝐷
𝐷
𝑃
𝑂
𝐼
𝑁
𝑇
0
到
ABILITYADDPOINT0到ABILITYADDPOINT6,以及对应的 $ABILITYADDTIME0 到 6,可以读出来做叠加。英雄用 H.AbilityAdd。

LEG引擎里 BONUSPOINT 的写法和上面一样,洗点清点还是靠它加 RESTBONUSPOINT。

写脚本前把引擎自带的帮助文档调出来对一遍属性位置和参数范围,比在网上抄现成例子靠谱。同一个命令名,位置编号差一位,加出来的属性就全错,而且跑起来不报错,只有玩家能发现。

常见坑

附加点和基础属性混用是最多的一个。RESTBONUSPOINT 收的是附加点,改不到基础属性,指望它把洗掉的攻击从基础值里扣,方向就错了。

点数池上限没注意是第二个。BONUSPOINT 写大数值被截断,玩家拿到的点比预期少。

第三个是只洗主号忘了英雄。合击版本两套属性点都要处理。

第四个是洗点前后没有事务感。脚本先扣道具再洗点,中间任何一步失败,玩家可能白花材料没洗成,或者洗了没扣材料。把扣道具放在确认之后、命令执行之前,失败的路径提前想清楚。

第五个是防作弊字段没加。版本里只要有转生、有赞助,玩家就有动机去卡这个点,[@ClientAdjustBonus] 该加就得加。

最后一个是没在本机测试就上。属性点脚本改错位置不会报错,先拿小号在一个测试NPC上验证一遍,比在正式版本上让玩家试要省事得多。