- GameType.h: c_Inventory_Page_Count 2 -> 5; SQuickSlot.Position BYTE -> WORD - quickslot 包/接口 pos 改为 WORD(CG/GC 5 字节),wire_classic 同步 - mt_inventory PORT 模块:inventorywindow.py 装备格 90 -> EQUIPMENT_SLOT_START 重映射、5 个小页签、 自动药水高亮与 SelectItemWindow 扫描全部 5 页;40250 脚本保持不变 - tools/server/inventory-5-pages: server.patch(格子布局 +135、quickslot WORD)、migrate_db.py、README Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
背包 5 页(服务端)
40250 背包是 2 页 × 45 格(INVENTORY_MAX_NUM = 90)。本补丁改为 5 页 225 格,客户端对应改动见
src/port/UserInterface/GameType.h(c_Inventory_Page_Count)和 src/platform/ScriptLib/InventoryPagesScript.inc。
格子布局
| 区段 | 40250 | 5 页 |
|---|---|---|
| 背包 | 0..89 | 0..224 |
| 穿戴(32) | 90..121 | 225..256 |
| 龙魂装备(12) | 122..133 | 257..268 |
| 龙魂预留(18) | 134..151 | 269..286 |
| 腰带背包(16) | 152..167 | 287..302 |
背包之后的格子整体 +135,超过 255,所以 TQuickslot.pos 从 BYTE 改成 WORD(快捷栏封包变成 5 字节,
player.quickslot 从 72 字节变成 108 字节)。旧客户端不兼容,必须和新客户端一起上线。
文件
server.patch:对 40250src/server的改动(common/length.h、common/tables.h、game/src里把格子号存成 BYTE 的地方、exchange.cpp的每页空间检查)。在/usr/metin2/src下patch -p1 < server.patch。源码是 EUC-KR + CRLF,补丁按字节保存。migrate_db.py:DB 迁移,停服后运行一次(python3.9 migrate_db.py [--dry-run] [mysql 参数],默认-uroot player)。 腰带物品(window='INVENTORY'且pos152..167)+135;player/player_deleted的quickslot转成 WORD 布局, 指向腰带格的物品快捷栏同样 +135。结果记入mt_migration表,重复运行不会再改。穿戴/龙魂装备按 EQUIPMENT 窗口的相对位置存,不受影响。
构建与部署(203,FreeBSD 13.2 i386)
Makefile 默认把二进制移到 share/bin(线上正在用),构建时要改输出目录:
cd /usr/metin2/src/server/game/src && gmake -j2 GAMEDIR=/root/inv5-out/new
cd ../../db/src && gmake -j2 DBDIR=/root/inv5-out/new
部署顺序:close.sh → 备份 player 库 → migrate_db.py → 覆盖 share/bin/{game,db} → echo 1 | sh start.sh。
auth 用的也是 game 二进制;TPlayerTable 含快捷栏数组,所以 game 和 db 必须一起换。
2026-09-29 已在 203 部署。备份在 /root/backup-inv5/(源码 tgz、原 game/db、迁移前的 player 库)。回滚:停服,恢复这三样。