rickky_1 发表于 昨天 18:45

判断背包内物品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)> 件普通装备!
}

mihu7456 发表于 昨天 20:27

GetBagItemInfo没见过这个命令呢

rickky_1 发表于 昨天 21:26

请问一下,是使用哪个命令获取当前背包中指定位置(第几格)物品信息呢?

hi8 发表于 昨天 21:56

用引擎自带的回收命令!

wangzun 发表于 5 小时前

基本语法

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是否为空判断)
需要更具体的帮助或针对特定版本的说明,请提供您使用的翎风引擎具体版本信息。

wangzun 发表于 5 小时前

已发现的问题
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]
查看完整版本: 判断背包内物品GetBagItemInfo问题