[MD] # MEBSociety v2.1.0 更新日志 --- ## 🎉 重大更新:NBT 自定义物品商店支持 MEBSociety商店系统现在支持购买 NBT 自定义物品! --- ## ✨ 新增功能 ### 1. 商店支持 NBT 物品 商店现在可以正确存储和还原带有 NBT 数据的自定义物品: - ✅ **完整保存物品属性**:名称、描述、附魔、特殊效果、耐久度等 - ✅ **购买即可使用**:玩家购买后获得功能完整的自定义物品 ### 2. API 增强 #### `addItemShop()` 方法升级 ```php public function addItemShop( string $name, string $itemName, int $num, float $buyPrice, float $sellPrice, ?Item $customItem = null // 新增:可选的自定义物品参数 ): int ``` **使用示例**: ```php // 基础物品(旧方式,仍然支持) $shop->addItemShop("钻石", "minecraft:diamond", 1, 1000, 500); // 自定义物品(新方式) $customItem = $itemManager->createItem("flame_sword"); $shop->addItemShop( "§c§l烈焰之剑", // 显示名称 "minecraft:diamond_sword", // 基础物品 1, // 数量 10000, // 购买价格 5000, // 出售价格 $customItem // 自定义物品实例 ); ``` #### 新增 `removeItemShop()` 方法 ```php public function removeItemShop(string $itemName): bool ``` 用于根据物品名称删除商店中的商品(主要用于 MEBCustomItem): **使用示例**: ```php // 删除商店中的自定义物品 $shop->removeItemShop("mebci:flame_sword"); // 返回 true 表示成功删除,false 表示未找到 ``` #### `getShopItem()` 方法增强 现在支持从 NBT 数据还原自定义物品: ```php $item = $shop->getShopItem($shopId); // 返回的物品包含所有自定义属性 ``` --- ## ⚠️ 注意事项 ### 向后兼容 - ✅ 完全兼容旧版本的商店配置 - ✅ 不传入 `$customItem` 参数时,行为与 2.0.9 版本一致 - ✅ 现有商品无需修改,自动兼容 ### 功能限制 - ❌ **自定义物品暂不支持出售**:由于 NBT 数据比对复杂,玩家无法将自定义物品卖回商店 - ⚠️ **自定义物品自动设置为 `可出售: false`** --- ## 📝 修改文件 - `src/MengBao/MEBSociety/Units/Shop.php` - `addItemShop()` - 新增 `$customItem` 参数 - `getShopItem()` - 新增 NBT 数据还原逻辑 --- ## 💡 开发者指南 ### 注册自定义物品到商店 ```php use MengBao\MEBSociety\Main as MEBSociety; // 获取 MEBSociety 实例 $society = $this->getServer()->getPluginManager()->getPlugin("MEBSociety"); if ($society instanceof MEBSociety) { $shop = $society->getShopUnit(); // 创建自定义物品 $item = VanillaItems::DIAMOND_SWORD(); $item->setCustomName("§c§l我的自定义剑"); $item->setLore(["§7这是一把特殊的剑"]); $item->addEnchantment(new EnchantmentInstance(VanillaEnchantments::SHARPNESS(), 5)); // 注册到商店 $shop->addItemShop( "§c§l我的自定义剑", "minecraft:diamond_sword", 1, 5000, 2500, $item // 传入自定义物品实例 ); } ``` [/MD]
[MD] # 更新日志 ## [2.0.9] ### 修复 1.修复营地查询不能为空的问题。 2.修复福利箱附带的游戏币凭空产生、且数量没有上限的问题。现在从营地捐献池扣,池子不够时只发物品并提示。 3.修复VIP/SVIP关闭飞行模式后仍停在空中的问题,现在关闭时会同时结束飞行状态。 ### 优化 1.优化了GUI显示、聊天消息和底部提示栏的配色与格式,提升可读性和视觉效果。 2.底部提示刷新间隔默认由5秒改为15秒,避免过快刷掉其他插件(如MEBTerritory的领地进出提示)的底部消息。 3.VIP/SVIP的「模式切换」按钮更名为「切换飞行模式」,并明确提示开启还是关闭。 ### 新增 1.新增指令 `/mebop gm`,一键切换自己的生存/创造模式,GUI管理面板中也有对应按钮。 2.新增配置项「福利箱游戏币上限」,默认1000。 ### 移除 1.移除营地传送点功能(`/campsite sethome`、`/campsite gohome`)及对应的「设置营地传送点」营地权力,营地传送改由MEBTerritory的营地领地传送承担。启动时会自动清理配置文件中的相关字段与权力。 #### 其他 1.若要应用新聊天和底部格式,请删除 `MsgConfig.yml` 。 2.营地权力ID因移除传送点权力而重排,现为:0 所有权力、1 召集营地成员、2 审核入营申请、3 踢人。 [/MD]
[MD] # 更新日志 ## [2.0.8] 配合 MEBTerritory(领地系统)的功能版本:新增营地等级、营地捐献池、营地福利箱与营地专属物品,商店扩展出专属物品市场。 数据无需迁移,直接替换插件即可。启动时自动补齐新增字段并完成职位名迁移,处理结果记录在日志中。 ### 称呼变更 - 「营长」统一改称「市长」。营地本身的名称不变。 - 启动时自动将数据中的职位名 `营长` 迁移为 `市长`,迁移条数记录在日志中。 - `Campsite::isOwner()` 同时兼容两种职位名。 ### 营地等级 - 营地新增等级,默认上限 10 级,可通过 `CampsiteConfig.yml` 的「营地最大等级」调整。 - 从 n 级升至 n+1 级的费用为「营地升级费用基数 × n」。 - 升级费用从营地捐献池扣除,由市长决定是否升级。 - 捐献记录按金额降序分页展示。 | 指令 | 说明 | | --- | --- | | `/campsite donate <money>` | 向营地捐献池捐献游戏币,完成后向在线成员广播 | | `/campsite pool [page]` | 查看营地等级、捐献池余额、升级所需差额与捐献记录 | | `/campsite upgrade` | 使用捐献池升级营地(**仅市长**) | ### 营地专属物品 - 每提升一级解锁一种营地专属物品,该物品为 MEBTerritory 领地升级的必需材料。 - 物品表固定于代码中(`Units/CampsiteItem.php`),不提供配置项。难度调节请使用营地升级费用与福利箱相关配置。 - 物品为原版物品附加自定义名称与 lore 标记,可正常丢弃、存放与交易。 - 物品识别依据 lore 标记,不依据自定义名称,改名后仍可识别;标识不在物品表内的伪造标记不予识别。 | 解锁等级 | 标识 | 名称 | 基准价 | | --- | --- | --- | --- | | 1 | `camp_stone` | 营地基石 | 800 | | 2 | `camp_timber` | 营地梁木 | 1600 | | 3 | `camp_iron` | 营地铸铁 | 3200 | | 4 | `camp_glass` | 营地琉璃 | 6000 | | 5 | `camp_gold` | 营地鎏金 | 11000 | | 6 | `camp_redstone` | 营地红石核 | 20000 | | 7 | `camp_lapis` | 营地青金 | 36000 | | 8 | `camp_diamond` | 营地钻石 | 65000 | | 9 | `camp_emerald` | 营地翠玉 | 120000 | | 10 | `camp_crown` | 营地冠冕 | 220000 | ### 营地福利箱 - 市长可设置福利箱内容,成员每周领取一次。 - 福利箱仅可放入营地已解锁的专属物品。 - 按自然周发放,每周一切换,以 ISO 年与周号记录领取状态,无需定时任务清理。 - 发放前整体校验背包容量,容量不足时不予发放。 | 指令 | 说明 | | --- | --- | | `/campsite welfare` | 查看福利箱内容、本周领取状态与已解锁的专属物品 | | `/campsite welfare set <item_key> <num>` | 设置某种专属物品每人每周可领数量,`0` 为移出福利箱(**仅市长**) | | `/campsite welfare money <money>` | 设置福利箱附带的游戏币(**仅市长**) | | `/campsite claim` | 领取本周福利箱 | ### 商店扩展 商店由「常规物品买卖」扩展为「常规物品买卖 + 营地专属物品市场」,两者为独立的交易模型。 | | 常规商品 | 营地专属物品 | | --- | --- | --- | | 货源 | 服务器无限供货 | 仅玩家挂卖 | | 购买 | 不受存货限制 | 存货为 0 时不可购买 | | 出售 | 出售给服务器 | 挂卖至市场供其他玩家购买 | | 指令 | 说明 | | --- | --- | | `/mebshop camp [list]` | 查看专属物品市场的解锁等级、买价、卖价与当前存货 | | `/mebshop camp sell <item_key> <num>` | 将专属物品挂卖至市场 | | `/mebshop camp buy <item_key> <num>` | 从市场购买专属物品 | - 专属物品的买价须高于卖价,默认系数为 1.25 / 0.8,差价由系统收取。 ### GUI - 营地系统导航新增「营地等级与捐献池」「营地福利箱」入口。 - 商店系统导航新增「营地专属物品市场」入口,支持按数量买卖。 - 市长专属操作的按钮仅对市长显示。 - 福利箱物品设置的下拉框仅列出已解锁的物品,未解锁物品同时在提交时校验。 ### 新增配置项 `CampsiteConfig.yml`: | 键 | 默认 | 说明 | | --- | --- | --- | | 营地最大等级 | 10 | 每级解锁一种营地专属物品 | | 营地升级费用基数 | 50000 | 从 n 级升至 n+1 级的费用 = 基数 × n | | 福利箱每种物品数量上限 | 8 | 每人每周可领取的上限 | `ShopConfig.yml`: | 键 | 默认 | 说明 | | --- | --- | --- | | 营地专属物品出售价格系数 | 0.8 | 与物品基准价相乘得到卖价 | | 营地专属物品购买价格系数 | 1.25 | 与物品基准价相乘得到买价,须大于出售系数 | `MultiWorldConfig.yml`: | 键 | 默认 | 说明 | | --- | --- | --- | | 自动加载全部世界 | `true` | 开服时自动加载 `worlds` 内已生成的世界 | ### 数据变更 - 新增 `CampMarket.yml`,记录营地专属物品市场的存货。 - `Campsites.yml` 的营地条目新增 `level`、`donation`、`welfare` 三个字段,启动时自动为存量营地补齐,补齐数量记录在日志中。 ### 修复 - 修复多世界需手动加载的问题。开服时自动加载 `worlds` 内已生成的全部世界,无需每次开服手动执行 `/mw load`。新增配置项「自动加载全部世界」(默认 `true`),关闭后维持原有行为。加载数量与失败的世界名记录在日志中。 - 修复「是否已加载」字段与实际加载状态不一致的问题。该字段改为按世界的真实加载状态回写。 - 修复世界条目在每次启动时被整条覆盖、导致自定义「描述」丢失的问题。初始化改为仅补齐新增世界,已有条目保留原值。 - 修复世界目录使用相对路径 `./worlds` 扫描,在工作目录非服务端根目录时无法扫描到世界的问题。改为基于核心提供的数据目录拼接路径,并仅识别文件夹。 ### 对接说明 MEBTerritory 通过 `Units/CampsiteLevel.php` 与 `Units/CampsiteItem.php` 读取营地等级与专属物品。使用 MEBTerritory 时两个插件需同时升级;MEBTerritory 检测到 2.0.7 及更早版本时会输出警告,并将领地升级降级为仅收取游戏币。 [/MD]
[MD] ## [2.0.7] Bug 修复版,直接替换插件即可。 ### Bug 修复 - **新增物品商品时,物品名带空格会报"<num>必须为正整数"。** 修复后的支持格式: ``` /mebshop additem white wool 1 1000 500 /mebshop additem "white wool" 1 1000 500 /mebshop additem light blue stained glass 2 50 25 ``` - **`/mebshop addpre` 同步修复,不再禁止称号里带空格。** [/MD]
[MD] # 更新日志 ## [2.0.6] 本次更新补上了**GUI 商店系统**,旧数据不受影响,直接替换插件即可。 ### 新增:商店系统 商店把物品和称号放在同一张表里,用商品 ID(SID)索引,同一件商品的买价和卖价写在一起。 新增配置文件: - `ShopConfig.yml` —— `op是否可以管理商店`、`每页显示的商品数量`、`自动推导商品图标` - `Shops.yml` —— 商品表,首次生成时会带两条样例商品(钻石、称号"萌新") 商品字段: | 字段 | 说明 | | --- | --- | | `类型` | `item` 物品 / `prefix` 称号 | | `名称` | 展示名,留空则用物品自己的名字或称号顶上 | | `物品` | 物品名,严格遵循核心内部定义的物品英文名称,如 `diamond`。| | `数量` | 每份包含的物品个数 | | `称号` | 称号内容,仅 `prefix` 用 | | `购买单价` / `出售单价` | 单个物品的价格,总价 = 单价 × 数量 × 份数 | | `可购买` / `可出售` | 上下架开关,称号恒为只卖不收 | | `图标类型` / `图标` | `-1` 无图标(交给自动推导)/ `0` 材质路径 / `1` 网络 url | 新增指令 `/mebshop`: ``` /mebshop list <page> 查看全部商品 /mebshop info <shop_id> 查看商品详情 /mebshop buy <shop_id> <times> 购买商品 /mebshop sell <shop_id> <times> 出售商品 /mebshop additem <item_name> <num> <buy> <sell> 新增物品商品 /mebshop addpre <prefix> <buy> 新增称号商品 /mebshop del <shop_id> 删除商品 /mebshop switch <shop_id> <buy/sell> 开关商品的购买/出售 /mebshop icon <shop_id> <path/url/auto> <address> 设置商品图标 /mebshop opshop 开关 op 管理商店的权限 ``` GUI 入口在 `/mebui` → 商店系统,分为购买物品 / 出售物品 / 购买称号 / 查看全部商品, 有管理权限时额外显示"商店管理"。商品列表按 `每页显示的商品数量` 分页, 翻页按钮只在真的有上下页时才出现。 细节问题: - **先确认背包放得下再扣钱**,避免出现钱扣了东西没拿到。 - 购买称号前检查是否已拥有,不会重复塞同一个称号。 - 商品被删除后 ID 会留空档,所以下拉框传给指令的是真正的商品 ID,不是选项下标。 - 物品名解析不出来时,新增商品仍然成功但会给管理员一条警告,玩家侧则直接提示"无法识别",但不会抛异常,不会使服务器崩溃。 - 新增称号商品时挡住带空格的称号,否则会被指令拆成多个参数。 ### 商品按钮显示图标 商品列表的按钮现在带图标,图标有三种来源,优先级从高到低: 1. `Shops.yml` 里手动配的 `图标类型` + `图标` 2. `自动推导商品图标` 为 `true` 时,按物品名拼材质路径 3. 都没有 → 不显示图标,按钮照常能点 自动推导的规则是:方块拼 `textures/blocks/<物品名>`,其他物品拼 `textures/items/<物品名>`,物品名的归一化方式和 `StringToItemParser` 一致(去 `minecraft:` 前缀、空格转下划线、转小写)。 **这个推导只能覆盖一部分物品** 原版里材质名和物品名不一致的情况不少(一个物品对应多张图、材质名带后缀等),拼错的结果是那个按钮没有图标,但不影响买卖。 要精确控制就用 `/mebshop icon <shop_id> path textures/items/xxx` 手动指定,或在 GUI 的「商店管理 → 设置商品图标」里填;填 `auto` 可以恢复成自动推导。 称号商品没有对应材质,不参与推导。 ### 物品匹配逻辑 **第一层,配置 → 物品:靠名称字符串匹配。** `Shops.yml` 里的 `物品` 字段是纯文本,交给 `StringToItemParser::parse()` 换成物品对象。 查表前会归一化:`trim` → 去掉 `minecraft:` 前缀 → 空格转下划线 → 转小写。 所以 `diamond`、`Diamond`、`minecraft:diamond`、`white wool` 都能正确解析。 不再支持数字 ID 匹配(如旧版的 `264:0`)。 **第二层,物品 → 背包:不看名称,比的是 `stateId` + NBT。** 名称只在第一层用一次,之后所有比对都走 `Item::equals()`,比的是数字类型 ID、状态数据和 NBT。 #### 购买 流程:解析物品 → 算总价 → 查游戏币 → `canAddItem()` → 扣钱 → `addItem()`。 #### 出售 遍历背包,用 `equals($item, true, true)` 强制连 NBT 一起比,只统计和扣除干净的物品。 扣除时逐槽位减 count 后写回,count 减到 0 时会自动把槽位置为空气。 同时保留一次"不比 NBT"的统计,用来区分两种失败: - 同类物品本身就不够 → `§c你的物品数量不足!` - 同类够、但干净的不够 → `§c该物品被修改过,无法出售!` 分开提示是因为后者如果笼统报"数量不足",玩家看着满背包钻石会以为插件坏了。 **注意**:判定标准是"有没有 NBT",不是"是不是附魔品"。 玩家自己给物品改过名、或物品带任何 NBT,都会被拒收。 ### Bug 修复 - `ArrayPage` 在元素个数刚好被每页数量整除时多报一页(例如 10 条、每页 5 条会算成 3 页), 翻到那一页会取到不存在的下标;空数组现在也按 1 页算,不再出现"页码不合理(1~0)"这种提示。 受影响的还有营地入营申请、世界列表、op 列表、vip / svip 列表和游戏币排行榜的分页。 - `Players::getPlayerAllPrefixes` 在玩家称号表缺失时返回 `false`, 调用方的 `foreach` / `in_array` 会报类型错误,现在统一返回空数组。 - `Players::addPrefix` 在玩家称号表还没建好时 `array_push` 会报错,现在先补一个空数组。 [/MD]
[MD] # 更新日志 ## [2.0.5] 本次更新包含**插件更名**和 **GUI 底层重构**,属于不兼容更新,升级前请先阅读"升级步骤"。 ### ⚠️ 重要变更 1. **插件更名**:`MEBsociety` → `MEBSociety`(S 大写)。命名空间同步改为 `MengBao\MEBSociety`。 2. **新增硬依赖 MEBForms**:`plugin.yml` 加入 `depend: [MEBForms]`,未安装 MEBForms 时插件不会加载。 3. **移除的类**:如果你有插件直接引用了以下类,需要一并调整。 - `Tools\GuiCommand`、`Tools\GuiStack`、`Tools\GuiStackSet` - `Tools\MEBWidgets\*`(MEBButton / MEBInput / MEBToggle / MEBDropdown / MEBLabel / MEBSlider) - `Tools\MEBWindows\*`(MEBForm / MEBCustomForm / MEBConfirmForm) - `Error\GuiError\GuiCommandError` 4. **GuiHandler API 变更**:`handle(int $id, ...)` 已移除,改为语义化方法 (`openMain()` / `openConfirm()` / `openText()` / `openMoney()` …),构造函数现在需要传入插件主类。 `Units\Economy`、`Units\Players` 等对外常用的数据层 API 未变,仅命名空间随更名调整。 ### 升级步骤 1. 安装 **MEBForms**(v1.0.0 及以上)。 2. 删除旧的 `MEBsociety_v2.0.4`插件,放入新的 `MEBSociety_v2.0.5`插件。 3. **把 `plugin_data/MEBsociety/` 重命名为 `plugin_data/MEBSociety/`**。 不改名会导致插件按新名字新建空配置,已有的营地、经济、玩家数据全部失效。 4. 依赖本插件的第三方插件,需把 `getPlugin("MEBsociety")` 和 `\MengBao\MEBsociety\...` 一并改为新名。 ### GUI 重构 GUI 全面改用 MEBForms 表单库,现在表单 ID 由服务端核心分配。 由此修复的 GUI 问题: - **营地菜单的执行逻辑问题** - **"返回上一级"的执行逻辑问题** - **下拉框选项错位问题** - **申请入营时的崩溃问题** - **定点传送参数错位问题** - **下拉框空列表问题** - 确认窗口的三条应答路径(GUI 按钮 / 聊天栏 yes-no / 超时自动拒绝)改为先到先得,重复应答不再重复触发回调,也不会残留处理不掉的请求。 ### 其他 Bug 修复 **经济** - 收款方余额校验失效的问题。 **营地** - `营地召集`的逻辑问题。 - `申请记录`无法删除的问题。 - `加入营地` 时传入非数字营地 ID 抛出异常的问题。 **VIP / SVIP** - `取消 VIP 权限`时导致数据损坏的问题。 - SVIP 和 VIP 名单混淆问题。 - SVIP 和 VIP 配置混淆问题。 **同居** - `申请同居`时玩家名大小写混淆问题[COLOR=rgb(255, 255, 255)]。 - 新增不能与自己同居的判断。[/COLOR] **OP / 其他** - 导航物品原先解析 `340:99`,该写法在 PM5 下会抛异常,玩家进服即可能崩溃, 现改用 `book` 并增加空值判断。 - 离线消息未及时写入配置的问题。 - 聊天格式化在玩家数据尚未初始化时会抛异常,现跳过格式化并沿用默认格式。 [/MD]
新增内容:
1. 新增master权限检测。
修复内容:
1. 修复可能出现的“GuiCommand未找到”的报错;
2. 修复服务器op为空时添加op导致的op表单显示错误的问题;
3. 修复服务器配置文件中op为空时自动添加默认op的问题。
注意事项:
1. 为防止出现未知bug,请删除原BasicConfig.yml配置文件。