出售规则
LySell 会扫描出售界面前 36 格中的物品,并通过以下两种来源计算售价:
- 使用
economy中的正则表达式,从物品描述中提取价格。 - 使用
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 | 货币发放方式,可填写 Vault、PlayerPoints 或后台指令 |
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 中配置对应的 round、format、give-from 和 message,否则插件无法完成统计显示和货币发放。
快捷放入与取回
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 格中的物品移动回玩家背包。背包空间不足时会停止继续取回,剩余物品保留在出售界面中。
出售按钮操作
普通点击出售按钮时,插件会:
- 扫描出售区域前 36 格。
- 跳过命中禁止描述的物品。
- 统计固定价格和描述价格。
- 移除成功匹配到价格的物品。
- 按货币分别格式化最终数值。
- 通过对应的
give-from发放货币。 - 发送对应货币的出售消息。
每名玩家点击出售按钮和额外按钮时都有 1 秒间隔,间隔内重复点击会收到“请1秒后再尝试”的提示。
Shift + 右键清空
当以下配置开启时,玩家对出售按钮使用 Shift + 右键会直接清空出售区域:
yaml
clear-item-button: true该操作不会计算价格,也不会发放货币,可作为垃圾桶功能使用。清空成功后会向玩家发送提示。默认配置为:
yaml
clear-item-button: false关闭界面
玩家关闭出售界面时,插件会取消该界面的价格刷新任务,并尝试把出售区域前 36 格中的剩余物品放回玩家背包。
应确保玩家背包有足够空间再关闭界面。代码会调用背包添加方法退回物品,但没有单独处理背包已满时返回的剩余物品。