判断背包内物品GetBagItemInfo问题
写了一个回收普通装备但是检测到属性为极品(加攻,加魔等额外附加属性)则跳过的脚本,在调试时出错。
有技术人佬可以帮忙解决一下嘛,谢谢了!
翎风引擎版本:V4.00,传奇客户端:十六周年,服务端版本:基于1.76上修改的扩展背包(主背包10*10,扩展背包10*10)和大仓库的版本。
2025-06-15 星期日 18:26:29 脚本错误: GetBagItemInfo P0 S$ItemName N$ItemCount I$ItemType S$ItemAttr I$ItemID I$Looks 第:12 行: D:\MirServer\Mir200\Envir\Market_Def\盟重城\测试回收-3.txt
2025-06-15 星期日 18:26:29 脚本错误: CONTINUE; 跳过后续处理 第:29 行: D:\MirServer\Mir200\Envir\Market_Def\盟重城\测试回收-3.txt
执行的时候报错
2025-06-15 星期日 18:27:36 [脚本死循环] NPC:测试回收 命令: WHILE P0 < 46
有几个问题:
1、GetBagItemInfo在翎风引擎中是几个参数,从哪里可以查询出GetBagItemInfo命令的使用模板;
此处试过5参数,也试过GetExtBagItemInfo命令都是一样的报错。命令格式自身是否正确,错误是因为和版本相关?
2、CONTINUE报错没有看懂是什么原因。
调用的脚本如下:
[@AdvancedRecycle1]
{
#IF
#ACT
MOV P0 0 ; 初始化背包位置计数器
MOV D0 0 ; 初始化回收计数器
; 定义极品属性标准(属性中只要有一项大于1则认为是极品)
MOV D2 1 ; 单条属性值≥2视为极品
MOV N0 0 ; 初始化物品属性计数(0-攻击,1-魔法,2-道术,3-防御,4-魔御,5-准确,6-敏捷,7-幸运,8-诅咒,9-攻速,10-强度,11-魔法恢复,12-生命恢复)
WHILE P0 < 46 ;暂定46个位置,后续再调大
GetBagItemInfo P0 S$ItemName N$ItemCount I$ItemType S$ItemAttr I$ItemID I$Looks
MOV D2 0
MOV N0 0
WHILE N0 < 11
#IF
CheckItemAddValueEx P0 N0 > 1
#ACT
INC D2 1
INC N0 1
#ELSEACT
INC N0 1
ENDWHILE
; 判断是否为极品
#IF
LARGE D2 0
#ACT
INC P0 1
CONTINUE
; 正常回收流程(只回收在装备列表中的物品,1/3价格回收)
#IF
CHECKTEXTLIST ..\QuestDiary\城市商人\普通装备.txt S$ItemName
#ACT
GetDBItemFieldValue <$STR(S$ItemName)> price <$STR(N$商店价格)>
div N$商店价格 3
TakeBagItem S$ItemName 1 P0
GIVE 金币 <$STR(N$商店价格)>
INC D0 1
INC P0 1
#ELSEACT
INC P0 1
ENDWHILE
SendMsg 3 玩家 <$USERNAME> 共回收 <$STR(D0)> 件普通装备!
}
GetBagItemInfo没见过这个命令呢 请问一下,是使用哪个命令获取当前背包中指定位置(第几格)物品信息呢? 用引擎自带的回收命令! 基本语法
GetBagItemInfo 背包位置 变量前缀
参数说明
• 背包位置: 0-45 (标准版),有些扩展版本可能支持更多位置
• 变量前缀: 用于存储物品信息的变量前缀
返回值
该命令会将物品信息存入以下变量中:
<变量前缀>.Name - 物品名称
<变量前缀>.StdMode- 物品类型
<变量前缀>.Shape - 物品外观(Shape)
<变量前缀>.Weight - 物品重量
<变量前缀>.AniCount - 动画计数
<变量前缀>.Source - 来源
<变量前缀>.Reserved - 保留字段
<变量前缀>.Looks - 外观
<变量前缀>.DuraMax- 最大持久
<变量前缀>.Dura - 当前持久
<变量前缀>.DC - 攻击力
<变量前缀>.MC - 魔法力
<变量前缀>.SC - 道术力
<变量前缀>.AC - 防御力
<变量前缀>.MAC - 魔防力
<变量前缀>.Need - 需求
<变量前缀>.NeedLevel- 需求等级
<变量前缀>.Price - 价格
<变量前缀>.Stock - 库存
使用示例
示例1:检查背包第5格的物品
GetBagItemInfo 5 <Item>
SendMsg 5 你查看了背包第5格的物品:<$STR(
<Item.Name>
)>
SendMsg 5 攻击力:<$STR(
<Item.DC>)> 防御力:<$STR(<Item.AC>)>
示例2:检查物品是否存在
GetBagItemInfo 3 <Temp>
IfEqual
<Temp.Name>
""
SendMsg 5 背包第3格没有物品
Else
SendMsg 5 背包第3格物品是:<$STR(<Temp.Name>)>
EndIf
注意事项
1. 背包位置从0开始计算
2. 如果指定位置没有物品,所有相关变量将被清空
3. 不同版本的翎风引擎可能有细微差别
4. 使用前最好先检查物品是否存在(通过Name是否为空判断)
需要更具体的帮助或针对特定版本的说明,请提供您使用的翎风引擎具体版本信息。 已发现的问题
1. 变量使用问题
D2变量在循环内被重复初始化(MOV D2 0),但在极品判断后又使用了LARGE D2 0,逻辑正确但可能混淆
N$商店价格变量在使用前未确保已被赋值,如果物品不在数据库会导致错误
2. 循环逻辑问题
内层属性检查循环(WHILE N0 < 11)没有处理N0递增的异常情况
CONTINUE命令在某些翎风引擎版本中可能不支持
3. 物品操作问题
TakeBagItem命令在物品已被移动或不存在时可能导致脚本卡住
没有检查N$ItemCount(物品数量)就直接回收1件
4. 路径问题
文件路径..\QuestDiary\城市商人\普通装备.txt使用反斜杠,在某些翎风引擎版本中可能需要改为正斜杠
修复建议
修正后的脚本
复制
[@AdvancedRecycle1]
{
#IF
#ACT
MOV P0 0 ; 背包位置计数器(0-45)
MOV D0 0 ; 成功回收计数器
MOV D1 0 ; 极品装备计数器
MOV D2 0 ; 其他装备计数器
; 定义回收比例(1/3)
MOV N$回收比例 3
WHILE P0 < 46
; 获取物品信息
GetBagItemInfo P0 S$ItemName N$ItemCount I$ItemType S$ItemAttr I$ItemID I$Looks
; 跳过空位
#IF
EQUAL S$ItemName ""
#ACT
INC P0 1
GOTO @AdvancedRecycle1_Continue
; 检查物品数量是否有效
#IF
SMALL N$ItemCount 1
#ACT
INC P0 1
GOTO @AdvancedRecycle1_Continue
; 极品属性检查(11种属性)
MOV N0 0 ; 属性索引
MOV D3 0 ; 极品标记(0=普通, 1=极品)
WHILE N0 < 11
#IF
CheckItemAddValueEx P0 N0 > 1
#ACT
MOV D3 1
BREAK
#ELSEACT
INC N0 1
ENDWHILE
; 处理极品装备
#IF
EQUAL D3 1
#ACT
INC D1 1
INC P0 1
GOTO @AdvancedRecycle1_Continue
; 检查是否在回收列表
#IF
CHECKTEXTLIST ../QuestDiary/城市商人/普通装备.txt S$ItemName
#ACT
; 获取物品价格
GetDBItemFieldValue <$STR(S$ItemName)> price N$商店价格
#IF
LARGE N$商店价格 0
#ACT
; 计算回收价格
DIV N$商店价格 N$回收比例
; 尝试回收物品
#IF
TakeBagItem S$ItemName 1 P0
#ACT
GIVE 金币 <$STR(N$商店价格)>
INC D0 1
#ELSEACT
; 回收失败处理
SendMsg 5 [错误] 回收<$STR(S$ItemName)>失败!
#ELSEACT
; 不在回收列表中
INC D2 1
@AdvancedRecycle1_Continue
INC P0 1
ENDWHILE
; 结果反馈
SendMsg 3 玩家 <$USERNAME> 回收完成!
SendMsg 3 成功回收: <$STR(D0)>件普通装备
SendMsg 3 跳过处理: <$STR(D1)>件极品装备 | <$STR(D2)>件其他装备
}
关键改进点
增强的变量管理
明确区分计数器用途(D0/D1/D2)
添加临时变量D3专门用于极品判断
完善的错误处理
添加物品数量检查
处理TakeBagItem可能失败的情况
增加回收价格有效性检查
更健壮的循环控制
使用GOTO替代可能不兼容的CONTINUE
确保循环变量正常递增
更详细的反馈
区分普通装备、极品装备和其他装备
提供回收失败的具体提示
路径兼容性
将反斜杠路径改为正斜杠,提高兼容性
建议在实际使用前,先在测试环境验证此脚本,确保与您的翎风引擎版本完全兼容。如果需要针对特定版本调整,请提供更详细的引擎版本信息。
页:
[1]