Skip to content

出售规则

LySell 会扫描出售界面前 36 格中的物品,并通过以下两种来源计算售价:

  1. 使用 economy 中的正则表达式,从物品描述中提取价格。
  2. 使用 sell-preset 为没有物品元数据的原版物品设置固定价格。

只有成功匹配到至少一种售价的物品才会被移除。无法匹配价格或被禁止出售的物品会保留在界面中,关闭界面时会尝试退回玩家背包。

描述价格

每个 economy 子节点代表一种货币。节点名称同时用于售价统计、固定价格和货币发放。

yaml
economy:
  金币:
    key:
      - '(?<=出售可获得)[0-9]*(?=金币)'
    formula: '{value}*1'
    round: '%.2f'
    format: '&e{value}金币'
    give-from: 'Vault'
    message: '&7本次出售物品, 获得了&e{value}金币!'

配置项

配置项说明
economy.<货币>.key用于匹配物品描述价格的正则表达式列表
economy.<货币>.formula对提取结果进行计算的公式,使用 {value} 表示数量计算后的原始价值
economy.<货币>.round最终统计结果的数字格式,例如 %.2f 保留两位小数、%.0f 取整
economy.<货币>.format出售按钮中显示的货币统计格式,支持 {value}
economy.<货币>.give-from货币发放方式,可填写 VaultPlayerPoints 或后台指令
economy.<货币>.message出售完成后发送给玩家的消息,支持 {value}

物品描述中的颜色代码会在正则匹配前被移除,因此价格文本可以带有颜色。

例如物品描述为:

text
出售可获得25金币

正则表达式:

text
(?<=出售可获得)[0-9]*(?=金币)

会从该行描述中提取 25

数量计算

从描述中提取到的数字会先乘以物品数量,再传入 formula

例如玩家放入 3 个物品,每个物品的描述价格为 25:

text
{value} = 25 × 3 = 75

如果公式为:

yaml
formula: '{value}*1.5'

本组物品会产生 112.5 的价值。

公式运算

formula 支持以下内容:

内容说明
{value}正则提取值乘以物品数量后的结果
+加法
-减法
*乘法
/除法
()调整运算顺序
整数、小数参与计算的数值

示例:

yaml
formula: '({value}*1.5)+10'

公式计算使用浮点数处理。round 不会改变每件物品参与公式计算时的值,而是在同一种货币全部统计完成后格式化最终结果。

多个正则

同一种货币可以配置多个正则表达式:

yaml
economy:
  金币:
    key:
      - '(?<=出售可获得)[0-9]*(?=金币)'
      - '(?<=出售价格: )[0-9]*(?=金币)'
    formula: '{value}*1'
    round: '%.2f'
    format: '&e{value}金币'
    give-from: 'Vault'
    message: '&7本次出售物品, 获得了&e{value}金币!'

插件会逐行检查物品描述。某一行匹配成功后,该行不会继续匹配其他货币或其他正则,但后续描述行仍会继续检查。因此,一个物品可以通过不同描述行同时产生多种货币。

正则必须匹配可被 Double.parseDouble 解析的数字内容,否则出售时会产生错误。建议让正则只返回整数或小数,不要把货币名称、空格等内容包含在匹配结果中。

发放方式

give-from 决定对应货币的发放方式。

give-from发放行为使用条件
Vault通过 Vault 经济接口向玩家存款需要安装 Vault,并存在可用的经济插件
PlayerPoints通过 PlayerPoints API 发放点券需要安装并启用 PlayerPoints;round 的结果必须是整数
其他文本将文本作为后台指令执行指令会先处理 PlaceholderAPI 变量,并替换 {value}

Vault 发放

yaml
economy:
  金币:
    key:
      - '(?<=出售可获得)[0-9]*(?=金币)'
    formula: '{value}*1'
    round: '%.2f'
    format: '&e{value}金币'
    give-from: 'Vault'
    message: '&7本次出售物品, 获得了&e{value}金币!'

插件启动时会尝试连接 Vault 的经济服务。仅安装 Vault 但没有可用的经济插件时,Vault 发放仍无法正常工作。

PlayerPoints 发放

yaml
economy:
  点券:
    key:
      - '(?<=出售可获得)[0-9]*(?=点券)'
    formula: '{value}*1'
    round: '%.0f'
    format: '&b{value}点券'
    give-from: 'PlayerPoints'
    message: '&7本次出售物品, 获得了&b{value}点券!'

PlayerPoints 发放会把格式化后的结果转换为整数,因此应使用 %.0f 等不会产生小数文本的格式。

后台指令发放

yaml
economy:
  牛币:
    key:
      - '(?<=出售可获得)[0-9]*(?=牛币)'
    formula: '{value}*1'
    round: '%.0f'
    format: '&d{value}牛币'
    give-from: 'lshop give %player_name% nb {value}'
    message: '&7本次出售物品, 获得了&d{value}牛币!'
内容处理方式
{value}替换为该货币格式化后的最终出售数量
PlaceholderAPI 变量按出售玩家解析,例如 %player_name%

后台指令由控制台执行。使用这种发放方式时需要安装 PlaceholderAPI,因为插件会调用 PlaceholderAPI 处理整条指令。

出售消息与按钮统计

出售界面的按钮每秒刷新一次,将当前可出售物品的统计结果追加到 gui.button-lore 后方。

显示格式来自对应货币的 format

yaml
format: '&e{value}金币'

{value} 会替换为经过 round 格式化后的当前总额。

玩家点击出售按钮后,每种成功统计的货币会分别发放,并分别发送对应的 message

yaml
message: '&7本次出售物品, 获得了&e{value}金币!'

message 中的 {value} 同样是经过 round 格式化后的最终总额。

禁止出售

prohibit-sell-lore 用于阻止带有指定描述关键词的物品参与统计和出售。

yaml
prohibit-sell-lore:
  - '已绑定'

匹配规则如下:

  • 使用包含匹配,不要求整行完全相同。
  • 会检查物品描述的每一行。
  • 任意一行包含任意禁止关键词,该物品就不会被统计和出售。
  • 配置中的 & 颜色代码会转换为 Minecraft 颜色代码后再匹配。
  • 没有描述的物品不会触发此规则。

例如以下物品会被阻止出售:

text
装备状态:已绑定

如需配置多个关键词:

yaml
prohibit-sell-lore:
  - '已绑定'
  - '不可交易'
  - '&c禁止出售'

固定物品价格

没有价格描述的原版物品可以通过 sell-preset 设置固定价格。

yaml
sell-preset:
  'BOOK:0':
    金币: 5
    点券: 1

键名格式为:

text
物品ID:子ID

物品 ID 可以使用运行版本中的英文材质名,也可以使用数字 ID:

yaml
sell-preset:
  'BOOK:0':
    金币: 5
  '340:0':
    金币: 5

固定价格会乘以物品数量。例如 BOOK:0 的金币价格为 5,出售 10 本书会统计为 50 金币。

固定价格限制

sell-preset 仅会匹配没有物品元数据的物品。带有名称、描述、附魔或其他物品元数据的物品不会使用固定价格,需要通过描述正则设置售价。

每个固定价格节点可以同时配置多种货币:

yaml
sell-preset:
  'BOOK:0':
    金币: 5
    点券: 1

货币名称必须与 economy 下已经配置的节点名称完全一致:

yaml
economy:
  金币:
    key:
      - '(?<=出售可获得)[0-9]*(?=金币)'
    formula: '{value}*1'
    round: '%.2f'
    format: '&e{value}金币'
    give-from: 'Vault'
    message: '&7本次出售物品, 获得了&e{value}金币!'

sell-preset:
  'BOOK:0':
    金币: 5

即使一种货币只用于固定价格,也必须在 economy 中配置对应的 roundformatgive-frommessage,否则插件无法完成统计显示和货币发放。

快捷放入与取回

extra-button 可以在出售界面最下方设置 0 至 8 号快捷按钮。按钮点击间隔为 1 秒。

type 写法作用
put:<关键词>放入描述中包含指定关键词的物品
put:not-lore放入没有物品元数据的物品
putid:<物品列表>按物品 ID 和子 ID 放入物品
get取回出售区域中的全部物品

按描述放入

yaml
extra-button:
  0:
    type: 'put:&7品质: &a一般'
    item: '160:5'
    name: '&7一键放入&a一般&7品质的装备'
    lore:
      - '[点我]'

put: 后的文本会转换其中的 & 颜色代码,然后与物品描述进行包含匹配。只要任意一行描述包含该文本,物品就会被移动到出售区域。

放入无物品元数据的物品

yaml
extra-button:
  1:
    type: 'put:not-lore'
    item: '160:6'
    name: '&7一键放入无描述物品'
    lore: []

该类型实际判断物品是否没有物品元数据,不只是判断描述列表是否为空。带名称、附魔或其他元数据的物品不会被放入。

按物品 ID 放入

yaml
extra-button:
  2:
    type: 'putid:1,2,3,4:0,5:0'
    item: '160:8'
    name: '&7一键放入指定原版物品'
    lore: []

多个物品使用英文逗号分隔。每项可以填写数字 ID 或运行版本中的英文材质名:

text
putid:STONE,DIRT:0,5:0

未填写子 ID 时按 0 处理。物品类型与子 ID 必须同时匹配才会被放入。

取回全部物品

yaml
extra-button:
  8:
    type: 'get'
    item: '160:7'
    name: '&7一键取回全部装备'
    lore: []

get 会把出售区域前 36 格中的物品移动回玩家背包。背包空间不足时会停止继续取回,剩余物品保留在出售界面中。

出售按钮操作

普通点击出售按钮时,插件会:

  1. 扫描出售区域前 36 格。
  2. 跳过命中禁止描述的物品。
  3. 统计固定价格和描述价格。
  4. 移除成功匹配到价格的物品。
  5. 按货币分别格式化最终数值。
  6. 通过对应的 give-from 发放货币。
  7. 发送对应货币的出售消息。

每名玩家点击出售按钮和额外按钮时都有 1 秒间隔,间隔内重复点击会收到“请1秒后再尝试”的提示。

Shift + 右键清空

当以下配置开启时,玩家对出售按钮使用 Shift + 右键会直接清空出售区域:

yaml
clear-item-button: true

该操作不会计算价格,也不会发放货币,可作为垃圾桶功能使用。清空成功后会向玩家发送提示。默认配置为:

yaml
clear-item-button: false

关闭界面

玩家关闭出售界面时,插件会取消该界面的价格刷新任务,并尝试把出售区域前 36 格中的剩余物品放回玩家背包。

应确保玩家背包有足够空间再关闭界面。代码会调用背包添加方法退回物品,但没有单独处理背包已满时返回的剩余物品。