当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇锁定装备防止爆出脚本命令详解与全引擎触发机制配置实战手册

热度:
装备防爆的脚本实现,核心绕不开两个层面:一是给装备打上“禁止爆出”的绑定标记,二是利用死亡掉落触发在装备即将离身时进行拦截。前者是静态设置,后者是动态拦截,两者配合使用才能覆盖绝大多数防爆需求。

##设置装备禁止爆出状态的核心命令

GOM引擎和GEE引擎通过SetItemState命令给装备打绑定标记。命令格式为:SetItemState装备位置项目属性。装备位置取值0到13对应身上各装备栏,-1表示OK框中的物品。项目编号中,5代表禁止爆出。属性填1表示启用绑定,填0表示取消。例如给衣服设置禁止爆出,脚本写法为:SetItemState051。执行后玩家死亡时该衣服不会掉落,但背包中的同名物品不受保护。

GEE引擎的项目编号与GOM略有不同,其项目列表为:0禁止扔、1禁止交易、2禁止存、3禁止修、4禁止出售、5禁止打出、6丢弃消失、7禁止取下。GEE引擎的“禁止打出”对应GOM的“禁止爆出”,配置时不能照搬编号,需按引擎实际的项目表填写。

检测装备是否已设置禁止爆出,使用CheckItemState命令。格式为:CheckItemState装备位置项目。如果装备已绑定禁止爆出,检测结果为真。典型用法是先检测再设置,避免重复操作:如果CheckItemState05为真,说明衣服已经绑定了禁止爆出,不需要再次执行;否则执行SetItemState051完成绑定。

LEG引擎和BLUE引擎不走SetItemState这条路。BLUE引擎在M2控制台的“装备绑定控制面版”中批量管理绑定规则,可以勾选“绑定装备不可爆出”。LEG引擎则需要在Envir目录下的AllowBindNameList.txt中逐行添加允许绑定的装备名称,未列出的装备无法绑定。LEG引擎还有一个通过GM命令直接给首饰类装备增加防暴属性的方式,使用@Supermake命令,装备属性编号中16对应防暴属性,每增加一点减少一点被爆出的概率,与禁止爆出的绝对保护不同,这是一种概率性防爆。

##掉落前拦截与掉落时处理两种触发

设置绑定状态解决的是“这件装备永远不会爆”的需求。如果需要在特定条件下才防爆,比如攻沙期间保护、或者有次数限制的保护,就必须用脚本在死亡掉落环节进行拦截。不同引擎的触发时机有本质区别。

**@HumDropItem触发(掉落时触发)**

GOM引擎和GEE引擎支持@HumDropItem标签,写在QFunction-0.txt中。这个触发在玩家死亡且物品即将掉落时被调用,触发对象是人物身上穿戴的物品,不包含背包。使用前需要在M2的“列表信息二-物品规则”中对需要触发脚本的物品进行勾选,未勾选的物品不会触发这个标签。

@HumDropItem触发中可以直接执行StopDropItem来中止当前物品的掉落。最简用法是与攻沙条件结合:在@HumDropItem中检测当前是否处于攻城区域,如果是则执行StopDropItem,装备不掉落;不在攻城区域时不做拦截,装备正常掉落。脚本结构为:[@HumDropItem]#IFCHECKCASTLEWARAREA沙巴克#ACTStopDropItemBreak。

需要清楚的是,@HumDropItem是在物品掉落动作已经发生后触发的,StopDropItem的作用是“把已经掉出去的物品收回来”,而不是“在掉落判定之前阻止掉落”。这个区别在单件装备触发时没有影响,但在一次死亡掉落多件装备的场景下,每一件都会独立触发一次@HumDropItem,StopDropItem只对触发它的那一件生效。

**爆率文件触发(掉落前拦截)**

另一种拦截方式不走@HumDropItem,而是在爆率文件的掉落判定阶段就介入。在爆率文件中使用#CHILDRANDOM结构,配合带条件判断的触发标签,可以在物品被判定掉落之前就决定是否允许掉落。示例写法为:#CHILD1/1RANDOM[条件@触发标签]。在触发标签中用equal<$CURITEMNAME>判断当前判定掉落的是不是目标装备,如果是则继续执行条件检测,满足条件时用break中断掉落判定,物品不会掉落;不满足条件时正常掉落。

这种方式的优势在于拦截发生在掉落判定阶段,被拦截的物品从未进入“已掉落”状态,不会产生任何地面物品或日志记录。适合对拦截精度要求高的场景,比如只保护某一件特定装备,其他装备完全不受影响。缺点是需要修改爆率文件,且<$CURITEMNAME>变量在爆率文件触发中的支持情况取决于引擎版本,配置前需要确认当前引擎是否支持该变量。

##投保次数机制的脚本实现

投保次数机制是一种介于“永久绑定防爆”和“完全无保护”之间的方案。玩家为装备投保后获得一定次数的防爆保护,每次死亡掉落时消耗一次投保次数,次数耗尽后装备恢复正常掉落。

数据库层面需要在StdItems.DB中添加InsuranceGold和InsuranceCurrency两个字段。InsuranceGold设置大于0时登录器才会显示该装备的投保状态。InsuranceCurrency控制保金类型:0元宝、1金币、2泡点、3金刚石、4灵符。

脚本命令方面,SETINSURANCECOUNTXX用于设置投保次数,格式为:SETINSURANCECOUNTXX装备位置操作符数值。GETINSURANCECOUNTXX用于读取当前投保次数。英雄的投保次数使用H.SETINSURANCECOUNTXX和H.GETINSURANCECOUNTXX。

人物死亡掉落投保装备时触发@DropInsuranceItem标签,英雄触发@HeroDropInsuranceItem。在触发中可以通过$DROPINSURANCEITEMNAME获取当前投保物品名称,通过$DROPINSURANCEITEMCOUNT获取剩余投保次数。当投保次数大于0时,引擎自动执行保护,物品不掉落,次数减1;次数为0时物品正常掉落,触发逻辑不再拦截。

攻沙期间临时投保的实现思路是:攻城开始时通过脚本检测玩家佩戴的装备并赋予投保次数,攻城结束后清除所有投保次数,包括在线玩家和之后登录的玩家。这种方案的好处是不需要永久修改装备的绑定状态,只在需要的时间段内生效。

##SetNoDropItemCount全局保护命令

部分引擎提供了SetNoDropItemCount命令,用于设置死亡不掉落装备的全局次数。命令格式为:SetNoDropItemCount操作符次数下线是否保存爆出选项。爆出选项填0表示身上和背包都不爆出,填1表示仅身上装备不爆出。

示例脚本:SetNoDropItemCount=511,表示为玩家设置5次死亡保护,下线后保存设置,仅保护身上装备。之后每次死亡消耗1次,5次用完后恢复正常掉落。用GetNoDropItemCount读取剩余次数和保存状态。英雄的对应命令为H.SetNoDropItemCount和H.GetNoDropItemCount。

这种方式适合做活动期间的临时防爆,或者作为新手的死亡保护福利,比逐件设置装备绑定要轻量得多。但它的保护范围是玩家身上所有装备,无法做到“只保护某一件”的精细化控制。

##常见配置错误与排查要点

@HumDropItem不触发的首要原因是列表信息二中的物品规则没有勾选。这个标签只对勾选了掉落触发的物品生效,未勾选的物品死亡掉落时不会调用@HumDropItem,脚本中写再多逻辑也不会执行。配置新装备防爆脚本时,第一步就是去列表信息二中确认目标物品的掉落触发已勾选。

StopDropItem在@HumDropItem中执行无效的情况,通常是因为触发时机理解错误。如果引擎的@HumDropItem是在物品已经掉落到地面之后才触发,StopDropItem无法将其收回。排查时可以先在@HumDropItem中加一条SENDMSG5输出<$CurItemName>,观察输出内容中是否包含目标装备名称。如果输出正常但装备仍然掉地,说明StopDropItem在当前引擎的@HumDropItem中的执行效果不符合预期,需要改用爆率文件触发方式或投保次数方案。

SetItemState项目编号填错是绑定防爆失败的常见原因。GOM填5正确,GEE填5对应的是“禁止打出”而非“禁止爆出”,如果GEE引擎下写了SetItemState051但装备仍然会掉落,需要检查引擎文档确认当前版本的项目编号表。不同引擎版本对项目编号的定义存在差异,复制脚本时不能只改装备位置而不核对项目编号。

CheckItemState和SetItemState的参数顺序不能搞反。CheckItemState的第一个参数是装备位置,第二个是项目编号。如果写成CheckItemState50,引擎会去检测“位置5的装备的项目0(禁止扔)是否绑定”,而不是“位置0的装备的项目5(禁止爆出)是否绑定”。位置编号和项目编号混淆是新手写脚本时最常见的错误。
[顶部]