Suite

概览

ExtraBackpack 额外背包模块功能概览

ExtraBackpack 额外背包

模块简介

ExtraBackpack 是 Suite 的额外槽位背包模块,通过 ArcartX UI 替换原版物品栏界面,为玩家提供多分类额外背包空间。模块默认关闭,启用后与玩家原版背包共存——原版背包作为首个标签页保留,额外分类页(装备/材料/杂物等)作为后续标签页展示,每页独立配置槽位数量、上限与付费扩容价格。

物品分类基于 NBT/PDC 路径匹配规则,由模块自行判断。玩家拾取物品时可自动归类存入对应分类页,也可在 UI 中手动存取。扩容通过货币付费实现,支持多货币类型。销毁原版背包物品需二级密码验证,由核心统一管理。

  • 模块 IDextrabackpack
  • 版本:1.4.4
  • 配置版本:2(当前 schema)
  • 源码主类xuanmo.arcartxsuite.extrabackpack.ExtraBackpackModule
  • 配置文件config.yml
  • 消息文件messages.yml
  • UI 文件ui/extrabackpack.yml
  • 通信包 IDAXS_BACKPACK

功能特性

功能说明
多分类额外背包支持装备/材料/杂物等多个分类页,每页独立配置初始槽位、最大槽位与扩容价格
原版背包共存UI 替换原版物品栏界面,原版背包作为首个标签页保留,额外分类页作为后续标签页
NBT 自动归类根据物品 NBT/PDC 路径匹配规则自动归类到对应分类,支持 pdc:materialdisplay-namelore 等多种路径
兜底分类未匹配任何分类规则的物品自动归入标记为 default 的兜底分类页
拾取自动存入玩家拾取物品时自动按分类规则存入额外背包,放不下的部分保留在原版背包
付费扩容每个分类可配置独立的扩容货币与单价,玩家在 UI 中输入数量购买槽位
快捷栏交互UI 底部展示原版快捷栏 9 格,点击可将快捷栏物品存入额外背包
原版物品管理原版标签页支持查看物品信息、存入额外背包、销毁物品(需二级密码验证)
二级密码保护销毁原版背包物品需通过核心二级密码验证,支持设置/解锁/清除密码
操作令牌防重放UI 操作携带 action token,防止重放攻击与并发冲突
持久化存储支持 SQLite/MySQL 双方言,共享存储模式与自建存储模式
数据迁移支持 /axs migrate 跨数据库源迁移,支持 /axs purge 按玩家/全量清除数据

依赖表

依赖类型说明
ArcartX 客户端 MOD硬依赖提供 UI 渲染与 PacketBridge,背包界面通过 ArcartX UI 呈现
ArcartXSuite 核心硬依赖提供 PacketBridge、ItemBridge、CurrencyBridge、PacketGuard、VanillaItemNameBridge 等桥接服务
可选依赖类型说明
Warehousesoftdependmodule.yml 声明 softdepends: [warehouse](加载顺序在 Warehouse 之后);同时本模块注册 ExtraBackpackAccess 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 匹配规则,由模块自行判断。匹配流程:

  1. 遍历所有分类(按 priority 升序),跳过兜底分类与无匹配规则的分类
  2. 对每个分类,根据 nbt.path 读取物品对应值,检查是否在 nbt.values 列表中
  3. 首个匹配成功的分类即为物品归属分类
  4. 若无匹配,物品不自动归类(拾取时不存入额外背包)

支持的 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 匹配,其余路径使用精确匹配。

存储模型

额外背包采用分类分页存储模型,核心数据结构为 ExtraBackpackSlotRecord

extra_backpack_slots 表
├── player_uuid: 玩家 UUID
├── category_id: 分类标识
├── slot: 槽位序号(从 0 开始)
├── item_data: Base64 序列化物品数据
├── updated_at: 更新时间戳(毫秒)

extra_backpack_capacity 表
├── player_uuid: 玩家 UUID
├── category_id: 分类标识
├── capacity: 当前容量(槽位数)
├── updated_at: 更新时间戳(毫秒)

内存模型:每位玩家在内存中维护 Map<String, ItemStack[]>(分类 ID → 槽位物品数组),数组长度即当前容量。玩家上线时从数据库加载,退出时持久化。

存入流程

  1. 根据 NBT 匹配规则确定物品分类
  2. 在对应分类页中先尝试合并到相同物品的槽位(受 maxStackSize 限制)
  3. 剩余物品写入空闲槽位
  4. 放不下的部分返回原版背包或掉落

取出流程

  1. 物品优先放入快捷栏 0-8 格
  2. 快捷栏放不下的部分掉落在玩家脚下

容量与扩容

每个分类定义包含初始槽位与最大槽位:

categories:
  equipment:
    slots:
      initial: 9    # 初始槽位数
      max: 27       # 最大槽位上限
    price:
      currency: "points"  # 扩容货币
      per-slot: 100       # 每个槽位价格

玩家在 UI 中输入购买数量,系统计算总价并扣费。扩容后按新容量重建该页数组,保留已有物品。容量始终限制在 [initialSlots, maxSlots] 范围内。

若分类未配置 priceper-slot <= 0,该分类不可扩容。

操作令牌机制

UI 打开时签发唯一的 action token,客户端在执行购买槽位、销毁物品、设置/清除二级密码等敏感操作时需携带有效 token。操作完成后自动轮换 token,防止重放攻击。UI 关闭时清除 token 并持久化数据。

关于 UI 条件匹配与图标渲染的通用知识,参考 条件系统图标系统

本页目录