概览
ExtraBackpack 额外背包模块功能概览
ExtraBackpack 额外背包
模块简介
ExtraBackpack 是 Suite 的随身扩容背包模块,通过 ArcartX UI 替换原版物品栏界面。它不再持有独立存储——所有物品直接读写玩家个人仓库(WarehouseAccess capability),背包 UI 与仓库 UI 是同一存储的两个入口:背包里存的、取的,仓库里立即可见,反之亦然。
分类页(装备/材料/杂物等)是仓库内容的过滤器而非独立存储:每页显示匹配该页规则的仓库槽位 + 剩余空格;空格写入经仓库自动分配。携物点击空格时执行严格分类匹配——命中规则的物品只能进对应页签,无命中的只能进兜底页签。
容量 = 个人仓库已解锁格数(base-slots + 逐格购买的 extra_slots),槽位价格与上限统一由仓库配置(ArcartXWarehouse.yml 的 warehouses.personal)。销毁光标物品需二级密码验证,由核心统一管理。
| 属性 | 值 |
|---|---|
| 模块 ID | extrabackpack |
| 版本 | 1.4.4 |
| 配置版本 | 2(当前 schema) |
| 配置文件 | config.yml、messages.yml |
| UI 文件 | ui/extrabackpack.yml |
| 通信包 ID | AXS_BACKPACK |
| 命令入口 | 管理 /axs extrabackpack(无玩家命令,UI 替换原版物品栏) |
| 外部依赖 | ArcartX(必需) |
| 模块依赖 | Warehouse(软依赖,容量与物品共用仓库存储) |
| 对外能力 | ExtraBackpackAccess(背包数据快照)、PlayerDataPurgeable、DatabaseMigratable |
功能特性
| 功能 | 说明 |
|---|---|
| 共通存储 | 物品直接存于玩家个人仓库,背包 UI 与仓库 UI 是同一存储的两个入口 |
| 分类页过滤 | 页签是仓库内容的过滤器:显示匹配规则的槽位 + 剩余空格,支持严格放入校验 |
| 原版背包共存 | UI 替换原版物品栏界面,原版背包与快捷栏作为原生槽位保留 |
| NBT 自动归类 | 根据物品 NBT/PDC 路径匹配规则判定物品归属页签,支持 pdc:、material、display-name、lore 等多种路径 |
| 兜底分类 | 未匹配任何分类规则的物品归入标记为 default 的兜底页签 |
| 付费解锁槽位 | 容量 = 仓库已解锁格数,逐格购买,价格统一走仓库 slot-price 配置;背包与仓库 UI 双入口均可购买 |
| 快捷栏交互 | UI 底部展示原版快捷栏 9 格,点击可将快捷栏物品存入额外背包 |
| 原版物品管理 | 原版标签页支持查看物品信息、存入额外背包、销毁物品(需二级密码验证) |
| 二级密码保护 | 销毁原版背包物品需通过核心二级密码验证,支持设置/解锁/清除密码 |
| 操作令牌防重放 | UI 操作携带 action token,防止重放攻击与并发冲突 |
| 持久化存储 | 支持 SQLite/MySQL 双方言,共享存储模式与自建存储模式 |
| 数据迁移 | 支持 /axs migrate 跨数据库源迁移,支持 /axs purge 按玩家/全量清除数据 |
依赖表
| 依赖 | 类型 | 说明 |
|---|---|---|
| ArcartX 客户端 MOD | 硬依赖 | 提供 UI 渲染与 PacketBridge,背包界面通过 ArcartX UI 呈现 |
| ArcartXSuite 核心 | 硬依赖 | 提供 PacketBridge、ItemBridge、CurrencyBridge、PacketGuard、VanillaItemNameBridge 等桥接服务 |
| 可选依赖 | 类型 | 说明 |
|---|---|---|
| Warehouse | depends | descriptor 声明 depends: [warehouse]——存储后端即玩家个人仓库,经 WarehouseAccess capability 读写槽位/解锁/购买;Warehouse 缺席则模块无存储后端 |
ExtraBackpack 模块本身不依赖任何外部插件(无
external-depends),货币系统通过核心CurrencyBridgeAPI统一桥接(支持 Vault/PlayerPoints/XConomy 等)。
背包机制详解
UI 界面替换
ExtraBackpack 模块注册一套 ArcartX UI 界面(UI ID AXS:extrabackpack),通过 match: [物品栏界面] 替换原版物品栏界面。玩家打开原版背包时自动呈现额外背包 UI,无需额外命令触发。
UI 界面结构:
| 区域 | 说明 |
|---|---|
| 标题栏 | 显示"额外背包"标题与容量状态文本(如 9/27) |
| 刷新按钮 | 手动刷新 UI 数据 |
| 分类标签行 | 横向排列的分类标签(含原版背包标签 + 各分类页标签),点击切换 |
| 背包网格 | 12 列网格,动态创建槽位控件,展示当前分类页物品 |
| 购买卡片 | 显示扩容提示文本、数量输入框与购买按钮 |
| 快捷栏卡片 | 展示原版快捷栏 9 格,点击存入额外背包 |
| 物品信息面板 | 原版标签页中点击物品时显示物品信息 |
| 物品操作面板 | 原版标签页中右键物品时显示存入/销毁选项 |
| 销毁确认框 | 销毁物品前的二次确认弹窗 |
| 二级密码面板 | 设置/解锁/清除二级密码的弹窗面板 |
分类匹配规则
物品分类依据 ExtraBackpackCategory 的 NBT 匹配规则,由模块自行判断。匹配流程:
- 遍历所有分类(按
priority升序),跳过兜底分类与无匹配规则的分类 - 对每个分类,根据
nbt.path读取物品对应值,检查是否在nbt.values列表中 - 首个匹配成功的分类即为物品归属页签(该物品只在该页签的过滤视图中显示,且只能放入该页签)
- 若无匹配,物品归入兜底页签——存储层面不分家,所有物品都在同一个人仓库里
支持的 NBT 路径类型:
| 路径 | 说明 | 示例 |
|---|---|---|
pdc:<namespace>:<key> | 读取 PersistentDataContainer 字符串值 | pdc:arcartx:item_category |
pdc:<key> | 读取 PDC 值,namespace 默认为插件名 | pdc:category |
material | 读取物品材质 ID(经 VanillaItemNameBridge 翻译为中文名) | material |
display-name / name | 读取物品显示名称 | display-name |
custom-model-data | 读取 CustomModelData 整数值 | custom-model-data |
lore | 遍历物品 Lore 行,检查是否包含匹配值 | lore |
匹配值与路径值均做
trim().toLowerCase()归一化处理。lore路径使用contains匹配,其余路径使用精确匹配。
存储模型
额外背包不持有独立存储:所有槽位操作经 WarehouseAccess 直写玩家个人仓库(warehouse_slots 表,owner_type=personal),持久化、并发锁与崩溃恢复全部由仓库模块负责。本模块仅维护打开 UI 期间的过滤视图:
存入流程(UI 拖动):
- 玩家把物品放入某格子,ArcartX 原生完成放置并触发槽位更新事件
- 已占用格(映射 ≥0)→
setSlot(仓库索引, 物品)覆写仓库记录 - 空格(映射 -1)→
deposit()由仓库合并同类/分配空位 - 写库完成后重建过滤视图并回推槽位
存入流程(API / 拾取兜底):直接 warehouse.deposit(),仓库先合并同类堆叠再填空格。
取出流程:取出即 setSlot(索引, null) 删除仓库记录;API 取出按「页签过滤序号 → 仓库索引」映射后调用 withdraw()。
容量与扩容
容量 = 个人仓库已解锁格数,与仓库完全共通:
- 初始
base-slots(默认 32),上限max-slots(默认 999) - 玩家在背包设置面板或仓库 UI 左栏点击「+1 格」按钮逐格购买,价格由仓库
slot-price决定 - 每次购买
extra_slots + 1,立即生效并刷新两边视图
分类页配置中的 slots.initial / price 字段已弃用(保留解析以兼容旧配置,不再生效);slots.max 语义变为「该页网格显示上限」,应 ≥ 仓库 max-slots。
操作令牌机制
UI 打开时签发唯一的 action token,客户端在执行购买槽位、销毁物品、设置/清除二级密码等敏感操作时需携带有效 token。操作完成后自动轮换 token,防止重放攻击。UI 关闭时清除 token 并持久化数据。