主菜单与箱子菜单
主菜单 menu.yml
/cs 打开的主菜单在 plugins/CloudShop/menu.yml,改完 /cs reload。

menu.yml
title: '&8✦ 云商城'
rows: 5
fill: BLACK_STAINED_GLASS_PANE
list-all-shops: true # 没写进 entries 的商店也自动排进来(新建的商店马上出现)
entries:
balance: # 纯展示:没有 shop / action
slot: 4
icon:
material: GOLD_INGOT
name: '&6我的钱包'
lore:
- '&7金币:&f{balance_money}'
- '&7点券:&f{balance_points}'
blocks: # 商店入口:图示与名称默认用商店的 icon / title
slot: 11
shop: blocks
vip:
slot: 13
shop: vip
permission: 'group.vip' # 没有权限的人看不到这个入口
icon:
material: NETHER_STAR
name: '&6VIP 商店'
sell:
slot: 39
action: sell # 出售箱
icon:
material: HOPPER
name: '&a出售箱'
warp:
slot: 44
commands: # 点击执行指令
- 'warp market' # 玩家执行
- '[console] say {player} 去了市场' # 控制台执行
icon: COMPASS
| 键 | 默认 | 说明 |
|---|---|---|
title | &8云商城 | 箱子标题,可用 {balance_<货币>} |
rows | 5 | 1 – 6 行 |
fill | BLACK_STAINED_GLASS_PANE | 底色(留空 = 不填) |
list-all-shops | 默认文件为 true | true = 没写进 entries 的商店也自动排进空格;false = 只显示 entries |
entries | 入口清单;整段不写或留空时,自动列出所有商店 |
每个入口:
| 键 | 说明 |
|---|---|
slot | 格子位置(0 起算) |
shop | 点击打开的商店 ID。商店不在本服开放、或玩家没有进入权限时,这个入口不显示 |
action | sell 出售箱、sell-all 一键卖出背包、close 关闭 |
commands | 点击执行的指令;默认玩家执行,前面加 [console] 由控制台执行;{player} 玩家名 |
icon | 图示:直接写物品(icon: COMPASS),或段落 material、name、lore;物品可以用任何 物品来源 |
permission | 有这个权限才显示 |
商店入口会自动在说明下面加「共 N 件商品 / ▸ 点击进入」(messages.yml 的 menu.main-shop-lore);商店有全店折扣或特卖时多一行「✦ 特卖中 -20%」并发光。
自动排列
entries 留空或开启 list-all-shops 时,商店依 order 排序,从第 2 行到倒数第 2 行、每行中间 7 格依序放入(3 行以下的菜单从第 1 行开始),已经被入口占用的格子会跳过。hidden: true、不在本服开放、玩家没有权限的商店不会出现。
箱子菜单设定
以下都在 config.yml,改完 /cs reload。
点击操作
config.yml
clicks:
left: buy-1
right: sell-1
shift-left: buy-menu
shift-right: sell-all
middle: buy-stack
drop: none
| 操作 | 说明 |
|---|---|
buy-1 | 买一份 |
buy-stack | 买一组(凑满一组的份数,例如每份 16 个 = 买 4 份) |
buy-menu | 打开数量选择(购买) |
sell-1 | 卖一份 |
sell-stack | 卖一组 |
sell-all | 背包里这件商品全部卖出 |
sell-menu | 打开数量选择(出售) |
none | 不做任何事 |
drop 是在商品上按丢弃键(Q)。改了点击操作,记得一起改 messages.yml 的 lore.hint 操作提示。
数量选择

-32 / -8 / -1 / +1 / +8 / +32 调整份数,中间显示「N 份(共 M 个)」与合计金额;「最多」直接调到余额、背包空间、限购剩余、库存都允许的最大值;同时可买可卖的商品可以切换「改为出售 / 改为购买」。
单次最多的份数受 max-per-purchase 限制:
config.yml
# 单次最多买多少「个」(换算成份数;商品可用 max-per-purchase 另外设定份数)
max-per-purchase: 2304
底部按钮
2 行以上的商店,最后一行是按钮栏:
config.yml
layout:
previous: {slot: -9, material: ARROW, name: '&e« 上一页'}
back: {slot: -5, material: OAK_DOOR, name: '&c返回主菜单'}
next: {slot: -1, material: ARROW, name: '&e下一页 »'}
balance:
slot: -7
material: GOLD_INGOT
name: '&6我的余额'
lore:
- '&7金币:&f{balance_money}'
- '&7点券:&f{balance_points}'
sell: {slot: -3, material: HOPPER, name: '&a出售物品', lore: ['&7打开出售箱,放进去的物品', '&7关闭时自动按回收价卖出']}
bar: GRAY_STAINED_GLASS_PANE
slot是负数时从最后一格往前数:-1= 最后一格、-9= 最后一行第一格。也可以写正数。material留空 = 不要这个按钮。上一页 / 下一页只在有上一页 / 下一页时出现。bar是最后一行的底色(留空 = 不填)。- 商品放在按钮的位置时,商品优先,按钮不显示。
- 轮换商店的余额按钮会多 一行「下次轮换」倒数。
出售箱
config.yml
sell:
title: '&8出售箱 · 放入物品后关闭即卖出'
rows: 6 # 2 – 6 行;最后一行是按钮
confirm-all: true # /sell all 先显示确认画面
音效
config.yml
sounds:
open: minecraft:block.chest.open
click: minecraft:ui.button.click
buy: minecraft:entity.experience_orb.pickup
sell: minecraft:block.note_block.pling
fail: minecraft:entity.villager.no
留空 '' = 不播放。资源包的自订音效也可以用。
倒数与刷新
有倒数的商店(轮换、限时折扣、会重置的限购 / 库存、动态价格)打开时会自动刷新,频率依最近的倒数决定:
| 最近的倒数 | 刷新频率 |
|---|---|
| 2 分钟以内 | 每 1 秒 |
| 2 小时以内 | 每 30 秒 |
| 更久 | 每 60 秒 |
没有任何倒数的商店不刷新。买卖之后只重画被买卖的那一格与余额按钮。所有菜单文字都在 messages.yml,见 消息与文字。