Skip to content

PShop是一个商店插件,服主可以在商店中添加固定的售卖和回收物品,支持addon物品,带有箱子商店(仿QuickShop-Hikari)等

前置组件

必选

安装

  • 将文件夹PShop解压到此路径下:BDS/plugins/
  • 更新插件请在保存必要配置文件删除原PShop插件配置目录Planet/PShop/重新启动自动生成配置文件

注册指令说明

/shop

/shop (gui) - 打开总GUI
/shop buy - 打开购买物品GUI
/shop sell - 打开出售物品GUI

/chestshop

/chestshop mgr - 打开面向商店的配置界面
/chestshop delete - 删除商店
/chestshop reload - 重载箱子商店

/pshop

/pshop reload - 重新加载配置文件
/pshop version - 查询版本信息

配置文件说明

更改配置文件请注意 JSON 文件格式,不推荐使用记事本修改配置文件!

本插件有且仅有3个配置文件

config.json文件

js
{
    "version": "4.0.0",//插件版本
    "commands": {
        "shop": {
            "cmd": "shop",//系统商店指令
            "desc": "PShop-系统商店"//指令描述
        },
        "chestshop": {
            "cmd": "chestshop",//箱子商店管理与快捷命令指令
            "desc": "PShop-箱子商店管理与快捷命令"
        },
        "pshop": {
            "cmd": "pshop",//主命令指令
            "desc": "PShop-主命令"
        }
    },
    "prefix": {
        "shop": "[系统商店]",//商店系统前缀
        "chestshop": "[箱子商店]"//箱子商店前缀
    },
    "enable": {
        "shop": true,//是否启用系统商店
        "chestshop": true,//是否启用箱子商店
        "log": true//是否启用log
    },
    "icon": {
        "default": "textures/blocks/missing_tile",//默认图标
        "shop:buy": "textures/ui/MCoin",//购买按钮图标
        "shop:sell": "textures/items/emerald",//出售按钮图标
        "form:back": "textures/ui/icon_import",//返回按钮图标
        "form:confirm": "textures/ui/check",//确认按钮图标
        "form:cancel": "textures/ui/cancel",//取消按钮图标
        "form:prev": "textures/ui/arrow_left",//上一页按钮图标
        "form:next": "textures/ui/arrow_right"//下一页按钮图标
    },//GUI按钮图标,支持材质包路径
    "item_per_page": 6,//GUI每页显示商品数量
    "shop_ignore_aux_default": false,//系统商店默认是否忽略物品数据值(Aux)
    "textures_path": {
        "default": "textures/blocks/missing_tile"//默认材质路径
    },
    "nbt": {
        "MatchBucketEntityCustomName": false,//是否匹配桶装实体的自定义名称,建议关闭
        "MatchRepairCost": false//是否匹配修理的花费,建议保持关闭
    },
    "gamelang": "zh_CN",//游戏语言,匹配bds\resource_packs\vanilla\texts\下的xxx.lang文件名
    "itemtranslateCode": "zh_CN",//物品翻译代码
    "protectChestAndSign": true,//是否保护商店箱子和木牌免受破坏
    "banitems": [
        "minecraft:bedrock"
    ],//不允许交易的物品id列表,可填多个,如["minecraft:bedrock","minecraft:dirt"]
    "update_url": "http://update.mcmap.top/?name=PShop",//更新链接,建议保持默认
    "chestshop_sounds": {
        "success": {
            "sound": "random.orb",//交易成功音效
            "volume": 1,//音量
            "pitch": 1//音调
        },
        "fail": {
            "sound": "mob.villager.no",//交易失败音效
            "volume": 1,
            "pitch": 1
        },
        "create": {
            "sound": "random.levelup",//商店创建成功音效
            "volume": 1,
            "pitch": 1
        },
        "click": {
            "sound": "note.hat",//点击音效
            "volume": 0.8,
            "pitch": 1
        },
        "pending": {
            "sound": "note.pling",//等待输入音效
            "volume": 1,
            "pitch": 1.2
        },
        "timeout": {
            "sound": "note.bass",//超时音效
            "volume": 1,
            "pitch": 0.8
        }
    },//箱子商店音效配置,每组含sound(音效名)、volume(音量)、pitch(音调)
    "keys.cancel": [
        "c",
        "取消",
        "q"
    ]//聊天栏取消交互的关键词列表
}

lang.json文件

js
{
    "update.NewVersion": "检测到{name}的新版本:{version}",
    "update.Notice": "更新公告:{notice}",
    "update.Download": "下载链接:{url}",
    "log.update.error": "检查更新时出现错误:错误码:{code}错误:{result}",
    "command.ori.typeerror": "请不要在命令方块或控制台使用PShop的命令",
    "keys.or": "'或'",
    "form.tip": "提示",
    "form.back": "返回",
    "form.cancel": "取消",
    "form.confirm": "确认",
    "form.action.do": "干",
    "form.action.buy": "买",
    "form.action.sell": "卖",
    "form.group.content": "第 {page}/{totalPages} 页",
    "form.prev_page": "上一页",
    "form.next_page": "下一页",
    "form.shop.main.title": "{prefix.shop}系统商店-主菜单",
    "form.shop.main.content": "来干点什么?",
    "form.shop.main.button.buy": "购买",
    "form.shop.main.button.sell": "出售",
    "form.shop.group.title": "{prefix.shop}{name}§r",
    "form.shop.group.content": "来{action}点什么?",
    "form.item.content.shop": "该商品信息如下:",
    "form.item.content.shop.name": "{prefix.type}名称:{prefix.end}{iname}§r",
    "form.item.content.shop.price": "{prefix.type}价格:{prefix.end}{price}/个",
    "form.item.content.name": "({name}§r)",
    "form.item.content.count": " x{count}",
    "form.item.content.prefix.step": "   ",
    "form.item.content.damage": "{prefix.type}耐久:{prefix.end}{damage}/{maxdamage}",
    "form.item.name": "{prefix.type}物品名称:{prefix.end}{name}§r",
    "form.item.content.lore.step": "|{text}",
    "form.item.content.ench.step": "#{ench}",
    "form.item.potion": "{prefix.type}效果:{prefix.end}{potion}.",
    "form.item.items": "{prefix.type}含有物品:{prefix.end}",
    "form.item.items.step": "{prefix.slot}[{slot}格]{prefix.end}",
    "form.item.items.step.zb": "┗━━",
    "form.shop.buy.item.title": "{prefix.shop}购买商品:{name}",
    "form.shop.buy.item.count": "输入数量,你有{plmoney}{moneyname},可购买{count}个,留空返回",
    "form.shop.buy.item.count.max": "你钱不够!你无法购买{input}个!你最多只能购买:{maxcount}个",
    "form.shop.buy.item.confirm": "你确定要购买{count}个{iname}吗?\n这将会花费{totalCost}{moneyname},你将会剩余{plmoney}{moneyname}",
    "form.shop.buy.item.success": "购买成功!你获得了{plcount}{iname}!\n当前余额:{plmoney}{moneyname}",
    "form.shop.buy.item.fail": "购买失败!你剩余{plmoney}{moneyname}",
    "form.shop.sell.item.title": "{prefix.shop}出售商品:{name}",
    "form.shop.sell.item.count": "输入数量,你有{count}个{iname}§r,留空返回",
    "form.shop.sell.item.count.max": "你最多只能出售{maxcount}个",
    "form.shop.sell.item.confirm": "你确定要出售{count}个{iname}§r吗?\n这将会获得{totalgive} {moneyname},你将会剩余{plcount}个{iname}",
    "form.shop.sell.item.success": "出售成功!你获得了{totalgive}{moneyname}!\n当前余额:{plmoney}{moneyname}",
    "form.shop.item.count.type": "应该输入正整数!可你输入了:{input}",
    "tell.chestshop.count.type": "应该输入正整数!可你输入了:{msg}",
    "tell.chestshop.count.type2": "您现在最多能够{action} {count} 个,可你却输入了:{msg}",
    "tell.chestshop.moneytype": "{prefix.chestshop}价格应该为正整数,可你输入了:{input}",
    "tell.chestshop.moneytype.decimal": "{prefix.chestshop} §c价格必须是大于0的有效数字(支持小数),可你输入了:{input}",
    "log.shop.buy": "购买物品:{item.name} 数量:{quantity} 价格:{totalCost}",
    "log.shop.sell": "出售物品:{item.name} 数量:{quantity} 价格:{totalCost}",
    "prefix.ench": "§d",
    "prefix.count": "§a",
    "prefix.type": "§6",
    "prefix.slot": "§s",
    "prefix.end": "§r",
    "form.chestshop.title": "{prefix.chestshop}",
    "chestshop.system": "系统商店",
    "chestshop.infinite": "无限",
    "chestshop.info": "§u┌-----------------------------\n§u| §c商店信息:\n§u| §a所有者: §r{ownername}\n§u| §a物品信息: §r{item}\n§u| {count}\n§u| §a价格: §e{money}{moneyname}§a/个\n§u└-----------------------------",
    "chestshop.info.form": "§c商店信息:\n§a所有者: §r{ownername}\n§a物品信息: §r{item}\n{count}\n§a价格: §e{money}{moneyname}§a/个",
    "chestshop.info.count": "{action} §fx{count}§r",
    "chestshop.info.count.null": "§c缺货§r",
    "chestshop.info.count.full": "§c箱子已满!§r",
    "chestshop.sign.line1": "§e{plname}§r",
    "chestshop.sign.line2": "{action} §bx{count}§r",
    "chestshop.sign.line2.null": "§c缺货§r",
    "chestshop.sign.line2.full": "§c箱子已满!§r",
    "chestshop.sign.line3": "{itemname}",
    "chestshop.sign.line4": "{money}{moneyname}/个",
    "chestshop.action.buy": "§a收购§r",
    "chestshop.action.sell": "§a出售§r",
    "chestshop.action.plbuy": "§a购买§r",
    "chestshop.action.plsell": "§a出售§r",
    "tell.chestshop.create.money": "{prefix.chestshop}在聊天栏输入价格:  \n{prefix.chestshop}输入 '{keys.cancel}' 取消",
    "tell.chestshop.exit": "{prefix.chestshop}已退出交互",
    "tell.chestshop.trade": "在聊天栏输入你想要 {action} 的数量,您现在能够{action} {count} 个,输入all{action}全部物品",
    "tell.chestshop.sign.notair": "告示牌所在位置:{pos}非空气方块,请你清除",
    "tell.chestshop.create": "{prefix.chestshop} §a商店创建成功!",
    "tell.chestshop.create.checkperm": "{prefix.chestshop} 现在请你打开箱子然后再次关闭完成创建(仅供校验权限)!",
    "form.chestshop.buy.title": "{prefix.chestshop} 确认购买: {name}",
    "form.chestshop.buy.confirm": "你确定要向该商店购买 {count}个 {iname} 吗?\n这将会花费 {totalCost} {moneyname}, 你的余额将剩余 {plmoney} {moneyname}",
    "form.chestshop.sell.title": "{prefix.chestshop} 确认出售: {name}",
    "form.chestshop.sell.confirm": "你确定要向该商店出售 {count}个 {iname} 吗?\n这将会获得 {totalgive} {moneyname}, 你的余额将变为 {plmoney} {moneyname}",
    "form.chestshop.manage.title": "{prefix.chestshop} §l商店配置管理",
    "form.chestshop.manage.label": "您可以在此修改您的箱子商店参数:",
    "form.chestshop.manage.input.price": "商品单价",
    "form.chestshop.manage.input.price.placeholder": "请输入有效数字(支持小数)",
    "form.chestshop.manage.dropdown.type": "商店类型",
    "form.chestshop.manage.switch.showitem": "展示悬浮物品",
    "form.chestshop.manage.switch.hopper_search": "允许漏斗/矿车吸出物品",
    "form.chestshop.manage.switch.hopper_push": "允许漏斗/矿车注入物品",
    "tell.chestshop.manage.success": "{prefix.chestshop} §a商店配置已成功更新!",
    "form.chestshop.manage.switch.delete": "§c删除该商店 (危险操作)§r",
    "tell.chestshop.manage.delete.success": "{prefix.chestshop} §a商店已成功删除!",
    "notice.shop.income": "{prefix.chestshop} §a[收益通知] 您位于 §e{pos} §a的商店售出了 {count}个 {itemname}!",
    "notice.shop.empty": "{prefix.chestshop} §c[库存警告] 您位于 §e{pos} §c的商店(出售:{itemname}) 已经 §l脱销了§r§c,请及时补货!",
    "notice.shop.full": "{prefix.chestshop} §c[空间警告] 您位于 §e{pos} §c的商店(收购:{itemname}) 已经 §l没有剩余空间了§r§c,请及时清理!",
    "notice.shop.expense": "{prefix.chestshop} §e[支出通知] 您位于 §e{pos} §e的商店收购了 {count}个 {itemname},共支出 {money}{moneyname}!",
    "tell.chestshop.buy.success": "{prefix.chestshop} §a购买成功! 你花费了 {totalCost}{moneyname} 购买了 {iname}, 当前余额: {plmoney}{moneyname}",
    "tell.chestshop.buy.fail": "{prefix.chestshop} §c购买失败! 可能是商店库存不足或你的背包已满.",
    "tell.chestshop.sell.success": "{prefix.chestshop} §a出售成功! 你出售了 {iname}, 获得了 {totalgive}{moneyname}, 当前余额: {plmoney}{moneyname}",
    "tell.chestshop.sell.fail": "{prefix.chestshop} §c出售失败! 可能是商店空间已满或你的物品不足.",
    "tell.chestshop.error.block": "§c无法获取箱子方块(请确保商店所在区块已加载)!",
    "tell.chestshop.error.container": "§c无法访问箱子容器(该方块可能已不是箱子或被破坏)!",
    "tell.chestshop.error.system": "§c交易期间发生系统错误,请联系管理员查看控制台日志!",
    "form.chestshop.manage.label.op": "\n§d[OP]§r 当前所有者: §e{ownername}§r\n(UUID: {uuid})",
    "form.chestshop.manage.switch.system_shop": "§d[OP]§r 设为系统商店 (无限库存/无视所有者)",
    "log.chestshop.create": "创建箱子商店 位置:{pos} 物品:{item.name} 价格:{money}",
    "log.chestshop.buy": "在箱子商店购买 位置:{pos} 店主:{owner} 物品:{item.name} 数量:{quantity} 总花费:{totalCost}",
    "log.chestshop.sell": "向箱子商店出售 位置:{pos} 店主:{owner} 物品:{item.name} 数量:{quantity} 总收益:{totalCost}",
    "log.chestshop.delete": "删除箱子商店 位置:{pos} ID:{shopid}",
    "command.chestshop.reload.success": "§a[PShop] 数据重载成功!",
    "command.chestshop.reload.fail": "§c[PShop] 数据重载失败!",
    "command.chestshop.permission.denied": "§c权限不足!你没有执行此操作的权限.",
    "command.chestshop.target.invalid": "§c错误:请准心对准您的箱子商店或木牌再执行此命令!",
    "command.chestshop.target.not_shop": "§c错误:该方块不是有效的箱子商店!"
}

shopdata.json文件

js
{
    "Buy": [//购买配置
        {
            "name": "示例",//名字
            "type": "group",//类别,仅有item和group可选
            "image": "",//图片,详见:和config的icon一样
            "data": [//数据,item模式使用[{数据}],group使用[{数据},{数据}]
                {
                    "name": "示例(苹果)",
                    "type": "item",
                    "image": "",
                    "data": [
                        {
                            "id": "minecraft:apple",//物品id,要有命名空间前缀
                            "aux": 0,//数据值
                            "money": 10//单个的价格
                        }
                    ]
                }
            ]
        },
        {
            "name": "示例2",
            "type": "group",
            "image": "",
            "data": [
                {
                    "name": "盒子",
                    "type": "item",
                    "image": "",
                    "data": [
                        {
                            "snbt": true,//SNBT模式,设为true时使用snbtstr定义物品
                            "snbtstr": "{\"Block\":{\"name\":\"minecraft:undyed_shulker_box\",...},\"Count\":1b,...}",//SNBT物品字符串,支持附魔、自定义名称、容器内物品等复杂NBT
                            "money": 10
                        }
                    ]
                }
            ]
        }
    ],
    "Sell": [//出售配置,同Buy
        {
            "name": "示例",
            "type": "group",
            "image": "",
            "data": [
                {
                    "name": "示例(苹果)",
                    "type": "item",
                    "image": "",
                    "data": [
                        {
                            "snbt": true,//SNBT模式也支持出售配置
                            "snbtstr": "{\"Count\":64b,\"Damage\":0s,\"Name\":\"minecraft:apple\",\"WasPickedUp\":0b}",
                            "money": 10
                        }
                    ]
                }
            ]
        },
        {
            "name": "示例2",
            "type": "group",
            "image": "",
            "data": [
                {
                    "name": "示例(羊毛)",
                    "type": "item",
                    "image": "",
                    "data": [
                        {
                            "id": "minecraft:white_wool",
                            "aux": 0,
                            "auxStrict": true,//是否严格匹配数据值,启用后仅匹配指定aux的物品
                            "money": 10
                        }
                    ]
                }
            ]
        }
    ]
}

商品配置支持两种模式:

  1. 普通模式 - 使用id+aux+money定义简单物品,出售时可使用auxStrict严格匹配数据值
  2. SNBT模式 - 设"snbt": true,通过snbtstr定义含附魔、自定义名称、容器物品等复杂NBT的物品

导出接口

目前没有导出接口哦:(((