更新于:

ultimateshop-wiki

[index] [#1] !!前言 [#2] 欢迎 [#3]基础使用 *[#4]用前必阅 *[#5]物品格式 *[#6]物品展示格式 *[#7]经济格式 *[#8]菜单 *[#9]动作 *[#10]条件 *[#11]商店 *[#12]命令 *[#13]config.yml *[#14]常见问题 [#15]高级使用 *[#16]颜色代码 *[#17]简单定价 *[#18]变量列表 *[#19]额外物品描述 *[#20]折扣 *[#21]折扣 - 付费版 *[#22]批量处理 - 数字计算 *[#23]出售魔杖 - 付费版 *[#24]基岩 UI - 付费版 [#25]示例商店 *[#26]动态定价 *[#27]库存机制(模仿现实库存) *[#28]出售其他插件的物品 *[#29]普通商店 *[#30]货币兑换 [#31]开发相关 *[#32]开发教程 *[#33]做不到的事情 [#34]!!翻译信息 [/index] 【前言】

2023/10/29 - 20:57

这次的汉化任务相当特殊,是插件原作者委托我对过时的维基进行的汉化。 原作者既是插件的编写者,也是维基的编写者,和我聊天时提到了其不习惯写中文维基,希望我来帮助汉化。 好,那我就接下这活了。

(如果这英文维基也是他自己写的话,有些语法不准确的地方可能会影响我翻译...嘛,他自己写得也蛮一般的。) 不知道这样的维基有没有汉化奖励,

2023/11/8 - 11:27

虽然一个星期不到,但是汉化的量明显比 WorldGuard 要少。 全文只有九千多字,感情那么轻松原来都亏在这里。 算了,下一步就是可怕的 WorldEdit 了。

【链接】

插件原帖:https://www.mcbbs.net/forum.php?mod=viewthread&tid=1468190 维基原文:https://ultimateshop.superiormc.cn/ [page] 欢迎

付费版新增功能:

  • 折扣变量:你可以创建折扣变量,让拥有指定权限或达到指定条件的玩家拥有折扣。你可以创建数量不限的折扣,它们有两种类型:MIN(最小)和 MAX(最大),前者意味着购买,表示玩家可以用更低的价格买到物品;后者意味着出售,表示玩家出售的物品可以获得更高的回报;
  • 出售魔杖:你可以创建数量不限的出售魔杖,可以使用 UltimateShop 的物品格式,也可自定义使用次数限制;
  • BC 同步:尚在计划,尚未实现(如果你是冲着这个功能来的,请先不要购买,我不确保未来能实现该功能);
  • GUI 编辑器:尚在计划,近期实现(如果你是冲着这个功能来的,请先不要购买,我不确保未来能实现该功能)。

独特功能:

  • 大部分的插件可与本插件联动:通过 UltimateShop 的自定义物品格式,你的联动插件(例如 MMOItems、EcoItems 等)可以完全被 UltimateShop 识别。这意味着即使你的自定义物品修改了自定义名称、描述,UltimateShop 还是能正确识别它们;
  • 多个商品与价格:使用多个商品允许你以此为指定等级的玩家创建礼包类的商品,一次性给予他们更多的物品,而使用多个价格则允许你设置超过一种价格,你也可以让玩家必须支付你所设置的所有种类的货币。该功能附带四种默认方式:ANY、ALL、CLASSIC_ANY、CLASSIC_ALL;
  • 根据玩家购买次数或玩家本身来决定价格:你可以在玩家已经购买过该物品的基础上让商品价格越买越贵;
  • 素有数字选项都支持动态值/符号:你可以在任何需要数字的参数中使用变量和运算符,你可以设置动态库存、产品数量、价格数量等!通过该功能也可简单实现基于库存的动态定价;
  • 动作、条件而不只是命令:UltimateShop 带来了动作和条件系统,你可以在大部分地方使用它们!按钮?商品?甚至是折扣!

UltimateShop 也可以是:

  • 抽奖箱插件:使用 ANY 模式,插件将会随机选择一个商品出售给玩家;
  • 经济兑换插件:例如,将出售物品设置为 100 点券,并设置购买价格为 10000 Vault 的经济单位;
  • 菜单插件:使用 COMMON 类型的菜单,那么插件就可以当成普通的菜单使用;
  • 签到插件:设置购买价格为免费,并设置每个玩家限购数量为 1,再将其刷新模式设置为 TIMED 即可;
  • 礼包插件:设置方法与签到插件大致相同。
  • 月卡查看:站内介绍帖内有介绍,使用到 UltimateShop 内置的菜单系统实现。

介绍

  • UltimateShop 是一个面向 Spigot 服务端的插件,我们只是将所有商店应该有的功能都加进了这个插件里;
  • 通过价格系统,你可以设置玩家每次购买物品都不是同一个价格!
  • 动态定价系统,与现实生活中的相似,每次玩家的购买或出售行为都会导致价格的变动;
  • 对玩家或全服的限购(或限量)系统,且有内置的自动重置功能帮助你补充库存;
  • 内置的简单菜单系统,帮助你创建更多的好看的商店菜单或普通菜单等;
  • 支持超过 15 个不同的插件,支持经济插件和 PlaceholderAPI,且 UltimateShop 也能在确保联动的插件所提供的物品名称或描述发生改变后正确识别它们。

[page] [page] 用前必阅

默认商店物品的配置包含了 Minecraft 1.19+ 的物品,以及由 PlayerPoints/Vault/ItemsAdder 插件提供的货币单位,如果你在使用默认配置的过程中遇到了错误,应该首先自行排查这些内容。 [page] 物品格式

原版物品(不包括含 NBT 的物品)

我们使用 XItemStack 格式,点击这里[sup][链接][/sup]来了解更多。

所有除 material(材料)外的参数都是可选的。

如果你不能很好地理解上述链接中的解释,那么我会在这里给你一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
display-item: 
# 这里是你使用物品格式的关键选项.
material: APPLE
# Minecraft 的材料 id.
# 完整材料名称列表可以在这里找到: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html
name: '&f一天一苹果, 医生远离我!'
# 物品的显示名称, 支持使用彩色字符.
lore:
- '&7这是真的吗?'
- '&7等一下, 这是第二行?'
# 物品的描述, 支持使用彩色字符.
amount: 1
# 物品的数量.
damage: 10
# 物品的损坏值, 也就是物品的耐久度.
skull: 'eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzE4N2Q2ODY4NjgwOWFlZGEwOWE3ZmQwNmFmNzUwMzQzYjdmMTdhNDM2MDZkMmZlOTg4N2VlZTNmZjk4YTMwMSJ9fX0='
# 头颅材质, 仅在材料名称为 'PLAYER_HEAD' 时有效.
unbreakable: true
# 该物品是否显示为"不可破坏"状态.
custom-model-data: 100
# 物品的自定义模型数据, 若你在使用 ItemsAdder 或 Oraxen 则会很有用.
enchants:
ARROW_FIRE: 2
DURABILITY: 3
# Item enchants, use Enchantment ID: Level as format.
# 物品的附魔, 格式为 附魔名称: 附魔等级
# 附魔名称完整列表见 https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html
stored-enchants: ARROW_FIRE
# 附魔书中存储的附魔与直接添加到物品本身的附魔略有不同.
# 仅在材料名称为 'ENCHANTED_BOOK' 时有效
flags: [HIDE_ATTRIBUTES, HIDE_POTION_EFFECTS]
# 物品的标志.
glow: true
# 是否发光.
attributes:
GENERIC_ATTACK_DAMAGE: # 完整属性列表见: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/Attribute.html
name: generic.attack_damage # https://zh.minecraft.wiki/w/%E5%B1%9E%E6%80%A7
amount: 12
operation: ADD_NUMBER # https://hub.spigotmc.org/javadocs/spigot/org/bukkit/attribute/AttributeModifier.Operation.html
slot: HAND # HEAD 或 CHEST 或 LEGS 或 FEET 或 HAND 或 OFF_HAND
spawner: ZOMBIE
# 设置刷怪笼的实体种类.
# 完整实体种类名称列表请见 https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/EntityType.html

该示例并非完全准确,你还是需要自行研究上面所提供的链接。

保存物品

保存物品较于原版物品的区别在于,你事先已经指定了物品的大部分特性(如名称、Lore等)。要保存物品,您需要事先:

  • 在服务器内手持需要保存的物品,输入指令 /shop saveitem <物品ID>。物品ID是您自己设置的,例如 superior_sword。
  • 保存物品后需要重启插件。
  • 在上述的原版物品中,将material选项原本设置的原版Minecraft物品替换为你保存的物品ID。例如原本material: DIAMOND_SWORD,更改为 material: superior_sword。

对接物品

对接物品使用下列的格式:

  • hook-plugin: 该物品的来源插件,目前,UltimateShop[sup][注1][/sup]支持 [font=Consolas]EcoItems[/font]、[font=Consolas]MMOItems[/font]、[font=Consolas]ItemsAdder[/font]、[font=Consolas]Oraxen[/font]、[font=Consolas]MythicMobs[/font]、[font=Consolas]eco[/font] 以及 [font=Consolas]NeigeItems[/font];
  • hook-item: 该物品的命名;必需参数
  • 对于 [font=Consolas]EcoItems[/font]、[font=Consolas]Oraxen[/font] 和 [font=Consolas]MythicMobs[/font],应当直接填写物品的 ID;
  • 对于 [font=Consolas]ItemsAdder[/font] 和 [font=Consolas]eco[/font],你应当按照 [font=Consolas]命名空间:物品ID[/font] 的格式。Eco 系列的命名空间为其插件名称,例如 [font=Consolas]talismans[/font];
  • 对于 [font=Consolas]EcoArmor[/font],你应该按 [font=Consolas]盔甲套装ID;;盔甲部位[/font] 的格式填写。[font=Consolas]盔甲部位[/font] 可以是下列参数中的一个:BOOTSCHESTPLATEELYTRAHELMETLEGGINGS
  • 对于 [font=Consolas]MMOItems[/font],你应该按 [font=Consolas]物品类型ID;;物品ID[/font] 的格式填写;

例如:

1
2
3
display-item:
hook-plugin: MMOItems
hook-item: AXE;;TEST_AXE

额外选项

提供以下额外选项:

  • plugin-enchants:插件附魔,与 enchants 类似,但是可以使用 AdvancedEnchantments 插件的附魔,EcoEnchants、ExcellentEnchatments 插件的附魔是注册到原版中的,因此直接使用 enchants 选项即可;可选参数
  • add-lore:在物品 Lore 的末尾添加的 Lore,与 lore 类似,但是只在物品的末尾添加而不是替代物品原本的
  • amount: 物品数量;可选参数
  • max-amount: 物品的最大数量,用于动态定价;可选参数
  • min-amount: 物品的最小数量,用于动态定价;可选参数

[page] 物品展示格式

你可以在菜单按钮和商店商品的 [font=Consolas]display-item[/font] 选项下使用这些格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
C:
display-item:
# Condition ID
3:
material: GREEN_WOOL
amount: 12
name: '&e第 12 天'
lore:
- '&f今日奖励:'
- '&7 - 5000 金币'
- ''
- '&#FFFACD点击领取'
# Condition ID
2:
material: RED_WOOL
amount: 12
name: '&e第 12 天'
lore:
- '&f包括奖励:'
- '&7 - 5000 金币'
- ''
- '&#ff3300正在冷却'
- '&#ff3300领取时间: %ultimateshop_streak_A_{buy-cooldown-player}%'
# Condition ID
1:
material: RED_WOOL
amount: 12
name: '&e第 12 天'
lore:
- '&f包括奖励:'
- '&7 - 5000 金币'
- ''
- '&#ff3300已经领取'
# Condition ID
0:
material: RED_WOOL
amount: 12
name: '&eDay 12'
lore:
- '&f包括奖励:'
- '&7 - 5000 金币'
- ''
- '&#ff3300请先领取第 11 天的奖励.'
display-item-conditions:
0:
# 阅读“条件”章节获取更多信息
- 'placeholder: %ultimateshop_streak_A_{buy-times-player}%;;<;;11'
1:
- 'placeholder: %ultimateshop_streak_A_{buy-times-player}%;;>;;11'
2:
- 'placeholder: %ultimateshop_streak_A_{buy-times-player}%;;=;;11'
- 'placeholder: %ultimateshop_streak_A_{buy-cooldown-player}%;;!=;;Now'
3:
- 'placeholder: %ultimateshop_streak_A_{buy-times-player}%;;=;;11'

[page] 经济格式

对接经济

对接经济使用下列配置:

  • economy-plugin: 你想要该价格与哪个经济插件进行对接。目前,UltimateShop 支持 [font=Consolas]Vault[/font]、[font=Consolas]GamePoints[/font]、[font=Consolas]PlayerPoints[/font]、[font=Consolas]CoinsEngine[/font]、[font=Consolas]UltraEconomy[/font]、[font=Consolas]EcoBits[/font]、[font=Consolas]PEconomy[/font]、[font=Consolas]RedisEconomy[/font] 和 [font=Consolas]RoyaleEconomy[/font];必选参数
  • economy-type: 如果对接的经济插件支持多经济,那么你就需要要在这里填写货币的具体名称;如描述所示,在使用多经济插件时为必选参数,否则为可选参数
  • amount: 对应货币数量;必选参数
  • max-amount: 最大价格,用于动态定价;可选参数
  • min-amount: 最小价格,用于动态定价。可选参数

示例:

1
2
3
4
5
6
7
8
9
1:
economy-plugin: Vault
# 若你将该参数设置为了 CoinsEngine, 那么你需要按格式设置为:
# economy-plugin: CoinsEngine
# economy-type: Coin
# 是的, 你需要在这里添加一个 economy-type 参数, 因为这个插件支持多经济.
# 但在下文的情况中, 玩家固定扣除 5$.
amount: 5
placeholder: '$5'

原版经济

原版经济使用下面的格式:

  • economy-type: 支持 [font=Consolas]exp[/font]、[font=Consolas]levels[/font];必需参数
  • amount: 对应种类交易货币的数量;必需参数
  • max-amount: 最大价格,用于动态定价;可选参数
  • min-amount: 最小价格,用于动态定价。可选参数

示例:

1
2
3
4
1:
economy-type: levels
amount: 5
placeholder: '5 levels'

[page] 菜单

所有菜单文件都存储在 [font=Consolas]/menus/[/font] 文件夹下。

种类

这里共有 3 种菜单。

  • 普通菜单,与其他普通菜单插件一样的内容。你可以用它们来打开商店菜单;
  • 商店菜单,会显示指定商店的商品以及它们的价格;
  • 加量购买菜单,可以选择你所购买商品的数量。

配置

  • title: 商店的标题,对于商店菜单,可以使用内置变量 [font=Consolas]{shop-name}[/font] 表示商店名称,商店名称可在配置文件中设置;
  • size: 菜单的大小,仅支持下列数字:9、18、27、36、45、54;
  • layout: 按钮的排版,此处应当填入一个列表,列表行数需与 [font=Consolas]size(菜单大小)/9[/font] 等值,且每一行字符长度也必须等于 9;
  • buttons: 按钮配置,按钮 ID 必须为单个字符,可以使用 [font=Consolas]layout[/font] 选项控制按钮在菜单中的位置;
  • conditions: 浏览该菜单的玩家所需要达到的条件。见“条件”章节以获取更多信息。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
title: '商店页面'

size: 54

conditions:
- 'none'

layout:
- '000000000'
- '000000000'
- '0000A0000'
- '000000000'
- '000000000'
- '000000000'

buttons:
A:
display-item:
material: BREAD
name: '&d美食'
lore:
- '&7点击打开食物商店!'
actions:
- 'shop_menu: example'

加量购买菜单

加量购买菜单有如下额外参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
amount-items:
1:
display-item:
material: GREEN_WOOL
name: '&a+1'
lore:
- '&7点击增加 1 个.'
add-amount: 1
2:
display-item:
material: GREEN_WOOL
name: '&a+10'
lore:
- '&7点击增加 10 个.'
add-amount: 10
3:
display-item:
material: GREEN_WOOL
name: '&a+32'
lore:
- '&7点击增加 32 个.'
add-amount: 32
4:
display-item:
material: RED_WOOL
name: '&c-1'
lore:
- '&7点击减少 1 个.'
add-amount: -1
5:
display-item:
material: RED_WOOL
name: '&c-10'
lore:
- '&7点击减少 10 个.'
add-amount: -10
6:
display-item:
material: RED_WOOL
name: '&c-32'
lore:
- '&7点击减少 32 个.'
add-amount: -32

display-item: B

confirm-items:
D:
display-item:
material: PAPER
name: '&a确认'
lore:
- '&7点击完成交易!'
  • amount-items: 被选择的物品修改数量。[font=Consolas]add-amount[/font] 可替换为 [font=Consolas]set-amount[/font] 选项,替换后将改为设定数量为指定值;
  • display-item: 可以为单字符,即 [font=Consolas]layout[/font] 中的字符,以设置它显示的位置;
  • confirm-items: 点击确认交易的按钮。

[page] 动作

后缀格式

  • 所有操作都支持添加后缀。
  • -o 意味着该操作只会在玩家尝试购买/出售该物品时执行一次。例如,玩家购买了 50 个苹果,在没有该后缀参数的情况下,操作将会执行 50 次。否则操作只会执行一次;
  • -<数字> 意味着该操作只会在玩家购买/出售了指定次数的商品后触发,例如 -1 意味着该操作只会在玩家初次购买物品的时候触发。

None(无)

不会执行任何操作。

1
- 'none'

Sound(声音)

向玩家播放声音。

1
2
- 'sound: ui.button.click;;1;;1' 
# "sound: 声音名称;;音量;;音高"

Message(消息)

向玩家发送消息,支持彩色字符。

1
- 'message: Hello!'

Announcement(公告)

向所有玩家发送消息,支持彩色字符。

1
- 'announcement: Hello!'

Effect(药水效果)

给予玩家药水效果。

1
- 'effect: BLINDNESS;;1;;60'

BLINDNESS 为 SpigotAPI 的效果 ID,它与 Minecraft 自带的效果名称不同。你可以在这里找到完整的药水效果名称:https://hub.spigotmc.org/javadoc ... tionEffectType.html

1 为药水效果等级。

60 为药水效果持续时间。

Telelport(传送)

将玩家传送至指定世界的指定位置。

1
- 'teleport: LobbyWorld;;0;;128;;10'

其中。 LobbyWorld 为世界名称。

0 为目标地点的 X 坐标。

128 为目标地点的 Y 坐标。

10 为目标地点的 Z 坐标。

你也可以添加 yaw 和 pitch 值,如下所示:

1
- 'teleport: DungeonWorld;;100;;30;;300;;90;;0'

Player Command(玩家命令)

以玩家身份执行命令。

1
- 'player_command: tell i am a boy!'

Console Command(控制台命令)

以控制台身份执行命令。

1
- 'console_command: op %player%'

MythicMobs Spawn(生成 MM 生物)

生成 MM 生物

需要安装插件 MythicMobs。

1
- 'mythicmobs_spawn: test;;1'

[font=Consolas]test[/font] 为 生物 ID,[font=Consolas]1[/font] 为实体等级,二者之间使用 [font=Consolas];;[/font](两个英文分号)分隔。

等级参数可以去除,这意味着你可以这样使用:

1
- 'mythicmobs_spawn: test'

指定位置生成 MM 生物

需要安装插件 MythicMobs。

与上一条相似,但你需要在动作语句末尾添加 [font=Consolas];;世界名称;;x;;y;;z[/font],如:

1
- 'mythicmobs_spawn: testMonster;;LobbyWorld;;11;;64;;12'

Open Common Menu(打开普通菜单)

打开指定的普通菜单。

1
- 'open_menu: main'

Open Shop Menu(打开商店菜单)

1
2
- 'shop_menu: food_shop' 
# 这是商店的文件名称, 不是菜单的文件名称!

Buy Product(购买物品)

1
2
- 'buy: food;;A;;5' 
# 商店 ID;;商品 ID;;购买数量

Sell Product(出售物品)

1
2
- 'sell: food;;A;;5' 
# 商店 ID;;商品 ID;;购买数量

Sell All(出售全部)

1
- 'sellall: food;;A'

Close(关闭菜单)

关闭当前界面。

1
- 'close'

[page] 条件

None(无)

不设置条件。

1
- 'none'

World(世界)

玩家需处于指定世界。

使用 [font=Consolas];;[/font] 来分隔不同的世界。

1
- 'world: World1;;World2'

Permission(权限)

玩家必须拥有条件中所指定的全部权限。

使用 [font=Consolas];;[/font] 来分隔不同的权限。

1
- 'permission: permission.1;;permission.2'

Placeholder(变量)

玩家的某个变量必须符合指定的值。它包括三部分,通过 [font=Consolas];;[/font] 分隔。格式为 [font=Consolas]<变量>;;<比较符>;;<值>[/font]

比较符可以是:

  • =

  • <=
  • <
  • ==(字符串比较)
  • =(数字)
  • !=(数字或字符串)
  • !*=(数字或字符串)不包含
  • *=(字符串)包含,例如,str *= string 返回 true,但 exmaple *= ple 返回 false。
1
- 'placeholder: %player_points%;;>=;;200'

[page] 商店

示例商店文件在此:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
settings:
menu: 'example-shop-menu'
buy-more: true
shop-name: '食物商店'

items:
A:
display-name: "苹果"
price-mode: ANY
product-mode: ALL
products:
1:
material: APPLE
amount: 1
buy-prices:
1:
economy-plugin: Vault
amount: 200
placeholder: '{amount} 枚金币'
start-apply: 0
2:
economy-plugin: PlayerPoints
amount: 10
placeholder: '{amount} 点券'
start-apply: 5
sell-prices:
1:
economy-plugin: Vault
amount: 50
placeholder: '{amount} 枚金币'
2:
economy-plugin: PlayerPoints
amount: 1
start-apply: 5
placeholder: '{amount} 点券'
buy-actions:
- 'player_command: say %player% 购买了一个苹果!'
- 'announcement: &7%player% 购买了一个苹果!'
B:
display-item:
material: BREAD
display-name: "面包"
price-mode: ANY
product-mode: ALL
products:
1:
material: BREAD
amount: 1
buy-prices:
1:
economy-plugin: Vault
amount: 200
placeholder: '{amount} 枚金币'
start-apply: 0
2:
economy-plugin: PlayerPoints
amount: 10
placeholder: '{amount} 点券'
start-apply: 5
sell-prices:
1:
economy-plugin: Vault
amount: 50
placeholder: '{amount} 枚金币'
2:
economy-plugin: PlayerPoints
amount: 1
start-apply: 5
placeholder: '{amount} 点券'
buy-actions:
- 'player_command: say %player% 购买了一个面包!'
- 'announcement: &7%player% 购买了一个面包!'
buy-limits:
global: 100
default: 10
test-condition: 20
buy-limits-conditions:
test-condition:
- 'permission: test.permission'
buy-limits-reset-mode: 'TIMED'
buy-limits-reset-time: '00:00:00'

buttons:
a:
display-item:
material: arrow
name: '&c上一页'
lore:
- '&7点击翻到上一页!'
actions:
- 'shop_menu: crops'

设置

  • menu: 商店的菜单名称,也就是菜单的文件名称;
  • buy-more: 该商店中的商品是否能打开增量购买菜单;
  • shop-name: 商店的显示名称,会被内置变量 [font=Consolas]{shop-name}[/font] 使用。

物品

物品即为商店中的商品,商品可以不是物品,也可以是虚拟物品,例如 100 点其他经济插件的货币。

物品 ID/商品 ID

商品 ID 需为单字符,因为它们需要在商店的 [font=Consolas]layout[/font] 选项中使用。

  • display-item: 展示在商店菜单中的物品,可以与玩家实际获得的物品不同。对虚拟物品,你必须在这里设置 [font=Consolas]display-item[/font] 参数,否则它们就不会在界面中显示。对于真是物品,你必须设置 [font=Consolas]display-item[/font] 下的 [font=Consolas]auto-set-first-product[/font] 设置以允许你删除这个选区,启用后,若 [font=Consolas]display-item[/font] 未设置,那么商品出售的物品将会被当做图标。该部分配置会使用到物品格式的配置;可选(若未设置,将会使用排序靠前的出售物品)
  • display-item.modify-lore: 是否自动修改物品描述;可选参数(默认为 true)
  • display-name: 设置商品的显示名称,该名称会在内置变量 {product} 和增量购买菜单中使用;
  • buy-more: 设置该商品是否可以打开增量购买菜单,你必须删除商店的 buy-more 选项才可使该设置正常工作!可选参数。
  • price-mode: 支持 [font=Consolas]ANY[/font]、[font=Consolas]ALL[/font]、[font=Consolas]CLASSIC_ANY[/font] 和 [font=Consolas]CLASSIC_ALL[/font] 参数;必选参数
  • product-mode: 可填入的参数与上述相同。若你设置了 product 部分的配置,则该参数必选。

[table=98%,White] [tr][td]模式[/td][td]ANY[/td][td]ALL[/td][td]CLASSIC_ANY[/td][td]CLASSIC_ALL[/td][/tr] [tr][td]商品给予[/td][td]给予满足条件的随机商品。[/td][td]给予所有商品。[/td][td]与 ANY 模式相同。[/td][td]与 ALL 模式相同。[/td][/tr] [tr][td]拿走商品[/td][td]在玩家物品栏中找到的第一个符合条件的商品。[/td][td]玩家必须拥有所有商品才可出售。[/td][td]与 ANY 模式相同。[/td][td]与 ALL 模式相同。[/td][/tr] [tr][td]扣款[/td][td]达到条件的第一种货币。[/td][td]收取的所有货币必须同时满足条件。[/td][td]与 ANY 模式相同。[/td][td]与 ALL 模式相同。[/td][/tr] [tr][td]收款(出售时获得经济单位)[/td][td]达到条件的第一种货币。[/td][td]所有货币都会被给予。[/td][td]与 ANY 模式相同。[/td][td]与 ALL 模式相同。[/td][/tr] [tr][td]价格支持[/td][td]支持动态定价&添加选项。[/td][td]与 ALL 模式相同。[/td][td]价格每次都是相同的,或者你可以在商店配置中禁用增量购买菜单。[/td][td]与 CLASSIC_ALL 模式相同。[/td][/tr] [tr][td]服务器性能[/td][td]在处理大量购买/出售事件时可能会有较高占用。[/td][td]与 ALL 相同。[/td][td]与其他商店插件一样低![/td][td]与 CLASSIC_ANY 模式相同。[/td][/tr] [/table]

  • products: 作为商品的物品。支持物品格式和经济格式(分别见上述章节);可选参数。若未设置,玩家在购买/出售后不会获得任何东西,适用于命令商店。
  • buy-prices: 商品的购买价格。支持物品格式和经济格式(分别见上述章节);可选参数,若未设置则不能购买。
  • buy-prices.start-apply: 设置价格增加的起始购买次数;可选参数。默认为 0。
  • buy-prices.end-apply: 设置价格增加的最终购买次数;可选参数。默认不限制。
  • buy-prices.apply: 应用价格的购买次数,格式为:[font=Consolas][1,2,3,4][/font];可选参数
  • buy-prices.placeholder: 在内置变量 {price} 中的价格显示格式;默认使用语言文件中的格式。
  • buy-price.conditions: 若要使用这个价格购买物品,则玩家必须到达的条件;
  • sell-prices: 商品的出手价格。支持物品格式和经济格式(分别见上述章节);可选参数,若未设置则不能出售。
  • buy-actions: 购买商品后执行的一系列动作。见“动作”章节获取更多信息;可选参数
  • sell-actions: 出售商品后执行的一系列动作。见“动作”章节获取更多信息;可选参数
  • buy-conditions: 玩家购买该商品所需达到的条件。见“条件”章节获取更多信息;可选参数
  • sell-conditions: 玩家出售该商品所需达到的条件。见“条件”章节获取更多信息;可选参数
  • buy-limits: 设置购买或出售的最大次数;可选参数。若未设置,商品购买次数不作限制。
  • buy-limits.global: 全局购买限制;可选参数。
  • buy-limits.default: 若玩家未到达下述的任意条件,他们就会使用该限制;若设置了 buy-limits,则该项为必需参数。
  • buy-limits.<条件 ID>: 达到该要求的玩家将会使用该限制。可在“条件”章节找到对应的格式。例如:
1
2
3
4
5
6
buy-limits:
default: 10
vip: 20
buy-limits-conditions:
vip:
- 'permission: test.permission'
  • buy-limits-reset-mode: 可填入的参数有 TIMER 和 TIMED。若 buy-limits 部分配置存在且该选项未设置,我们将会使用你在 config.yml 中的默认值;若设置 buy-limits 选项则为必需参数。 [table=98%,White] [tr][td]模式[/td][td]TIMER[/td][td]TIMED[/td][/tr] [tr][td]刷新规则[/td][td]按你设置的每 xx 时(第一位) xx 分(第二位) xx 秒(第三位)重置一次[/td][td]每天的 xx(第一位):xx(第二位):xx(第三位) 重置一次。[/td][/tr] [/table]
  • buy-limits-reset-time: 见上,格式为 XX:XX:XX。若 buy-limits 部分配置存在且该选项不存在,我们会使用 config.yml 中的默认值; 例如,你将重置时间设置为 15:00:00,现在时间为 2023-09-04 12:00:00 在 TIMER 模式下,重置时间为 15 小时后,即 2023-09-05 03:00:00。 在 TIMED 模式下,将会在 2023-09-04 15:00:00 进行重置。
  • sell-limits: 与 buy-limits 设置相同,但是是为出售使用的;
  • buy-cooldown-mode: 设置商品的冷却模式;可选参数
  • buy-cooldown-time: 设置商品的冷却时间。可选参数

按钮

商店中同样可以插入菜单中的按钮(buttons)选项,功能完全一致。 [page] 命令列表

/shop menu <菜单ID>/<商店ID>

打开普通菜单或商店菜单。

需要权限 ultimateshop.menu。 这个指令支持在控制台使用,如需在控制台使用,需要在末尾添加 <玩家> 参数,例如 /shop menu Shop1 Player1。

/shop quickbuy <商店ID> <商品ID> [数量]

快速购买商店中的指定物品。

需要权限 ultimateshop.quickbuy。

这个指令支持在控制台使用,如需在控制台使用,需要在末尾添加 <玩家> 参数,例如 /shop quickbuy ore A 5 Player1。

/shop quicksell <商店ID> <商品ID> [数量]

与快速购买相同,将 quickbuy 替换为 quicksell 即可。

/shop reload

重载插件,一些配置需要你重启服务器才可生效。

需要权限 ultimateshop.reload。

/shop givesellstick <物品 ID> <玩家 ID> [数量]

给予指定玩家指定数量(不填则默认为 1)的出售魔杖。(仅付费版本)

需要权限 ultimateshop.givesellstick。

/shop setbuytimes <商店 ID> <商品 ID> <玩家> <次数>

将玩家对指定商品的购买次数限制在特定值。

需要权限 ultimateshop.setbuytimes。

在这里,setselltimes 和 setbuytimes 子命令的参数相似。

/shop editor。

打开商店在线编辑器

需要权限 ultimateshop.editor。

[page] config.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
debug: false

menu:
shop:
# 是否允许商店每秒刷新.
# 会刷新物品描述中的变量.
# 可能会在有大量玩家在线且都开启了菜单 GUI 时产生卡顿.
update: true
sell-all:
size: 54
title: '&f出售所有 &7- 按下 Esc 键确认操作!'
# 仅付费版
bedrock:
title: '你需要做什么?'
buy-or-sell: '购买或出售?'
amount: '数量'
amount-tip: '输入 all 全部出售!'
select-more:
menu: buy-more
max-amount: 64
auto-open:
enabled: true
menu: main
click-event:
buy: 'SHIFT_LEFT'
sell: 'RIGHT'
buy-or-sell: 'LEFT'
# 若你需要禁用这个功能, 请将其设置为 NEVER.
select-amount: 'SHIFT_RIGHT'
sell-all: 'DROP'

use-times:
default-reset-mode: 'NEVER'
default-reset-time: '00:00:00'

math:
enabled: true

display-item:
auto-set-first-product: true
add-displayname: ' x{amount}'
# @+小写字符表示条件描述, 不要去掉它们.
# 否则的话, 没有这些内容的文本行就永远不会显示它们.
add-lore:
- ''
- '@a&e买价: {buy-price}'
- '@b&e卖价: {sell-price}'
- '@c&#FF7777玩家购买数量: {buy-times-player}/{buy-limit-player}'
- '@d&#FF7777全服购买数量: {buy-times-server}/{buy-limit-server}'
- '@e&#FF7777玩家出售限制: {sell-times-player}/{sell-limit-player}'
- '@f&#FF7777全服出售限制: {sell-times-server}/{sell-limit-server}'
- '@g '
- '@g&#ff3300c不能再买更多了!'
- '@g&8刷新时间: {buy-refresh-player}'
- '@i '
- '@i&#ff3300已售罄!'
- '@i&8刷新时间: {buy-refresh-server}'
- '@h '
- '@h&#ff3300不能再卖更多了!'
- '@h&8刷新时间: {sell-refresh-player}'
- '@j'
- '@j&#ff3300已售满!'
- '@j&8刷新时间: {sell-refresh-server}'
- ' '
- '@a{buy-click}'
- '@b{sell-click}'
- '@k&#FFFACDShift+右键点击 选择数量!'
- '@b&#FFFACD键盘 Q 键 全部出售!'

placeholder:
# 仅付费版本.
discount:
buy:
mode: MIN
default: 1
vip: 0.5
mvp: 0.3
sell:
mode: MAX
default: 1
vip: 1.5
mvp: 2
discount-conditions:
vip:
- 'permission: group.vip'
mvp:
- 'permission: group.mvp'
data:
can-used-in-amount: true
refresh:
format: "yyyy-MM-dd HH:mm:ss"
never: "Never"
cooldown:
format: "yyyy-MM-dd HH:mm:ss"
now: "Now"
price:
split-symbol-any: ', '
split-symbol-all: ', '
unknown: "Unknown"
unknown-price-type: "未知价格种类"
empty: "价格为空!"
click:
enabled: true
buy: '&#FFFACD鼠标左键购买!'
sell: '&#FFFACD鼠标右键出售!'
buy-with-no-sell: '&#FFFACD点击购买!'
sell-with-no-buy: '&#FFFACD点击出售!'
buy-max-limit-player: '&#ff3300你不能再买更多了!'
buy-max-limit-server: '&#ff3300已售罄!'
sell-max-limit-player: '&#ff3300不能再卖更多了!'
sell-max-limit-server: '&#ff3300该物品不能出手!'
buy-price-not-enough: '&#ff3300没有足够的钱!'
sell-price-not-enough: '&#ff3300没有足够的物品!'
error: '&#ff3300错误!'
buy-condition-not-meet: '&#ff3300未到达购买条件!'
sell-condition-not-meet: '&#ff3300未到达出售条件!'
buy-in-cooldown: '&#ff3300正在冷却!'
sell-in-cooldown: '&#ff3300正在冷却!'

database:
enabled: false
jdbc-url: "jdbc:mysql://localhost:3306/ultimateshop?useSSL=false&autoReconnect=true"
jdbc-class: "com.mysql.cj.jdbc.Driver"
properties:
user: root
password: 123456

prices:
example:
economy-plugin: Vault
amount: 200
placeholder: '200 金币'
mmoitems-example:
hook-plugin: MMOItems
hook-item: AXE;;TEST_AXE
amount: 1
placeholder: '1 神秘斧'

# Premium version only
sell-stick-items:
A:
material: STICK
name: '&d出售魔杖 &7(5 次)'
lore:
- '&f点击箱子激活魔杖!'
- ''
- '&c剩余可使用次数: {times}'
usage-times: 5
B:
material: STICK
name: '&d高级出售魔杖 &7(50 次)'
lore:
- '&f点击箱子激活魔杖!'
- ''
- '&c剩余可使用次数: {times}'
usage-times: 50

check-class:
enabled: true
classes: []

[page] 常见问题

问:我要如何出售 ItemsAdder 物品? 答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
items:
A:
price-mode: CLASSIC_ALL
product-mode: CLASSIC_ALL
products:
1:
hook-plugin: ItemsAdder
hook-item: fishing_pack:common_fishing_bait
buy-prices:
1:
economy-plugin: Vault
amount: 5
start-apply: 0
placeholder: '&65 金币'

问:start-apply 是什么意思? 答:这意味着在哪次购买之后会应用的价格。如果你设置为 5,则价格会在你交易 5 次之后被设置。

该选项只会对 ANY 或 ALL 价格模式生效。 [page] [page] 颜色代码

十六进制颜色

若要使用十六进制颜色,你需要使用特殊的颜色代码,它应当像这样:

&#<六位色码>

例如,&#ff0000。

渐变颜色

若要使用渐变颜色,你需要使用特殊的渐变颜色代码,它应当像这样:

&<#起始六位色码>消息&<#终止六位色码>

例如,&<#666666>UltimateShop&<#ffffff>。 [page] 简单定价

你可以使用 [font=Consolas]config.yml [/font] 下的 [font=Consolas]prices[/font] 部分配置来创建新的简单定价!

例如:

1
2
3
4
5
6
7
8
9
prices:
example:
economy-plugin: Vault
placeholder: '200 金币'
mmoitems-example:
hook-plugin: MMOItems
hook-item: AXE;;TEST_AXE
amount: 1
placeholder: '1 神秘斧'

此处示例包含了两个简单定价,一个是 [font=Consolas]example[/font] 和 [font=Consolas]mmoitems-example[/font]。你可以在商店出售的商品中的 [font=Consolas]buy-prices[/font] 和 [font=Consolas]sell-prices[/font] 部分配置来通过对应种类设置使用这些数值。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
products:
A:
give-item: true
price-mode: ALL
product-mode: ALL
products:
1:
material: APPLE
amount: 1
buy-prices:
1:
custom-type: example # <--- 新选项!
amount: 20
start-apply: 0
2:
custom-type: mmoitems-example # <--- 新选项!
placeholder: '{amount} axes'
start-apply: 0

[page] 变量列表

内建变量列表

[table=98%,White] [tr][td]变量[/td][td]显示内容[/td][td]使用位置[/td][/tr] [tr][td]{shop}[/td][td]显示商店 ID(文件名称)。[/td][td]消息文件 动作[/td][/tr] [tr][td]{shop-name}[/td][td]显示商店的显示名称。[/td][td]商店菜单 动作[/td][/tr] [tr][td]{shop-menu}[/td][td]显示商店的菜单 ID。[/td][td]动作[/td][/tr] [tr][td]{product}[/td][td]显示商品 ID。[/td][td]消息文件[/td][/tr] [tr][td]{amount}[/td][td]显示购买或出售的物品数量。[sup][注1][/sup][/td][td]消息文件 动作 变量选项[/td][/tr] [tr][td]{item}[/td][td]显示购买的物品名称。[/td][td]消息文件[/td][/tr] [tr][td]{menu}[/td][td]显示商店 ID。[/td][td]消息文本[/td][/tr] [tr][td]{price}[/td][td]显示购买/出售价格。[/td][td]消息文件[/td][/tr] [tr][td]{limit}[/td][td]显示购买/出售限制。[/td][td]消息文件[/td][/tr] [tr][td]{times}[/td][td]显示购买/出售次数。[/td][td]消息文件[/td][/tr] [tr][td]{refresh}[/td][td]显示商品重置时间点或剩余重置时间。[/td][td]消息文件[/td][/tr] [tr][td]{buy-price}[/td][td]见上。[sup][原文如此,下同][/sup][/td][td]物品的展示描述[/td][/tr] [tr][td]{sell-price}[/td][td]见上。[/td][td]物品的展示描述[/td][/tr] [tr][td]{buy-times-player}[/td][td]见上。[/td][td]物品的展示描述 PlaceholderAPI 支持 数量选项[/td][/tr] [tr][td]{buy-limit-player}[/td][td]见上。[/td][td]物品的展示描述 PlaceholderAPI 支持[/td][/tr] [tr][td]{buy-limit-player}[/td][td]见上。[/td][td]物品的展示描述 PlaceholderAPI 支持[/td][/tr] [tr][td]{buy-refresh-player}[/td][td]见上。[/td][td]物品的展示描述 PlaceholderAPI 支持[/td][/tr] [tr][td]{buy-cooldown-player}[/td][td]见上。[/td][td]物品的展示描述 PlaceholderAPI 支持[/td][/tr] [tr][td]{sell-xxx}[/td][td]见上。 xxx 处的内容与上文的 buy 相似,例如 {sell-limit-player}[sup][注2][/sup][/td][td]见上。[/td][/tr] [tr][td]{xxx-server}[/td][td]见上。 xxx 处的内容与上文的 player 相似,例如 {buy-limit-server}[/td][td]见上。[/td][/tr] [tr][td]{buy-click}[/td][td]浏览购买价格及其状态[/td][td]物品的展示描述[/td][/tr] [tr][td]{sell-click}[/td][td]浏览出售价格及其状态[/td][td]物品的展示描述[/td][/tr] [/table]

PlacholderAPI 支持

上文的所有的内建变量都有其对应的 PlaceholderAPI 拓展:

例如,使用 [font=Consolas]%ultimateshop_<商店 ID><商品 ID><内建变量>%[/font] 即可在插件外显示相关内容!

例如: [font=Consolas]%ultimateshop_example_A_{buy-limit-player}%[/font]

脚注[hr] [注1] 原文此处疑似错写,为“shop”。 [注2] 原文此处漏字,应为“player”。 [page] 额外物品描述

可以在 config.yml 下设置。

默认配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
add-lore:
- ''
- '@a&e购买价格: {buy-price}'
- '@b&e出售价格: {sell-price}'
- '@c&#FF7777玩家购买限制: {buy-times-player}/{buy-limit-player}'
- '@d&#FF7777全服购买限制: {buy-times-server}/{buy-limit-server}'
- '@e&#FF7777玩家出售限制: {sell-times-player}/{sell-limit-player}'
- '@f&#FF7777全服出售限制: {sell-times-server}/{sell-limit-server}'
- '@g '
- '@g&#ff3300c不能再买更多了!'
- '@g&8刷新时间: {buy-refresh-player}'
- '@i '
- '@i&#ff3300已售罄!'
- '@i&8刷新时间: {buy-refresh-server}'
- '@h '
- '@h&#ff3300不能再卖更多了!'
- '@h&8刷新时间: {sell-refresh-player}'
- '@j'
- '@j&#ff3300不能再向服务器出售更多了!'
- '@j&8刷新时间: {sell-refresh-server}'
- ' '
- '@a{buy-click}'
- '@b{sell-click}'
- '@k&#FFFACDShift+鼠标左键 选择数量!'
- '@b&#FFFACD键盘 Q 键 选择全部!'

前缀 - 条件符

每一行以“@+小写字母”开头的描述都会被判断为条件行。我们只会在满足条件时显示这行文本。

@a - 该物品拥有购买价格。(意味着该商品拥有 buy-prices 部分配置) @b - 该物品拥有出售价格。(意味着该商品拥有 sell-prices 部分配置) @c - 该物品拥有玩家购买限制。(意味着该商品拥有 buy-limits.player 设置) @d - 该物品拥有全服购买限制。(意味着该商品拥有 buy-limits.global 设置) @e - 与 @c 相似,但是是出售相关的。 @f - 与 @d 相似,但是是出售相关的。 @g - 该商品已经到达了玩家购买限制。 @h - 该商品已经到达了玩家出售限制。 @i - 该商品已经到达了全服购买限制。 @j - 该商品已经达到了全服出售限制。 @k - 玩家没有打开增量购买菜单。 @m - 该商品正处于购买冷却状态。 @n - 该商品正处于出售冷却状态。

后缀

-b - 该行只会对 Java 版客户端的玩家显示[sup][注1][/sup]

脚注[hr] [注1] 仅付费版。 [page] 折扣

普通版中有两种实现该功能的方式。

方法 1

打开你其中的一个商店配置,找到你所需要为玩家设置折扣的商品。

例如,我想为这个商品进行折扣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
A:
display-name: 'Custom Name!'
price-mode: CLASSIC_ANY
product-mode: CLASSIC_ALL
products:
1:
material: sea_lantern
buy-prices:
1:
economy-type: exp
amount: '15'
start-apply: 0
placeholder: '{amount} Exp'
conditions:
- 'permission: group.vip'
2:
economy-type: exp
amount: '30'
start-apply: 0
placeholder: '{amount} Exp'
sell-prices:
1:
economy-type: exp
amount: '6'
start-apply: 0
placeholder: '{amount} Exp'
conditions:
- 'permission: group.vip'
2:
economy-type: exp
amount: '3'
start-apply: 0
placeholder: '{amount} Exp'

我们需要:

  • 将 price-mode 项改为 [font=Consolas]CLASSIC_ANY[/font] 或 [font=Consolas]ANY[/font]。若你需要使用 [font=Consolas]ALL[/font] 模式,请见方法 2;
  • 在 [font=Consolas]buy-prices[/font] 和 [font=Consolas]sell-prices[/font] 部分设置下添加二段价格。

第一部分的配置针对 VIP 玩家,即拥有 [font=Consolas]group.vip[/font] 权限的玩家即可使用该价格,否则他们就只能使用买价更高而卖价更低的后者。

方法 2

该方法需要使用到能自定义变量的插件。如果你不知道有什么插件能做到该功能的话,我推荐你使用 Auxlior 家的 libReforge。

如何获取 libreforge?

  • 你是否正在使用这个插件?如果是的话,那么你就不需要额外的安装操作了;
  • 如果你没有,那么请在这里下载免费版本的 Action:https://www.spigotmc.org/resourc ... lugin-hooks.109738/
  • 因为 libreforge 也是一个 Spigot 插件,如果你掌握了构建插件的技能,你也可以自行构建取得插件。我不是 libforge 的作者,所以我不能在这里展示任何构建插件的方法。https://github.com/Auxilor/libreforge

添加条件变量

在进行上述操作之后启动你的服务器,你需要找到 [font=Consolas]plugin/libreforge/config.yml[/font] 文件。

打开它,并在其中的 [font=Consolas]placeholders[/font] 部分配置下添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
placeholders:
- id: shop_discount
default: '1'
values:
- conditions:
- id: has_permission
args:
permission: 'group.mvp'
value: '0.2'
- conditions:
- id: has_permission
args:
permission: 'group.vip'
value: '0.5'

这意味着玩家如果没有 [font=Consolas]group.vip[/font] 和 [font=Consolas]group.mvp[/font],那么它就会返回 1。

如果玩家拥有 [font=Consolas]group.mvp[/font] 权限,那么它会返回 0.2。

如果玩家拥有 [font=Consolas]group.vip[/font] 权限,那么它会返回 0.5。

在配置时,你应当像本示例一样注意顺序,如果玩家同时拥有了这两个权限,你必须确保变量返回的值会是较低的那个,所以在这个示例中我让 group.mvp 排在了第一位。

在数量配置上使用这个变量

将价格部分的配置设置为 %libreforge_shop_product%* 即可。 [page] 折扣 - 付费版

在付费版中我们提供了一种额外的方法。

与“折扣”章节中的方法二相似,但我们直接在插件中添加了 {discount} 变量。

  • 打开插件的 config.yml,找到如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
placeholder:
# 仅付费版本.
discount:
buy:
mode: MIN
default: 1
vip: 0.5
mvp: 0.3
sell:
mode: MAX
default: 1
vip: 1.5
mvp: 2
discount-conditions:
vip:
- 'permission: group.vip'
mvp:
- 'permission: group.mvp'

你可以根据自己的喜好随意修改这些值。

  • mode: 你可以创建数量不限的折扣变量,它们分两种:MIN(最小值)和 MAX(最大值),最小值意味着购买,这可以让玩家在购买时付得更少,最大值意味着出售,可以让玩家在出售物品时获利更多。
  • default: 默认值,没有必要设置为 1 之外的其他值。
  • vip/mvp: 条件的 ID 值,满足对应条件的玩家会使用这些值。

对 conditions 部分的配置,请参阅“条件”章节的内容。

通过内建变量 {discount_} 来使用这些折扣。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
items:
A:
price-mode: CLASSIC_ALL
product-mode: CLASSIC_ALL
products:
1:
material: sea_lantern
lore:
- '%player_health%'
buy-prices:
1:
economy-plugin: Vault
amount: '{discount_buy} * 5' # <--- 修改这行
start-apply: 0
placeholder: '{amount} Coins'
  • 5 为基础价格,请将其与 {discount_buy} 相乘。

[page] 数字计算

[font=Consolas]max[/font] - 比较并取最大值。([font=Consolas]max(4,5)[/font]) [font=Consolas]min[/font] - 比较并取最小值。([font=Consolas]min(4,5)[/font]) font=Consolas[/font] - 优先计算其中的表达式。([font=Consolas]3 * (4 + 1)[/font]) [font=Consolas]$[/font] - 表示变量。([font=Consolas]$1 / 3[/font]) [font=Consolas]e[/font] - 自然常数。([font=Consolas]log(3)[/font]) [font=Consolas]pi[/font] - 圆周率π。([font=Consolas]sin(pi)[/font]) [font=Consolas]+[/font] - 将两数相加。([font=Consolas]1 + 1[/font]) [font=Consolas]-[/font] - 将两数相减。([font=Consolas]3-2[/font]、[font=Consolas]-(4+2)[/font]) [font=Consolas]/[/font] - 将两数相除。([font=Consolas]3 / 4[/font]) [font=Consolas][/font] - 将两数相乘。([font=Consolas]2 * 3[/font]) [font=Consolas][1] - 将后者作为前者的指数进行幂运算。([font=Consolas]3^3[/font],即3[sup]3[/sup]) [font=Consolas]%[/font] - 余除。取余数。([font=Consolas]7 % 4[/font],返回 3) [font=Consolas]abs[/font] - 取绝对值。([font=Consolas]abs$1[/font]、[font=Consolas]abs-1[/font]) [font=Consolas]round[/font] - 按五舍六入的方法将小数取整。([font=Consolas]round1.5[/font]、[font=Consolas]round(2.3)[/font]) [font=Consolas]ceil[/font] - 向上取整。([font=Consolas]ceil1.05[/font],返回 2) [font=Consolas]floor[/font] - 向下取整。([font=Consolas]floor0.95[/font],返回 0) [font=Consolas]rand[/font] - 在 0 和给定数间取一个随机整数。([font=Consolas]rand4[/font],返回可能是 0、1、2、3、4 中的一个) [font=Consolas]log[/font] - 进行以自然常数 e 为底数的对数运算。([font=Consolas]log(e)[/font],返回 1) [font=Consolas]sqrt[/font] - 对指定数取平方根。([font=Consolas]sqrt4[/font],即 √4,返回 2) [font=Consolas]cbrt[/font] - 对指定数取立方根。([font=Consolas]cbrt(8)[/font],即[sup]3[/sup]√8,返回 2) [font=Consolas]sin[/font] - 正弦运算。([font=Consolas]sin$2[/font]) [font=Consolas]cos[/font] - 余弦运算。([font=Consolas]cos2pi[/font],即 cos(2π),返回 1) [font=Consolas]tan[/font] - 正切运算。([font=Consolas]tan2pi[/font],即 tan(π),返回 0) [font=Consolas]asin[/font] - 反正弦运算。([font=Consolas]atan1[/font]) [font=Consolas]acos[/font] - 反余弦运算。([font=Consolas]acos0.45[/font]) [font=Consolas]atan[/font] - 反正切运算。([font=Consolas]atan1[/font]) [font=Consolas]sinh[/font] - 双曲正弦运算。([font=Consolas]sinh(4)[/font]) [font=Consolas]cosh[/font] - 双曲余弦运算。([font=Consolas]cosh(4)[/font][sup][注1][/sup]) [font=Consolas]true[/font] - 布尔值,表示 1(真)。 [font=Consolas]false[/font] - 布尔值,表示 0(假)。 [font=Consolas]=[/font] - 比较两侧数字是否相同。([font=Consolas]1 = 1[/font] 返回 1,而 [font=Consolas]1 != 1[/font] 则会返回 0) [font=Consolas]>[/font] - 比较前一个数是否大于后一个数。([font=Consolas]1 > 0[/font],返回 1) [font=Consolas]<[/font] - 比较前一个数是否小于后一个数。([font=Consolas]0 < 1[/font],返回 1) [font=Consolas]>=[/font] - 比较前一个数是否大等于后一个数。([font=Consolas]1 >= 1[/font],返回 1) [font=Consolas]<=[/font] - 比较前一个数是否小等于后一个数。([font=Consolas]0 <= 1[/font],返回 1) [font=Consolas]|[/font] - 布尔值的“或”比较符([font=Consolas]true | false[/font],返回 true),也接受 [font=Consolas]||[/font] 的格式。 [font=Consolas]&[/font] - 布尔值的“和”比较符([font=Consolas]true & true[/font],返回 true),也接受 [font=Consolas]&&[/font] 的格式。 [font=Consolas]![/font] - 布尔值的“非”比较符([font=Consolas]!true[/font],返回 false)

脚注[hr] [注1] 原文此处为“sinh(4)”,实际应作“cosh(4)”。 [page] 出售魔杖 - 付费版

打开 config.yml 并找到以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 仅付费版本
sell-stick-items:
A:
material: STICK
name: '&d出售魔杖 &7(5 次)'
lore:
- '&f点击箱子激活魔杖!'
- ''
- '&c剩余次数: {times}'
usage-times: 5
B:
material: STICK
name: '&d高级出售魔杖 &7(50 次)'
lore:
- '&f点击箱子激活魔杖!'
- ''
- '&c剩余次数: {times}'
usage-times: 50

A 和 B 为物品 ID,其下方便为对应的配置部分。

应当使用物品格式。(见“物品格式”章节)

  • usage-times: 使用物品的最大次数。

[page] 基岩版专属 UI - 付费版

  • 同时需要 Geyser 和 Floodgate;
  • 必须将 Geyser 配置文件中 auth-type 项设置为 floodgate,或使用插件版的 Geyser
  • 自此,所有进入服务器的基岩版玩家都会使用新的 UI。

[page] [page] 动态定价

第 1 步

修改 config.yml 文件下的这些内容:

  • 对于 1.2.8 的用户:将 [font=Consolas]check-math: false[/font] 修改为 [font=Consolas]check-math: true[/font]
  • 对 1.2.9+ 的用户:将
1
2
3
4
math:
# 是否启用基本数学运算检测?
# 这将会对 + - * / 四种运算符进行识别.
enabled: false

修改为

1
2
3
4
math:
# 是否启用基本数学运算检测?
# 这将会对 + - * / 四种运算符进行识别.
enabled: true

即可。

  • 将:
1
2
3
placeholder:
data:
can-used-in-amount: false

修改为

1
2
3
placeholder:
data:
can-used-in-amount: true

第 2 步

打开你的商店配置,找到你需要启用动态定价的商品。

例如,我想为该商品启用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
A:
display-name: 'Custom Name!'
price-mode: ALL
product-mode: CLASSIC_ALL
products:
1:
material: sea_lantern
buy-prices:
1:
economy-type: exp
amount: '5+{buy-times-server}*0.2-{sell-times-server}*0.1'
max-amount: 15
min-amount: 1
start-apply: 0
placeholder: '{amount} Exp'
sell-prices:
1:
economy-type: exp
amount: '5+{buy-times-server}*0.2-{sell-times-server}*0.1'
max-amount: 15
min-amount: 1
start-apply: 0
placeholder: '{amount} Exp'

首先,你需要将 [font=Consolas]price-mode[/font] 设置为 [font=Consolas]ALL[/font] 或 [font=Consolas]ANY[/font]。

我在这里写的部分数量设置是数学表达式,如果你数学不好的话就让我给你解释:

  • 5 为价格基数,也即起始价格;
  • 0.2 表示玩家每次购买后的加价;
  • 0.1 表示玩家每次出售后的降价。

我们也添加了诸如 [font=Consolas]max-amount[/font] 和 [font=Consolas]min-amount[/font] 选项,以防止价格变动幅度过大的情况出现。

展示

[hr] [page] 库存机制(模仿现实库存)

第 1 步

在阅读本章节前,你应该先了解“动态定价”章节。

第 2 步

与动态定价相似,若你需要制作一个库存系统,请设置 [font=Consolas]buy-limits[/font] 选项,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
A:
price-mode: ALL
product-mode: CLASSIC_ALL
products:
1:
material: echo_shard
amount: 1
buy-prices:
1:
economy-plugin: EcoBits
economy-type: quest_points
amount: 5
placeholder: '&b{amount} Quest Points'
start-apply: 0
sell-prices:
1:
economy-plugin: EcoBits
economy-type: quest_points
amount: 5
placeholder: '&b{amount} 任务点数'
start-apply: 0
buy-limits:
global: '-{buy-times-server}+{sell-times-server}'
# Changed line
buy-limits-reset-mode: 'NEVER'
buy-limits-reset-time: '00:00:00'

我们需要修改:

  • [font=Consolas]price-mode[/font] 项设置为 [font=Consolas]ANY[/font] 或 [font=Consolas]ALL[/font];
  • [font=Consolas]buy-limits[/font] 项设置为 [font=Consolas]'-{buy-times-server}+{sell-times-server}'[/font];
  • [font=Consolas]buy-limits-reset-mode[/font] 项设置为 [font=Consolas]'NEVER'[/font]。

第 3 步

如上操作后,你的商品可能会显示这行内容:

服务器购买数量:5/4

第一个数字大于第二个,这是因为 5 代表的是你的购买次数,而 4 才是实际库存数量,如果你觉得它显示很奇怪,你可以修改 config.yml 下的显示格式。 [page] 出售其他插件的物品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
items:
E:
products:
1:
hook-plugin: MMOItems
hook-item: AXE;;EXECUTIONER_AXE
amount: 1
price-mode: ANY
product-mode: ALL
buy-prices:
1:
economy-type: exp
amount: 1
start-apply: 0
placeholder: '1 Exp'
sell-prices:
1:
economy-type: exp
amount: 1
start-apply: 0
placeholder: '1 Exp'

[page] 普通商店

该示例包含出售限制,这意味着玩家每天只能出售 X 次该物品。

  • 出售限制可以帮助你的服务器保持“经济平衡”,即便玩家有 10000 个腐肉,在本示例的商店中他仍然只能出售 64 个该类物品;
  • 在本示例中,VIP 玩家会有 50% 的额外出售上限,这可以让你的服务器拥有更多充值玩家;
  • 在本示例中,出售限制的刷新时间被设置为本地的“0:00:00”,也就是午夜十二点;
  • 在本实例中,我们设置的价格和商品模式有 [font=Cosolas]CLASSIC_[/font] 前缀,这可以提升服务器性能,在你没有对 [font=Consolas]prices[/font] 下 [font=Consolas]start-apply[/font] 的配置进行设置时应当使用该模式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
items:
A:
price-mode: CLASSIC_ALL
product-mode: CLASSIC_ALL
products:
1:
material: rotten_flesh
amount: 1
buy-prices:
1:
economy-plugin: Vault
amount: 10
placeholder: '&6{amount} Coins'
start-apply: 0
sell-prices:
1:
economy-plugin: Vault
amount: 0.8
placeholder: '&6{amount} Coins'
start-apply: 0
sell-limits:
global: 1280
default: 64
vip: 192
sell-limits-conditions:
vip:
- 'permission: group.vip'
sell-limits-reset-mode: 'TIMED'
sell-limits-reset-time: '00:00:00'

[page] 货币兑换

在本示例中,我们在商店中放置的商品与普通商品有如下不同:

  • 我们添加了 [font=Consolas]display-item[/font] 部分的配置,因为本示例中出售的物品不是真实物品;
  • 我们将价格和商品模式设置为了没有 [font=Consolas]CLASSIC_[/font] 前缀的类型,因为我们将 start-apply 项设置为了其他值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
items:
A:
display-item:
material: GOLDEN_BLOCK
price-mode: ALL
product-mode: ANY
products:
1:
economy-plugin: PlayerPoints
amount: 1
buy-prices:
1:
economy-plugin: Vault
amount: 10
placeholder: '&6{amount} 枚金币'
apply: [1,2,3,4,5]
1:
economy-plugin: Vault
amount: 20
placeholder: '&6{amount} 枚金币'
start-apply: 6
buy-limits:
global: 1000
default: 10
vip: 20
buy-limits-conditions:
vip:
- 'permission: group.vip'
buy-limits-reset-mode: 'TIMED'
buy-limits-reset-time: '00:00:00'

[page] [page] 开发教程

获取商店对象

1
ConfigManager.configmanager.shopConfigs.get(shopID);

获取商品对象

1
2
3
4
5
6
ObjectShop shop = ConfigManager.configmanager.shopConfigs.get(shopID);
if (shop == null) {
return;
}
ObjectItem item = shop.getProduct("TEST");
List<ObjectItem> items = shop.getProductList();

开始购买商品

1
BuyProductMethod.startBuy(Inventory inventory, String shop, String product, Player player, boolean quick, boolean test, int multi);
  • inventory 为 Bukkit 提供的 inventory 对象,对于玩家的背包,请使用 player.getInventory() 方法;
  • shop 即为商店 ID;
  • product 即为商品 ID;
  • quick 即为是否在购买后发送消息(即便 config.yml 中禁用了 send-message-after-buy 也会发送);
  • test 即为是否在购买后拿走玩家的钱,若你想知道玩家是否有足够的钱请将其设置为 true;
  • multi 为单次购买的数量,默认为 1.

开始出售商品

1
SellProductMethod.startSell(Inventory inventory, String shop, String product, Player player, boolean quick, boolean test, boolean ableMaxSell, int multi);
  • ableMaxSell 即为玩家如果没有足够的钱买得起当前 multi(数量)的物品时,是否自动获取玩家能够购买的最大数量。一般用于全部出售命令;

获取玩家缓存对象

1
CacheManager.cacheManager.playerCacheMap.get(player);

可以通过这个对象获取玩家的购买次数,出售时间等相关的数据。

获取服务器缓存对象

1
CacheManager.cacheManager.serverCache;

[page] 做不到的事情

  • 尚不能获取指定 ItemStack 对象的价格,因为 UltimateShop 是一个支持多物品的商店插件;
  • 我们不能获取指定玩家的价格翻倍量,因为 UltimateShop 支持用户通过不同翻倍量从而获得不同的交易价格。

[page]

翻译作者:SnowCutieOwO 发布时间:2023/11/8 最后更新:2023/11/8 翻译字数:9863


  1. /font ↩︎