FreeMinecraftModels 家具商店
如需仅允许购买,请在 config.yml 中设置 registerCraftingRecipes: false 并重启。有效且启用的条目仍留在商店目录中,但会从 Bukkit 合成和玩家的 /fmm 可合成物品菜单中移除。该设置默认为 true。
FreeMinecraftModels 附带一个可选的、基于 Vault 的商店,让玩家可以用游戏内货币购买可合成的道具。该商店默认禁用 —— 仅当显式启用且存在 Vault 经济提供方时才会注册自身。
快速设置
- 安装 Vault 以及兼容 Vault 的经济提供方(EssentialsX、CMI 等)。
- 启动服务器一次,使
plugins/FreeMinecraftModels/shop_config.yml得以生成。 - 在
shop_config.yml中设置enabled: true。 - 重启服务器或成功完成
/fmm reload;商店在完整初始化时注册。 - 在游戏内运行
/fmm shop以确认菜单可以打开。
缺少任何前置条件时,商店子命令都不会注册,因此其处理器不会使用可配置的禁用消息。如果商店已启用但缺少 Vault 或其经济提供者,FMM 会记录具体警告。
工作原理
- 商店从
plugins/FreeMinecraftModels/recipes/读取配方。 - 商店列出已加载且满足
isEnabled: true和shopEnabled: true的配方。配方作为一个整体目录加载:YAML 语法错误、同一model_id存在两个启用的配方文件,或服务器拒绝某个配方,都会导致整个目录加载失败,而不只是丢弃一个条目,因此请在/fmm reload后检查控制台。禁用合成时,注册仍会构建并验证配方 - 每个条目使用纸质展示物品,在可用时显示模型外观,并附有价格、购买提示及模型 ID。购买后得到模型的纸质放置物品;这条路径不会根据
material:和附魔创建作者定义的武器 - 点击条目会调用
PurchaseHandler,它通过 Vault 检查玩家余额、扣款,并将放置物品给予玩家。背包放不下的物品会掉落在玩家脚下。
权限
| 权限 | 默认 | 描述 |
|---|---|---|
freeminecraftmodels.shop | true | 打开商店所需。默认为 true,因此所有玩家都可浏览 |
仅有权限不能让商店启用 —— 仍需 shop_config.yml 中 enabled: true 以及可用的经济提供方。
shop_config.yml
完整键参考见 配置页面。关键的键有:
enabled—— 总开关(默认false)defaultPrice—— 缺少shopPrice的配方所用默认值;非正数回退到100.0。修改它不会替换现有配方价格menuTitle、priceLoreFormat、clickToBuyLoreFormat—— 视觉样式messages.*—— 五条可自定义的反馈消息
所有消息字符串都支持 & 颜色代码以及配置参考中列出的占位符。
每条配方的字段
plugins/FreeMinecraftModels/recipes/<model_id>.yml 中的每条配方都带有两个商店特有字段:
isEnabled: true
model_id: "wooden_chair"
shape:
- "L L"
- "LLL"
- "L L"
ingredients:
L: OAK_LOG
shopEnabled: true
shopPrice: 250.0
| 字段 | 默认值 | 行为 |
|---|---|---|
shopEnabled | true | 为 false 时隐藏购买。合成仍取决于配方启用状态及 registerCraftingRecipes |
shopPrice | shop_config.yml 中的 defaultPrice | 玩家点击物品时的 Vault 货币费用 |
/fmm craftify 编辑器在保存时会写入这两个字段,因此调整价格只需对配方文件做一次文本编辑,再执行 /fmm reload 即可。
购买结果
PurchaseHandler 识别七种结果。前五种映射到 shop_config.yml 中的可配置消息;两条发放失败消息是固定的:
| 结果 | 触发条件 | 消息键 |
|---|---|---|
SUCCESS | 扣款成功且物品装入了背包 | messages.purchaseSuccess |
SUCCESS_WITH_OVERFLOW | 扣款成功但物品不得不掉落在玩家脚下 | messages.purchaseSuccess + messages.inventoryFull |
INSUFFICIENT_FUNDS | 玩家余额低于价格,或底层经济提供方拒绝了扣款 | messages.insufficientFunds |
NOT_FOR_SALE | 配方被禁用、设置了 shopEnabled: false,或其模型未加载 | messages.itemNotForSale |
SHOP_DISABLED | 商店配置或缓存的 Vault 钩子报告禁用 | messages.shopDisabled |
DELIVERY_FAILED_REFUNDED | 扣款成功,但发放失败,未发放部分的金额已退还 | 固定:The item could not be delivered. The undelivered amount was refunded. |
DELIVERY_FAILED_REFUND_PENDING | 扣款成功,但发放失败,且退款失败或无法读取已发放的数量 | 固定:The purchase could not be settled. The shop has been disabled; contact an administrator to review your payment. |
请使用有限且非负的 shopPrice。购买处理器在调用 Vault 前不会校验这些价格。扣款被拒绝的响应会返回 INSUFFICIENT_FUNDS,但这里不会捕获扣款过程中提供者抛出的异常。钩子在初始化时缓存提供者,不会持续检测其移除。
如果扣款后发放过程抛出异常,FMM 会统计这次购买中有多少已进入背包或掉落在地上,并把其余部分的价格退还。若退款失败或无法读取已发放的数量,FMM 会禁用商店,并记录 [FMM Shop] Disabled after unresolved purchase,附带玩家 UUID 和需要核查的金额。商店会保持禁用,直到你核对这笔付款并运行 /fmm reload。
故障排查
/fmm shop 不存在。
商店未注册。请同时确认以下三项:
- 已安装 Vault
- 已注册经济提供方(运行
/balance或/eco来确认有响应) shop_config.yml中enabled: true
然后重启服务器或完成 /fmm reload。导入器触发的仅内容重载不会重新初始化商店配置或注册其命令。
菜单中缺少我期望看到的物品。
打开 plugins/FreeMinecraftModels/recipes/ 中的配方文件,确认 isEnabled 和 shopEnabled 均为 true。编辑后运行 /fmm reload。
玩家被扣款但没有得到物品。
检查玩家脚下是否有因背包满而掉落的物品,并查看点击时的控制台。扣款被拒绝的响应会返回 INSUFFICIENT_FUNDS;扣款过程中提供者抛出的异常不会转换为该结果。发放失败时会记录 [FMM Shop] Item delivery failed,附带已发放的数量和退款情况。如果控制台显示 [FMM Shop] Disabled after unresolved purchase,说明退款没有成功:请手动处理这笔付款,保留控制台日志及提供者的交易证据,然后运行 /fmm reload 重新启用商店。