跳到主要内容

FreeMinecraftModels 家具商店

如需仅允许购买,请在 config.yml 中设置 registerCraftingRecipes: false 并重启。有效且启用的条目仍留在商店目录中,但会从 Bukkit 合成和玩家的 /fmm 可合成物品菜单中移除。该设置默认为 true。

FreeMinecraftModels 附带一个可选的、基于 Vault 的商店,让玩家可以用游戏内货币购买可合成的道具。该商店默认禁用 —— 仅当显式启用且存在 Vault 经济提供方时才会注册自身。

快速设置​

  1. 安装 Vault 以及兼容 Vault 的经济提供方(EssentialsX、CMI 等)。
  2. 启动服务器一次,使 plugins/FreeMinecraftModels/shop_config.yml 得以生成。
  3. 在 shop_config.yml 中设置 enabled: true。
  4. 重启服务器或成功完成 /fmm reload;商店在完整初始化时注册。
  5. 在游戏内运行 /fmm shop 以确认菜单可以打开。

缺少任何前置条件时,商店子命令都不会注册,因此其处理器不会使用可配置的禁用消息。如果商店已启用但缺少 Vault 或其经济提供者,FMM 会记录具体警告。

工作原理​

  • 商店从 plugins/FreeMinecraftModels/recipes/ 读取配方。
  • 商店列出已加载且满足 isEnabled: true 和 shopEnabled: true 的配方。配方作为一个整体目录加载:YAML 语法错误、同一 model_id 存在两个启用的配方文件,或服务器拒绝某个配方,都会导致整个目录加载失败,而不只是丢弃一个条目,因此请在 /fmm reload 后检查控制台。禁用合成时,注册仍会构建并验证配方
  • 每个条目使用纸质展示物品,在可用时显示模型外观,并附有价格、购买提示及模型 ID。购买后得到模型的纸质放置物品;这条路径不会根据 material: 和附魔创建作者定义的武器
  • 点击条目会调用 PurchaseHandler,它通过 Vault 检查玩家余额、扣款,并将放置物品给予玩家。背包放不下的物品会掉落在玩家脚下。

权限​

权限默认描述
freeminecraftmodels.shoptrue打开商店所需。默认为 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
字段默认值行为
shopEnabledtrue为 false 时隐藏购买。合成仍取决于配方启用状态及 registerCraftingRecipes
shopPriceshop_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 重新启用商店。