Files
metin2-client/docs/AVA2-CHEST.md
T
2026-10-15 23:47:50 +09:00

4.3 KiB
Raw Blame History

AVA2 批量开箱适配进度(v1)

2026-10-15。修改了 metin2-client 和 metin2-server,AVA2 代码只作参考(ENABLE_MULTI_CHEST:uiinventory.py 的 Ctrl + 右键、uichestdropinfo.py、服务端 do_chest_drop / CHARACTER::OpenChest)。服务端规则和协议见 metin2-server/docs/FEATURE-CHEST.md。

与 AVA2 的差异

项目 AVA2 本实现
触发 Ctrl + 右键打开带滑块的窗口;Ctrl + Z + 右键直接开整叠 Ctrl + 右键打开数量窗口(1 / 10 / 50 / 全部),点“开启”;没有直接开整叠的组合键
命令 /chest_drop WINDOW CELL COUNT /mt_chest 1 open CELL COUNT,不新增包头
开箱过程 重写的 GiveItemFromSpecialItemGroupNew / AutoGiveItemChest,单次最多 1000 每个礼盒都调用原 UseItem 礼盒路径,检查、奖励组抽取、金币/经验、日志、扣除都不变;单次最多 200
范围 一叠 同一种礼盒,先开选中的格子,再开背包里其他格子(203 上多数礼盒不叠加)
背包满 由 AutoGiveItemChest 处理 每开一个前要求至少 3 格空位,不足就停止,奖励不会掉在地上
不允许批量 — 奖励组含刷怪、怪物组、减速、中毒、吸血的礼盒,以及非 ITEM_GIFTBOX 的物品(例如带任务脚本的宝箱)

客户端

  • 模块 mt_chest(src/platform/ScriptLib/ChestScript.inc),在 PythonBoot.cpp 中安装。替换了 uiInventory.InventoryWindow.UseItemSlot:按住 Ctrl 右键 ITEM_GIFTBOX 时打开窗口,其他情况调用原方法。原方法本身不使用 Ctrl(联机时检查过它的 co_names)。
  • PythonItemModule.cpp 新导出 item.ITEM_TYPE_GIFTBOX。
  • 窗口显示礼盒名称、背包内总数、数量按钮(【】 表示已选;“全部”最多 200)、开启按钮和上次结果。选中格子里的礼盒被移走时,自动改用背包里同一种礼盒的其他格子。
  • 等待回复时,以及两次发送间隔不足 0.5 秒时,“开启”按钮不可用。
  • 结果:聊天框一行“开启 N 个,金币 +N(停止原因)”,之后每行最多 5 种获得的物品(名称 ×数量)。单个礼盒的提示由服务端暂存,不再逐条刷屏;被原路径拒绝时转发一次拒绝提示。
  • 3 秒没有回复:在聊天框提示一次“服务器尚未启用批量开启”,之后 Ctrl + 右键也走原来的单个使用;再收到回复会自动恢复。
  • 经验不在汇总里(服务端只汇报背包物品和金币变化)。

证据

  • tests/wiki/test_chest.py(CTest:port.chest)共 6 项通过,覆盖:
    • 发送一次、等待回复、获得行累积到 done、数量上限 200、负的金币差、发送间隔;
    • error 解析,畸形行和其他前缀;
    • 超时后标记不支持,迟到的回复会恢复;
    • 聊天汇总行(停止原因、金币、每行 5 种);
    • 钩子:不按 Ctrl 和非礼盒走原方法,Ctrl + 右键礼盒打开窗口,“全部”,选中格子消失后改用其他格子,命令拦截,超时后回退,窗口关闭;
    • 与服务端 port_chest.h 的常量、错误码和停止原因一致。
  • tests/wiki 全部 57 项通过(1 项跳过)。
  • 2026-10-15 在 203 channel5 测试核心(13040,独立二进制)用 macOS 客户端以 [SA]Admin 联机验收,礼盒用 /item 生成:
    • 50037(可叠加,30 个)开 10 个:done 50037 10 10 done 0,获得 6 种物品,背包差值与 MTCH1 got 完全一致;
    • 50070(不叠加,4 个分在 4 格)开全部:done 50070 4 4 done 100000,跨格子全部开启,金币 +100000 与余额变化一致;
    • 71036(奖励组刷怪):error kind,没有扣除;
    • 连发两条命令:第二条 error rate;
    • 50037 剩余 20 个开全部:done 50037 20 20 done 0,获得 11 种;
    • 不按 Ctrl 右键:原单个使用,礼盒正常扣除;
    • 日志库只有原路径写的 SYSTEM、TREASURE_EXP、TREASURE_GOLD 行;syserr 没有新错误(只有原有的 new_quest_lv52 LUA_ERROR)。
  • 2026-10-15 16:43 部署到 203 正式环境(服务端 bc32475),CH1(13000)用同一场景复验通过(50037 开 10 个 / 剩余 20 个、50070 跨 4 格、71036 拒绝、限速、普通右键不变)。
  • 未做 Android 真机测试;触屏没有 Ctrl,暂无触屏入口。