Q Shop 附加组件 出售箱

Q Shop 附加组件 出售箱

QShop的自动售卖容器,可按计划或当GUI关闭时出售储存的物品,并付款给配置的所有者。

QShop Sell Box

QShop 的附属模组。

QShop Sell Box 是适用于 QShop 的 Forge 1.20.1 附属模组。它为使用 QShop 作为货币系统的服务器添加了一个专用的自动出售容器。

将物品放入售货箱,选择收益归属的玩家,并选择何时出售容器内的物品。售货箱可以按可配置的时间间隔自动出售,也可以在关闭 GUI 时出售其内容物。收益会存入所选归属玩家的 QShop 钱包,即使该玩家离线也会存入。

该模组旨在遵循原版容器界面的视觉和交互风格。

工作原理

  1. 将 QShop Sell Box 放置在世界中。
  2. 打开容器并将可出售物品放入其 27 个存储槽位。
  3. 打开设置标签页,从已加入服务器的玩家列表中选择一个归属玩家。
  4. 选择一种出售模式:
    • 自动间隔: 在配置的秒、分钟、小时或游戏日之后出售存储的物品。
    • 关闭 GUI 时出售: 在容器 GUI 关闭时出售存储的物品。
  5. 每个物品堆的最终价格在服务端计算,收益使用所选货币存入。

 

功能

  • 专用的 27 格自动出售容器。
  • 用于存储物品的原版风格物品栏标签页。
  • 原版风格的归属玩家与设置标签页。
  • 可从所有记录为已加入服务器的玩家中选择归属玩家。
  • 基于 UUID 的归属关系,因此玩家改名不会改变未来收益的去向。
  • 显示归属玩家的在线与离线状态。
  • 每个容器独立的出售模式和间隔设置。
  • 支持秒、分钟、小时和游戏日的间隔单位。
  • 关闭 GUI 时出售模式,用于手动批量出售。
  • 离线收益通过 QShop 的 UUID 货币 API 存储,并在归属玩家登录时可用。
  • 可选的 Action Bar 和聊天栏出售通知及离线收益同步通知。
  • 可选的物品价格提示。
  • 服务端价格计算,确保提示与交易结果一致。
  • 使用 QShop 货币 ID 和注册显示名称的可配置货币。
  • 静态物品价格和针对 NBT 的精确价格规则。
  • 通用 NBT 倍率,可匹配任何物品上的多个字段。
  • KubeJS 动态定价,可访问物品 ID、堆叠数量、耐久值、完整嵌套 NBT 和物品标签。
  • EMI 兼容性,防止隐藏的 EMI 条目拦截售货箱设置界面。
  • 木桶风格的方块属性、声音、硬度、岩浆点燃和斧头挖掘行为。
  • 方块被破坏时容器内容物会掉落。

前置要求

QShop Sell Box 是一个附属模组,不提供独立的货币系统。必须安装 QShop,模组才能加载并存入收益。

安装

  1. 安装带有 Forge 47.x 的 Minecraft 1.20.1。
  2. 安装所需的 QShop 版本。
  3. 将 qshop-sellbox-1.0.2.jar 放入服务端和客户端的 mods 文件夹。
  4. 启动游戏一次以生成通用配置文件。

该模组应同时安装在服务端和打开 GUI 的客户端上。服务端对归属、出售、价格和货币存入具有权威性。

配置

Forge COMMON 配置文件生成于:

config/qshop_sellbox-common.toml

示例:

defaultCurrency = "coins"
priceRules = [
  "minecraft:iron_ingot|2|coins",
  "minecraft:diamond|100|coins",
  "minecraft:diamond|120|coins|{rarity:rare}"
]
nbtMultipliers = [
  "{rarity:rare}|1.2",
  "{quality:refined}|1.1",
  "minecraft:diamond|{rarity:rare,quality:refined}|1.15"
]
showPriceTooltip = true
debugDynamicPrice = false

静态价格规则

priceRules 使用以下格式:

物品ID|价格|货币ID[|NBT]

示例:

priceRules = [
  "minecraft:iron_ingot|2|coins",
  "minecraft:diamond|100|coins",
  "minecraft:diamond|150|coins|{rarity:'rare'}"
]

NBT 条件按子集匹配。物品必须具有指定的字段和值才能使用该规则。

通用 NBT 倍率

nbtMultipliers 支持适用于所有物品的规则或适用于单个物品的规则:

NBT|倍率
物品ID|NBT|倍率

示例:

nbtMultipliers = [
  "{rarity:'rare'}|1.2",
  "{quality:'refined'}|1.1",
  "minecraft:diamond|{rarity:'rare',quality:'refined'}|1.15"
]

多个匹配的倍率会一起应用。例如,同时匹配 rarity:rare 和 quality:refined 的物品会获得 1.2 * 1.1 的倍率。

当注册了动态价格回调时,KubeJS 动态定价优先于静态价格规则。

KubeJS 动态定价

KubeJS 价格回调在服务端运行,并通过 event.item 接收完整的物品堆栈。回调应返回单件物品的价格和 QShop 货币 ID。

SellBox.price(event => {
  const item = event.item
  const nbt = item.nbt
  let price = 1000

  if (nbt && nbt.rarity == 'rare') {
    price *= 1.2
  }

  if (item.maxDamage > 0) {
    price *= 1.1
  }

  if (item.hasTag('minecards:cards')) {
    price *= 2
  }

  return {
    price: price,
    currency: 'coins'
  }
})

返回的 price 是单价。售货箱会将其乘以从堆叠中移除的物品数量,因此回调不应将结果乘以 event.item.count。

可用的物品属性

event.item 提供:

  • id:带命名空间的物品 ID,例如 minecraft:diamond。
  • count:当前堆叠数量。
  • damage:当前耐久损耗值。
  • maxDamage:最大耐久值,对于不可损坏物品为 0。
  • isDamaged:物品当前是否具有耐久损耗。
  • nbt:完整的物品 NBT,转换为 JavaScript 对象、数组、字符串和数字。
  • hasTag(tagId):使用服务端当前的物品标签注册表检查物品标签。

标签参数可以带或不带 # 前缀:

item.hasTag('minecards:cards')
item.hasTag('#forge:tools')

可以直接读取嵌套的 NBT 字段:

const rarity = event.item.nbt?.rarity
const quality = event.item.nbt?.quality_food?.quality
const attachment = event.item.nbt?.AttachmentEXTENDED_MAG?.tag?.AttachmentId

当应使用配置的 defaultCurrency 时,回调可以只返回一个数字:

SellBox.price(event => {
  return 100
})

对于自定义货币,返回一个对象:

SellBox.price(event => {
  return {
    price: 100,
    currency: 'base_money'
  }
})

返回的货币必须由 QShop 注册。提示、Action Bar 消息、聊天消息和离线存款在可用时使用货币的注册显示名称。

更改 KubeJS 价格脚本后,请使用 KubeJS 的服务端重载流程。安装或升级 Java 模组仍需要重启游戏或服务器。

通知和提示

设置标签页为以下各项提供独立复选框:

  • Action Bar 出售通知。
  • 聊天栏出售通知。

当归属玩家离线时,收益会写入基于 UUID 的钱包数据。当归属玩家登录时,待处理的收益会被存入,并显示所选的通知类型。

价格提示由 showPriceTooltip 控制。动态价格从服务端查询,因此为 NBT 定制物品显示的价格与出售交易中使用的价格一致。