传奇鉴定脚本物品叠加问题解决方法

来源: 作者: 点击:
在传奇服务端脚本中,使用鉴定功能时若未正确处理物品唯一性或背包检测逻辑,会导致多次鉴定后物品不断叠加。该问题常见于GOM、HERO等引擎,核心原因在于脚本未校验目标格子是否已有同类物品,或未清空原道具状态。

一、问题复现条件

当玩家对一件装备执行鉴定操作后,脚本直接发放新物品而不移除原装备,或在背包存在同名物品时继续追加数量,就会出现叠加。例如:
原始装备“未鉴定的裁决”(ItemIndex=1001)
鉴定后应变为“裁决之杖”(ItemIndex=2001)
若脚本仅执行GIVE 2001 1而未删除1001,则背包同时存在两件武器
多次鉴定同一装备,2001数量持续增加

二、正确处理流程

标准鉴定脚本需包含三个步骤:校验来源物品 → 删除原物品 → 发放鉴定后物品。

以GOM引擎为例,在QFunction.txt中编写:

[@鉴定装备]
IF
CHECKITEM 1001 1
ACT
TAKE 1001 1
GIVE 2001 1
SENDMSG 7 鉴定成功,获得裁决之杖。
BREAK
ELSEACT
SENDMSG 7 背包中没有可鉴定的装备。
CLOSE

关键命令说明:
CHECKITEM 1001 1:确认背包存在至少1个ItemIndex为1001的物品
TAKE 1001 1:精确扣除1个该物品,避免数量错误
GIVE 2001 1:发放鉴定后的新物品

三、防止同名物品合并

部分引擎默认将相同ItemIndex的物品堆叠。若鉴定后物品与背包已有装备ID一致,会自动累加数量。解决方法:
确保鉴定前后ItemIndex不同
未鉴定装备与已鉴定装备必须使用独立ID,不可共用。
设置物品不可堆叠属性
在StdItems.db中将“裁决之杖”的“堆叠上限”设为1,避免系统自动合并。

四、处理多格背包场景

若玩家背包存在多个未鉴定装备,需指定操作对象。可通过以下方式限定:
使用CHECKBAGITEMEX配合格子索引(如第5格)
弹出选择界面,让玩家点击具体装备(需配合客户端支持)

示例(限定第一格):

IF
CHECKBAGITEMEX 0 1001
ACT
DELITEMBAGEX 0
GIVE 2001 1

其中0表示背包第0格(从0开始计数),DELITEMBAGEX精准删除该格物品。

五、日志追踪与调试

在脚本中加入日志记录,便于定位叠加源头:

LOGGING 鉴定操作: 尝试鉴定1001
IF
CHECKITEM 1001 1
ACT
LOGGING 鉴定成功: 获得2001
TAKE 1001 1
GIVE 2001 1

通过查看MirServerLog目录下的日志文件,可确认是否重复触发GIVE命令。

六、常见错误写法

错误1:仅判断物品名称而非ID
IF
CHECKNAMEITEM 裁决

→ 名称可能重复,应使用唯一ItemIndex。

错误2:未使用TAKE直接GIVE
ACT
GIVE 2001 1

→ 原始装备未移除,必然导致叠加。

错误3:批量扣除导致负数
TAKE 1001 999

→ 应严格按实际数量扣除,避免背包数据异常。

七、验证方法

清空背包,放入1个未鉴定装备
执行鉴定脚本
检查背包是否仅剩1个已鉴定装备
重复操作,确认不再新增物品

若仍出现叠加,检查是否存在多个脚本入口(如NPC对话、快捷指令)同时触发鉴定逻辑,需统一调用单一处理分支。

通过规范物品ID管理、严格执行“先删后给”流程,并结合背包格子控制,可彻底解决鉴定脚本物品叠加问题。核心原则是确保每次操作只处理一件装备,且新旧物品无ID冲突。