From 00fc9040dd734009e16c2ac0a38cfe84db53ad26 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 30 Oct 2026 18:22:16 -0700 Subject: [PATCH 1/2] =?UTF-8?q?docs(zh):=20=E4=B8=8E=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=90=8C=E6=AD=A5=20(#80,=20#83,=20#103,=20#?= =?UTF-8?q?106,=20#108=E2=80=93#110,=20#112,=20#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 IslandStats 页面 (1.0.0) 并加入导航 - Limits:自动实体重新计数、limits:exempt 豁免、1.30.1/1.30.2 更新日志,章节顺序与英文版一致 - Level 2.29.0(按岛屿记录死亡、donations-only)、InvSwitcher(与其他物品栏插件的冲突)、Greenhouses(自定义生物生成、1.10.1/1.10.2) - ControlPanel 1.16.1(template-file、重载行为)、Challenges 1.8.1 - 命令等级面板及 3.23.3 设置面板的变化 - 常见问题:Multiverse 的 auto-load、安全抵达末地 - BentoBox 3.23.4(AdminTools、Templated Panel) - Teams 与 AOneBlock 补齐缺失内容;data/placeholders.csv 新增并翻译占位符行 Co-Authored-By: Claude Opus 5.5 --- data/placeholders.csv | 22 +- data/release-tracker.json | 108 +++--- docs/BentoBox/About/AdminTools.md | 15 +- docs/BentoBox/About/Teams.md | 6 +- .../Island-Protection,-Flags-&-Ranks.md | 61 ++- docs/BentoBox/Placeholders.md | 3 +- docs/FAQ.md | 21 ++ docs/Tutorials/api/Templated-Panel.md | 3 +- docs/addons/Challenges/index.md | 132 ++++--- docs/addons/ControlPanel/index.md | 30 +- docs/addons/Greenhouses/index.md | 56 ++- docs/addons/InvSwitcher/index.md | 38 ++ docs/addons/IslandStats/index.md | 136 +++++++ docs/addons/Level/index.md | 61 ++- docs/addons/Limits/index.md | 181 ++++++--- docs/gamemodes/AOneBlock/index.md | 347 ++++++++++-------- mkdocs.yml | 1 + 17 files changed, 869 insertions(+), 352 deletions(-) create mode 100644 docs/addons/IslandStats/index.md diff --git a/data/placeholders.csv b/data/placeholders.csv index 93a1de1..1fa5ad3 100644 --- a/data/placeholders.csv +++ b/data/placeholders.csv @@ -14,7 +14,7 @@ BentoBox,[gamemode]_island_center_x,岛屿中心的 X 坐标,1.5.0 BentoBox,[gamemode]_island_center_y,岛屿中心的 Y 坐标,1.5.0 BentoBox,[gamemode]_island_center_z,岛屿中心的 Z 坐标,1.5.0 BentoBox,[gamemode]_island_members_max,岛屿可拥有的最大成员数量,1.5.0 -BentoBox,[gamemode]_island_members_count,岛屿上成员、副岛主和岛主的总人数,1.5.0 +BentoBox,[gamemode]_island_members_count,"岛屿上成员、副岛主和岛主的总人数",1.5.0 BentoBox,[gamemode]_island_members_list,岛屿上至少为成员级别的玩家名称列表(逗号分隔),1.13.0 BentoBox,[gamemode]_island_members_list_,玩家第 个岛屿上至少为成员级别的玩家名称列表(逗号分隔),2.3.0 BentoBox,[gamemode]_island_trustees_count,岛屿上受信任玩家的数量,1.5.0 @@ -31,7 +31,7 @@ BentoBox,[gamemode]_visited_island_center_x,玩家当前所在岛屿中心的 X BentoBox,[gamemode]_visited_island_center_y,玩家当前所在岛屿中心的 Y 坐标,1.5.2 BentoBox,[gamemode]_visited_island_center_z,玩家当前所在岛屿中心的 Z 坐标,1.5.2 BentoBox,[gamemode]_visited_island_members_max,玩家当前所在岛屿可拥有的最大成员数量,1.5.2 -BentoBox,[gamemode]_visited_island_members_count,玩家当前所在岛屿上成员、副岛主和岛主的总人数,1.5.2 +BentoBox,[gamemode]_visited_island_members_count,"玩家当前所在岛屿上成员、副岛主和岛主的总人数",1.5.2 BentoBox,[gamemode]_visited_island_members_list,玩家当前所在岛屿上至少为成员级别的玩家名称列表(逗号分隔),1.13.0 BentoBox,[gamemode]_visited_island_trustees_count,玩家当前所在岛屿上受信任玩家的数量,1.5.2 BentoBox,[gamemode]_visited_island_coops_count,玩家当前所在岛屿上合作玩家的数量,1.5.2 @@ -42,7 +42,7 @@ BentoBox,[gamemode]_owns_island,玩家是否为一个岛屿的岛主,1.14.0 BentoBox,[gamemode]_rank,玩家在其岛屿上的权限等级,1.5.0 BentoBox,[gamemode]_resets,玩家重置其岛屿的次数,1.5.0 BentoBox,[gamemode]_resets_left,玩家剩余可重置岛屿的次数,1.5.0 -BentoBox,[gamemode]_deaths,玩家的死亡次数,1.12.0 +BentoBox,[gamemode]_deaths,"玩家在该游戏模式中的死亡次数,由 BentoBox 计数(不是 Level 2.29.0+ 使用的单岛屿计数)",1.12.0 BentoBox,[gamemode]_on_island,玩家是否在其所属岛屿上,1.13.0 BentoBox,[gamemode]_island_online_members_count,当前在线的岛屿成员数量,2.0.1 BentoBox,[gamemode]_visited_island_online_members_count,当前所在岛屿的在线成员数量,2.0.1 @@ -121,6 +121,10 @@ MagicCobblestoneGenerator,[gamemode]_magiccobblestonegenerator_generator_exhaust MagicCobblestoneGenerator,[gamemode]_magiccobblestonegenerator_exhausted_generator_names,玩家岛屿上当前处于耗尽冷却中的生成器名称列表(逗号分隔),2.8.0 Limits,Limits_[gamemode]_island_[material]_count,岛屿上该材料(小写)的当前数量,1.17.2 Limits,Limits_[gamemode]_island_[material]_limit,岛屿上该材料(小写)的数量上限,1.17.2 +Limits,Limits_[gamemode]_island_[material]_base_limit,权限增加前该材料(小写)岛屿的基础上限,1.19.1 +Limits,Limits_[gamemode]_island_[material]_[overworld|nether|end]_count,仅该维度中该材料的当前数量(无后缀占位符是所有维度的总数),1.28.2 +Limits,Limits_[gamemode]_island_[material]_[overworld|nether|end]_limit,该维度中该材料的上限,1.28.2 +Limits,Limits_[gamemode]_island_[material]_[overworld|nether|end]_base_limit,该维度中该材料的基础上限,1.28.2 Limits,Limits_[gamemode]_island_reached_limits,所有维度中达到或超过上限的所有受限方块、实体和实体组列表(逗号分隔),1.29.0 Limits,Limits_[gamemode]_island_reached_limits_overworld,仅主世界中达到或超过上限的列表,1.29.0 Limits,Limits_[gamemode]_island_reached_limits_nether,仅下界中达到或超过上限的列表,1.29.0 @@ -131,16 +135,22 @@ TopBlock,aoneblock_island_phase_name_top_,排行榜第 名所 TopBlock,aoneblock_island_phase_number_top_,排行榜第 名的阶段编号(平原为1,地下为2),1.0.1 TopBlock,aoneblock_island_count_top_,排行榜第 名本轮挖掘的魔法方块数量,1.0.1 TopBlock,aoneblock_island_lifetime_top_,排行榜第 名累计挖掘的魔法方块总量,1.0.1 -Border,Border_color,玩家当前的边界颜色(红/绿/蓝),4.8.0 -InvSwitcher,[gamemode]_invswitcher_balance,玩家在该游戏模式世界中的金钱余额,1.18.0 -InvSwitcher,[gamemode]_invswitcher_balance_formatted,玩家在该游戏模式世界中的金钱余额(带货币名称的格式化显示),1.18.0 TopBlock,chunkblock_island_player_name_top_,排行榜第 名的岛屿所有者名称,2.1.0 TopBlock,chunkblock_island_member_names_top_,排行榜第 名的岛屿团队成员名称,2.1.0 TopBlock,chunkblock_island_phase_name_top_,排行榜第 名所达到的阶段名称,2.1.0 TopBlock,chunkblock_island_phase_number_top_,排行榜第 名的阶段编号(平原为1,地下为2),2.1.0 TopBlock,chunkblock_island_count_top_,排行榜第 名本轮挖掘的魔法方块数量,2.1.0 TopBlock,chunkblock_island_lifetime_top_,排行榜第 名累计挖掘的魔法方块总量,2.1.0 +Border,Border_color,玩家当前的边界颜色(红/绿/蓝),4.8.0 +InvSwitcher,[gamemode]_invswitcher_balance,玩家在该游戏模式世界中的金钱余额,1.18.0 +InvSwitcher,[gamemode]_invswitcher_balance_formatted,玩家在该游戏模式世界中的金钱余额(带货币名称的格式化显示),1.18.0 TradeWinds,tradewinds_rank,玩家的水手等级名称(Deck Hand … Mythic Mariner),0.1.0 TradeWinds,tradewinds_charted,玩家已探明的岛屿数量(含管理员调整),0.1.0 TradeWinds,tradewinds_top_name_<1-10>,探明岛屿排行榜第 <1-10> 名的水手名称,0.1.0 TradeWinds,tradewinds_top_charted_<1-10>,探明岛屿排行榜第 <1-10> 名水手的探明岛屿数量,0.1.0 +IslandStats,[gamemode]_island_kill_entity_total,玩家岛屿上玩家击杀的怪物总数,1.0.0 +IslandStats,[gamemode]_island_kill_entity_,玩家岛屿上特定怪物类型的击杀计数,1.0.0 +IslandStats,[gamemode]_visited_island_kill_entity_total,玩家所在岛屿上玩家击杀的怪物总数,1.0.0 +IslandStats,[gamemode]_island_entity_death_total,玩家岛屿上所有怪物死亡的总数,1.0.0 +IslandStats,[gamemode]_island_entity_death_,玩家岛屿上特定怪物类型的死亡计数,1.0.0 +IslandStats,[gamemode]_visited_island_entity_death_total,玩家所在岛屿上所有怪物死亡的总数,1.0.0 diff --git a/data/release-tracker.json b/data/release-tracker.json index d80c75a..35879c9 100644 --- a/data/release-tracker.json +++ b/data/release-tracker.json @@ -1,203 +1,209 @@ { - "last_run": "2026-07-26T04:16:18Z", + "last_run": "2026-10-17T16:38:41Z", "repos": { "BentoBox": { - "last_checked": "2026-07-26T04:16:18Z", - "last_release": "3.21.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "3.23.4", "doc_path": "BentoBox/", "category": "core" }, "AcidIsland": { - "last_checked": "2026-07-26T04:16:18Z", - "last_release": "2.0.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "2.1.2", "doc_path": "gamemodes/AcidIsland/index.md", "category": "gamemode" }, "AOneBlock": { - "last_checked": "2026-07-26T04:16:18Z", - "last_release": "1.26.2", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.28.0", "doc_path": "gamemodes/AOneBlock/index.md", "category": "gamemode" }, "Boxed": { - "last_checked": "2026-06-01T01:05:19Z", - "last_release": "3.4.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "3.4.1", "doc_path": "gamemodes/Boxed/index.md", "category": "gamemode" }, "BSkyBlock": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.20.0", "doc_path": "gamemodes/BSkyBlock/index.md", "category": "gamemode" }, "CaveBlock": { - "last_checked": "2026-07-08T02:07:59Z", - "last_release": "1.23.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.23.1", "doc_path": "gamemodes/CaveBlock/index.md", "category": "gamemode" }, "poseidon": { - "last_checked": "2026-07-03T00:00:00Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.1.1", "doc_path": "gamemodes/Poseidon/index.md", "category": "gamemode" }, "RaftMode": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "gamemodes/RaftMode/index.md", "category": "gamemode" }, "SkyGrid": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "gamemodes/SkyGrid/index.md", "category": "gamemode" }, "StrangerRealms": { - "last_checked": "2026-05-23T00:37:17Z", - "last_release": "1.0.5", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.0.6", "doc_path": "gamemodes/StrangerRealms/index.md", "category": "gamemode" }, "Bank": { - "last_checked": "2026-07-03T00:00:00Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.10.1", "doc_path": "addons/Bank/index.md", "category": "addon" }, "Biomes": { - "last_checked": "2026-06-16T00:43:25Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "2.3.2", "doc_path": "addons/Biomes/index.md", "category": "addon" }, "Border": { - "last_checked": "2026-06-01T01:05:19Z", - "last_release": "4.8.4", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "4.8.5", "doc_path": "addons/Border/index.md", "category": "addon" }, "Challenges": { - "last_checked": "2026-07-03T00:00:00Z", - "last_release": "1.7.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.8.1", "doc_path": "addons/Challenges/index.md", "category": "addon" }, "Chat": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.4.1", "doc_path": "addons/Chat/index.md", "category": "addon" }, "CheckMeOut": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "addons/CheckMeOut/index.md", "category": "addon" }, "ControlPanel": { - "last_checked": "2026-05-23T00:37:17Z", - "last_release": "", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.16.1", "doc_path": "addons/ControlPanel/index.md", "category": "addon" }, "DimensionalTrees": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.9.0", "doc_path": "addons/DimensionalTrees/index.md", "category": "addon" }, "ExtraMobs": { - "last_checked": "2026-07-26T04:16:18Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.15.0", "doc_path": "addons/ExtraMobs/index.md", "category": "addon" }, "FarmersDance": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "addons/FarmersDance/index.md", "category": "addon" }, "Greenhouses": { - "last_checked": "2026-07-26T04:16:18Z", - "last_release": "1.10.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.10.2", "doc_path": "addons/Greenhouses/index.md", "category": "addon" }, "InvSwitcher": { - "last_checked": "2026-07-03T00:00:00Z", - "last_release": "1.19.1", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.19.3", "doc_path": "addons/InvSwitcher/index.md", "category": "addon" }, "IslandFly": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "addons/IslandFly/index.md", "category": "addon" }, "Level": { - "last_checked": "2026-05-23T00:37:17Z", - "last_release": "2.27.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "2.29.0", "doc_path": "addons/Level/index.md", "category": "addon" }, "Likes": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "addons/Likes/index.md", "category": "addon" }, "Limits": { - "last_checked": "2026-07-26T04:16:18Z", - "last_release": "1.29.1", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.30.2", "doc_path": "addons/Limits/index.md", "category": "addon" }, "MagicCobblestoneGenerator": { - "last_checked": "2026-07-08T02:07:59Z", - "last_release": "2.9.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "2.10.0", "doc_path": "addons/MagicCobblestoneGenerator/index.md", "category": "addon" }, "TopBlock": { - "last_checked": "2026-05-23T00:37:17Z", - "last_release": "2.0.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "2.1.2", "doc_path": "addons/TopBlock/index.md", "category": "addon" }, "TwerkingForTrees": { - "last_checked": "2026-06-04T14:25:55Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.6.0", "doc_path": "addons/TwerkingForTrees/index.md", "category": "addon" }, "Upgrades": { - "last_checked": "2026-06-16T00:43:25Z", - "last_release": "1.0.3", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.0.5", "doc_path": "addons/Upgrades/index.md", "category": "addon" }, "Visit": { - "last_checked": "2026-05-23T00:37:17Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "", "doc_path": "addons/Visit/index.md", "category": "addon" }, "Warps": { - "last_checked": "2026-05-23T00:37:17Z", - "last_release": "1.19.0", + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.19.1", "doc_path": "addons/Warps/index.md", "category": "addon" }, "VoidPortals": { - "last_checked": "2026-06-04T14:25:55Z", + "last_checked": "2026-10-17T16:38:41Z", "last_release": "1.6.1", "doc_path": "addons/VoidPortals/index.md", "category": "addon" + }, + "IslandStats": { + "last_checked": "2026-10-17T16:38:41Z", + "last_release": "1.0.0", + "doc_path": "addons/IslandStats/index.md", + "category": "addon" } } } diff --git a/docs/BentoBox/About/AdminTools.md b/docs/BentoBox/About/AdminTools.md index 8447101..436ce8b 100644 --- a/docs/BentoBox/About/AdminTools.md +++ b/docs/BentoBox/About/AdminTools.md @@ -106,13 +106,24 @@ BentoBox 支持多个数据库后端来存储岛屿和玩家数据: ## 更新日志 -!!! note "v3.23.3 新内容 —— 黑曜石挖取复制修复与命令等级面板" +!!! note "v3.23.4 新内容 —— 安全的末地到达与面板中的物品栏使用" + **发布于:** 2026-10-17 + + 一个 bug 修复版本。没有 `config.yml`、地区或面板模板变化。兼容性:Paper Minecraft 1.21.5 – 26.3,Java 25+。 + + - 🐛 **末地传送门不再把玩家掉进虚空。** 使用 `create-obsidian-platform: false` 时,无论是否有地面,玩家都被直接发送到门户目标。不安全的末地到达现在去最近的安全位置,然后最高的方块,然后是一个小平台。当玩家站在门户内时,重复的门户事件被取消,所以他们不会被发送到原版末地重生点。已经安全的到达仍然会立即传送,启用平台时没有任何变化。安全位置的小平台现在将玩家放在方块的中心。 + - ✨ **当面板打开时使用自己的物品栏。** 玩家可以在 BentoBox 面板(如 `/island settings`)打开时在自己的物品栏中拾起、放置、交换和丢弃物品(Q / Ctrl+Q)并使用包裹。Shift 点击、双击收集和触及面板槽的拖动保持被阻止,所以物品无法进入面板。 + - 🧩 **附属 API:** `PanelListener` 有一个新的默认方法 `allowsPlayerInventoryClicks()`,返回 `false`,所以带有监听器的面板(如 Challenges 和 Biomes 中的图标选择器)表现如前。返回 `true` 来选择加入。见[模板化面板](../../Tutorials/api/Templated-Panel.md#listener-method)。`Addon.getConfig()` 现在在附属没有 `config.yml` 时返回空配置而不是 `null`,所以 `saveConfig()` 不再抛出异常。 + + [发布 v3.23.4](https://github.com/BentoBoxWorld/BentoBox/releases/tag/3.23.4) + +??? note "v3.23.3 新内容 —— 黑曜石挖取复制修复与命令等级面板" **发布于:** 2026-10-03 一个 bug 修复和面板版本。没有 `config.yml` 或地区变化。兼容性:Paper Minecraft 1.21.5 – 26.3,Java 25+。 - 🐛 **黑曜石挖取复制已修复。** 使用 OBSIDIAN_SCOOPING 时,熔岩在点击后一个刻度后被发出,没有重新检查,所以在那个刻度内挖掉黑曜石就会同时获得黑曜石和熔岩,而且将桶移出手可能会不消耗桶而获得熔岩。现在都会重新检查。**建议每个启用了 OBSIDIAN_SCOOPING 的服务器都进行更新。** - - ⚙️ **可自定义的命令等级面板。** 由新的 `panels/command_ranks_panel.yml` 布局(首次启动时写入;游戏模式自己的副本优先),带有 `COMMAND`、`NEXT` 和 `PREVIOUS` 按钮。现在在 45 个命令时分页 — 老面板会悄悄丢掉第 49 个命令之后的每个命令。见[自定义命令等级面板](../Island-Protection,-Flags-&-Ranks.md)。 + - ⚙️ **可自定义的命令等级面板。** 由新的 `panels/command_ranks_panel.yml` 布局(首次启动时写入;游戏模式自己的副本优先),带有 `COMMAND`、`NEXT` 和 `PREVIOUS` 按钮。现在在 45 个命令时分页 — 老面板会悄悄丢掉第 49 个命令之后的每个命令。见[自定义命令等级面板](../Island-Protection,-Flags-&-Ranks.md#customizing-the-command-ranks-panel)。 - ✨ **设置面板改进。** `/island settings` 在玩家最后选择的基础/高级/专家模式下打开,保护和设置标签页共享一种模式(管理面板仍然在专家模式下打开)。命令等级隐藏玩家没有权限的子指令(op 仍然看到一切)。破坏生成器图标不再显示原版的生成蛋工具提示。 - 🐛 **Multiverse `auto-load` 被尊重。** 从 3.22.0 开始,Multiverse 钩子在每次启动时重置 BentoBox 世界的 `auto-load: false`。现在它仅在 BentoBox 首次导入一个世界时设置;现有的 Multiverse 条目保持配置的样子。 - 🧩 **附属 API:** 管理员 `deaths set|add|remove|reset` 指令触发 `PlayerDeathsChangedEvent`(世界、玩家、操作、数量、旧值和新值计数),所以 Level 可以跟踪管理员的改动。不为自然死亡触发。 diff --git a/docs/BentoBox/About/Teams.md b/docs/BentoBox/About/Teams.md index 0673edb..b52d4dd 100644 --- a/docs/BentoBox/About/Teams.md +++ b/docs/BentoBox/About/Teams.md @@ -136,7 +136,8 @@ BentoBox 内置以下团队等级: 邀请者在玩家接受邀请之前失去邀请玩家所需的等级的可能性很小。在这种情况下,接受将不会处理,用户将被告知邀请不再有效。 -**无障碍性:** 默认冷却响应时间在 **BentoBox** 的 `config.yml` 中为所有游戏模式全局设置,为 10 秒。如果您的玩家需要更多时间来确认指令,请延长此值。请记住,在指令模式下按向上箭头将显示上一个指令,因此无需再次输入整个指令来确认。 +!!! tip "确认时间" + 玩家确认指令的默认时间为 10 秒。如果你的玩家需要更多时间,请在 BentoBox 的 `config.yml` 中增加此值。玩家也可以按向上箭头调出上一条指令,而无需重新输入。 **API:** 在完成所有验证检查但在发送邀请之前,将触发 `TeamJoinEvent`。如果此事件被取消,则不会发送邀请。一旦玩家加入岛屿,将根据邀请类型触发后续事件: * `TeamJoinedEvent` 在玩家加入岛屿团队时触发。 @@ -171,6 +172,9 @@ BentoBox 执行以下步骤以使玩家成为团队成员: 11. 将岛屿保存到数据库。 12. 触发通知事件。 +!!! warning "物品栏清理" + 默认情况下,当玩家加入团队时,BentoBox **不会**清理玩家的物品栏,以避免初始设置时出现意外。但是,**管理员应在游戏模式的 `config.yml` 中启用此功能**来防止玩家将物品从旧岛屿携带到新岛屿。检查配置中的 `on-join` 清理设置。 + **重置玩家物品栏** 管理员应将此设置更改为在玩家加入团队时清除玩家的物品栏!之所以不设置它,是为了避免在安装过程中发生事故。一些管理员不明白加入岛屿会清除他们的物品栏,因此我们决定采取"不造成伤害"的方法,让物品栏保持原样。但是,为了避免漏洞,应该清除它。 diff --git a/docs/BentoBox/Island-Protection,-Flags-&-Ranks.md b/docs/BentoBox/Island-Protection,-Flags-&-Ranks.md index acf1294..545a154 100644 --- a/docs/BentoBox/Island-Protection,-Flags-&-Ranks.md +++ b/docs/BentoBox/Island-Protection,-Flags-&-Ranks.md @@ -59,6 +59,9 @@ ![专家保护标志](https://user-images.githubusercontent.com/20014332/80592793-4df96d00-8a20-11ea-891e-8833578642e4.png) +!!! new "BentoBox 3.23.3 更改" + 设置面板会记住每位玩家最后选择的显示模式,并在下次打开时显示该模式。保护和设置选项卡共享一个模式。如果选定模式下某个选项卡没有标志可显示,它会显示下一个模式而不改变玩家的选择。管理员设置面板总是以 `EXPERT` 模式打开。 + ### 隐藏标志 从 [BentoBox 1.4.0](https://github.com/BentoBoxWorld/BentoBox/releases/tag/1.4.0) 开始,管理员可以通过打开设置面板并在要隐藏的标志图标上++shift+左键++来隐藏 GUI 中的标志。 @@ -69,10 +72,18 @@ *玩家查看允许显示的所有基本标志。* +![消失诅咒](https://user-images.githubusercontent.com/20014332/80591692-6799b500-8a1e-11ea-9ab8-e076f47d2220.png) + +*将"消失诅咒"应用于其中一个标志。* + +![一堆隐藏的标志](https://user-images.githubusercontent.com/20014332/80591757-839d5680-8a1e-11ea-8864-83b09252a7b9.png) + +*玩家查看基本标志,"活板门"标志被隐藏。* + ### 自定义设置面板 { #customizing-the-settings-panel } !!! new "BentoBox 3.23.0 新增" - 设置面板由模板文件布局,与其他[可自定义 GUI](/en/latest/Tutorials/generic/Customizable-GUI/) 相同。 + 设置面板由模板文件布局,与其他[可自定义 GUI](/en/latest/Tutorials/generic/Customizable-GUI/)相同。 设置面板的布局来自 `plugins/BentoBox/panels/settings_panel.yml`,BentoBox 首次启动时会生成该文件。游戏模式附属可以在自己的 `panels` 文件夹中提供自己的副本(例如 `plugins/BentoBox/addons/BSkyBlock/panels/settings_panel.yml`),该游戏模式将改用这个副本。默认文件完全还原了之前的面板外观,因此在你编辑它之前不会有任何变化。如果文件无法读取,BentoBox 会记录错误并显示内置面板。 @@ -90,13 +101,53 @@ **描述(lore)布局。** 标志的描述由语言文件中的 `protection.panel.flag-item.description-layout`(保护标志)、`setting-layout`(设置)或 `menu-layout`(打开子面板的标志)构建。从 3.23.0 开始,这些布局可以包含 `[ranks]`(插入保护标志等级列表的位置)和 `[tooltips]`(插入模板中标志按钮 `actions` 工具提示的位置)。没有 `[ranks]` 时,等级列表会像以前一样追加在布局之后;没有 `[tooltips]` 时,工具提示会在一个空行之后追加。要将点击提示移到等级列表下方,请从布局中删除这些提示,把 `[ranks]` 和 `[tooltips]` 放在你想要的位置,并在模板的 `flag_button` 中将提示声明为工具提示。模板中标志按钮自身的 `title` 和 `description` 可以指定另一个语言条目,仅在该面板中用作名称和描述布局。 -![消失诅咒](https://user-images.githubusercontent.com/20014332/80591692-6799b500-8a1e-11ea-9ab8-e076f47d2220.png) +### 命令等级 { #command-ranks } -*将"消失诅咒"应用于其中一个标志。* +**命令等级**图标位于设置选项卡上,打开的面板中岛主可以选择可使用各个队伍指令的最低[等级](#ranks),例如谁可以邀请、踢出或设置岛屿名称。**左键**和**右键**单击指令可在等级之间循环,就像保护标志一样。操作员可以像[隐藏标志](#hide-flags)那样用++shift+左键++从玩家隐藏指令。 -![一堆隐藏的标志](https://user-images.githubusercontent.com/20014332/80591757-839d5680-8a1e-11ea-8864-83b09252a7b9.png) +自 BentoBox 3.23.3 起,玩家只会看到他们有权使用的指令。如果你在服务器上拒绝指令的权限,例如 `[gamemode].island.border`,它也不再出现在此面板中。之前只检查了顶级指令,因此玩家无法运行的子指令仍然被列出。 -*玩家查看基本标志,"活板门"标志被隐藏。* +#### 自定义命令等级面板 { #customizing-the-command-ranks-panel } + +!!! new "BentoBox 3.23.3 新增" + 命令等级面板由模板文件布局,就像[设置面板](#customizing-the-settings-panel)一样。 + +布局来自 `plugins/BentoBox/panels/command_ranks_panel.yml`,BentoBox 首次启动时会生成该文件。游戏模式附属可以在自己的 `panels` 文件夹中提供自己的副本,该游戏模式将改用这个副本。默认文件保持面板看起来与以前一样:每个指令一个地图,没有填充物,仅占用指令需要的行数。如果文件无法读取,BentoBox 会显示内置面板。 + +每个按钮都通过 `data.type` 放置: + +| 类型 | 显示内容 | +| --- | --- | +| `COMMAND` | 分页指令列表中的一个格子。每页放置的指令数量取决于你的需要;默认值为 45。 | +| `NEXT`、`PREVIOUS` | 翻页。仅在有可跳转的页面时显示。 | + +内置面板停止在 49 个指令,因此超过该数量的任何指令都从不显示。模板页面改用此功能。 + +可以在模板的 `reusable` 部分中的 `command_button` 上更改指令的绘制方式: + +- `icon` 替换默认的 `MAP`。 +- `title` 是用作名称布局的语言条目(或文本),而不是 `protection.panel.flag-item.name-layout`。`[name]` 是指令,例如 `/island sethome`。 +- `description` 是用作描述布局的语言条目(或文本),而不是 `protection.panel.flag-item.description-layout`。`[description]` 是来自 `protection.panel.flag-item.command-instructions` 的指令文本。等级列表添加在其后。 +- `actions` 仅添加工具提示,这些工具提示添加在等级列表后。点击本身始终按上述方式工作。默认布局已包含点击提示。 + +例如,要将每个指令显示为纸张并填充空格子: + +```yaml +command_ranks_panel: + title: protection.flags.COMMAND_RANKS.name + type: INVENTORY + background: + icon: LIGHT_BLUE_STAINED_GLASS_PANE + title: "&b&r" + force-shown: 6 + content: + # ... 指令按钮的行数,以及默认文件中的分页按钮 + reusable: + command_button: + icon: PAPER + data: + type: COMMAND +``` ## 等级 diff --git a/docs/BentoBox/Placeholders.md b/docs/BentoBox/Placeholders.md index 7137152..f6207d6 100644 --- a/docs/BentoBox/Placeholders.md +++ b/docs/BentoBox/Placeholders.md @@ -78,7 +78,7 @@ BentoBox使用[**PlaceholderAPI**](https://www.spigotmc.org/resources/placeholde | %[gamemode]_rank% | 玩家在其岛屿上的等级 | 1.5.0 | | %[gamemode]_resets% | 玩家重置岛屿的次数 | 1.5.0 | | %[gamemode]_resets_left% | 玩家可以重置岛屿的次数 | 1.5.0 | -| %[gamemode]_deaths% | 玩家死亡的次数 | 1.12.0 | +| %[gamemode]_deaths% | 玩家在此游戏模式中死亡的次数,由 BentoBox 计数(上限由游戏模式的 `deaths.max` 限制)。这不是自 Level 2.29.0 以来 Level 附属使用的每岛屿死亡计数。 | 1.12.0 | | %[gamemode]_on_island% | 玩家是否在其所属的岛屿上 | 1.13.0 | ### 标志占位符 @@ -112,6 +112,7 @@ BentoBox使用[**PlaceholderAPI**](https://www.spigotmc.org/resources/placeholde - 附加组件 - [Bank](../../addons/Bank/#placeholders) - [Challenges](../../addons/Challenges/#placeholders) + - [IslandStats](../../addons/IslandStats/#placeholders) - [Level](../../addons/Level/#placeholders) - [Likes](../../addons/Likes/#placeholders) - [Limits](../../addons/Limits/#placeholders) diff --git a/docs/FAQ.md b/docs/FAQ.md index c55c79b..c38a0af 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -119,6 +119,8 @@ BentoBox 1.16 中实现了传送门正确链接的选项。但该选项仅在 se 找到 `create-obsidian-platform` 选项并设置为 `true` 以启用正确的末地黑曜石平台(与原版末地相同)。 +如果 `create-obsidian-platform` 为 `false`,BentoBox(3.23.4 及更高版本)会检查玩家到达末地的位置。如果没有地面,它会将玩家发送到最近的安全位置,然后发送到最高的方块,如果两者都不存在,就会建造一个小平台,这样玩家就不会掉进虚空。 + 注意,启用这些选项会开放与原版 Minecraft 相同的无限黑曜石生成漏洞。 ### 如何在 Boxed 中禁用结构生成? @@ -129,6 +131,25 @@ BentoBox 1.16 中实现了传送门正确链接的选项。但该选项仅在 se Multiverse 通常可与大多数游戏模式配合使用,但 **Boxed 和 Poseidon 例外**,这两者需要在 `bukkit.yml` 中设置自己的世界生成器。若对这两者使用 Multiverse,世界将无法正确生成。MyWorlds 是一个常用的替代方案。 +### 为什么其他插件在启动时找不到我的 BentoBox 世界? + +BentoBox 创建和加载自己的游戏模式世界。当它向 Multiverse 注册这些世界时,会设置 `auto-load: false`,这样 Multiverse 就不会首先加载它们。问题在于时序:BentoBox 在第一个服务器计时刻加载其世界,**在**每个插件完成启用**之后**。某个期望 Multiverse 启用后所有世界都存在的插件(全息投影、NPC、传送点、任何在启动时加载已保存位置的内容)将找不到 BentoBox 世界,可能无法在其中加载数据。 + +如果遇到这种情况,让 Multiverse 通过为每个 BentoBox 世界(包括下界和末地)打开 auto-load 来提前加载世界: + +``` +/mv modify bskyblock_world set auto-load true +/mv modify bskyblock_world_nether set auto-load true +/mv modify bskyblock_world_the_end set auto-load true +``` + +使用你自己的世界名称。这些名称列在 `plugins/Multiverse-Core/worlds.yml` 中。 + +BentoBox 仅在第一次注册世界时设置 `auto-load: false`,因此你的设置会跨重新启动保持。这需要 BentoBox 3.23.3 或更高版本。版本 3.22.0 到 3.23.1 会在每次启动时重置为 `false`。 + +!!! warning "Boxed 除外" + 仅对世界生成器在 Multiverse 启用前准备好的游戏模式(如 BSkyBlock、AcidIsland、CaveBlock 和 AOneBlock)执行此操作。**不要**对 Boxed 执行此操作:其生成器依赖于 BentoBox 必须首先创建的种子世界,因此 Multiverse 提前加载的 Boxed 世界将无法正确生成。 + ## 生物、刷怪与实体 ### 为什么我的鱼、海豚或鱿鱼只在 y -63 的基岩附近生成? diff --git a/docs/Tutorials/api/Templated-Panel.md b/docs/Tutorials/api/Templated-Panel.md index 20c114c..881093f 100644 --- a/docs/Tutorials/api/Templated-Panel.md +++ b/docs/Tutorials/api/Templated-Panel.md @@ -91,11 +91,12 @@ TemplatedPanel 系统为 BentoBox 开发者提供了一种流畅而灵活的方 - `parameters(@NonNull String... parameters)`:为面板标题设置参数。返回 `TemplatedPanelBuilder` 实例以进行链式调用。自 1.20.0 版本可用。 - 示例:`panelBuilder.parameters("[name]", this.user.getName());` 将用户名称放入面板标题中。 -### 监听器方法 +### 监听器方法 { #listener-method } - `listener(PanelListener listener)`:为面板添加 `PanelListener` 以处理用户交互。返回 `TemplatedPanelBuilder` 实例以进行链式调用。 - 监听器不是必需的,因为切换到另一个标签页或对点击做出反应的功能已在 API 中处理。 - 只有在需要自定义功能时才可能需要监听器。 +- 默认情况下,带有监听器的面板会取消玩家自己物品栏中的每次点击并将其传递给 `onInventoryClick`,这让面板可以对这些点击做出反应,例如选择图标。自 BentoBox 3.23.4 起,覆盖 `allowsPlayerInventoryClicks()` 以返回 `true` 来让玩家在面板打开时在自己的物品栏中拾起、放置、交换、丢弃物品并使用包裹。这些点击随后被留给原版,不会传递给 `onInventoryClick`。Shift 点击、双击收集和拖动到面板槽上总是被阻止的。没有监听器的面板总是允许物品栏使用。 ### 类型构建器注册 diff --git a/docs/addons/Challenges/index.md b/docs/addons/Challenges/index.md index 9188b65..73cbca5 100644 --- a/docs/addons/Challenges/index.md +++ b/docs/addons/Challenges/index.md @@ -260,9 +260,79 @@ BentoBox 1.17 API 引入了一个允许实现可自定义 GUI 的功能。挑战 {{ placeholders_source(source="Challenges") }} +## 常见问题 + +??? question "你能添加 X 功能吗?" + 请将其添加到[这里](https://github.com/BentoBoxWorld/Challenges/issues)的列表中。 + +??? question "我如何添加新挑战?" + 官方的方式是通过管理员 GUI 或模板文件添加挑战。 + 请注意,模板文件仅在使用管理员 GUI 中的正确图标("导入模板")后才会导入。GUI 将允许选择要导入到游戏模式中的模板。 + + 但是,也可以选择编辑导出的数据库文件。可以通过以下方式完成:`/[admin_command] challenges` 并单击"导出数据库"按钮。 + +??? question "我可以按岛屿启用挑战吗?这样所有岛屿成员都有相同的挑战?" + 是的,你可以通过插件配置文件来实现:`store-island-data: true` + +??? question "我可以按玩家启用挑战吗?" + 是的,你可以通过插件配置文件来实现:`store-island-data: false` + +??? question "奖励指令不起作用。为什么?" + 最可能的原因是奖励指令定义不正确。指令不需要在其前面加上 `/` 符号。 + + 如果你想从玩家的角度调用指令,你需要在指令调用前添加 `[SELF]`,例如 `[SELF] kill` 将导致玩家调用 `/kill` 指令。 + + 也可能是由权限导致的。`[gamemode].command.challengeexempt` 将防止玩家执行指令。检查玩家是否没有此权限。 + +??? question "如何在奖励指令中添加占位符?" + 目前,插件不支持在奖励指令中使用占位符。如果有必要,你可以在 GitHub 上请求。 + + 当前在奖励指令中唯一支持的占位符是 `[player]` 它返回完成挑战的玩家的名字。 + +??? question "我不喜欢挑战描述中元素的顺序。我可以改变它吗?" + 是的,元素的顺序是在插件语言文件中定义的。 + + [挑战描述](https://github.com/BentoBoxWorld/Challenges/blob/develop/src/main/resources/locales/en-US.yml#L852-L994) + [等级描述](https://github.com/BentoBoxWorld/Challenges/blob/develop/src/main/resources/locales/en-US.yml#L995-L1042) + + 切换或删除说明的某些部分将改变其中显示元素的顺序。 + + ```yaml + lore: |- + [description] + [status] + [cooldown] + [requirements] + [rewards] + ``` + + 这些部分中的每一个都由下面的标签生成,你也可以改变它们。例如 [status] 部分是由以下内容生成的: + + ```yaml + status: + # 已完成不可重复挑战的状态消息 + completed: "&2&l Completed" + # 包含无限可重复挑战完成次数的状态消息 + completed-times: "&2 Completed &7&l [number] &r&2 time(-s)" + # 包含可重复挑战最大可用完成次数的状态消息 + completed-times-of: "&2 Completed &7&l [number] &r&2 out of &7&l [max] &r&2 times" + # 表示达到可重复挑战最大完成次数的状态消息 + completed-times-reached: "&2&l Completed all &7 [max] &2 times" + ``` + ## 更新日志 -!!! warning "v1.8.0 新内容 —— 可切换的未部署挑战需要更新面板文件" +!!! note "v1.8.1 新内容" + **发布于:** 2026-09-05 + + 一个bug修复和翻译版本。兼容性:BentoBox 3.14.0 · Minecraft 1.21.x · Java 21。没有添加或重命名配置键。 + + - 🐛 **铁砧制作的附魔书现在计入物品栏挑战。** 经过铁砧的物品(例如两本附魔书合并成更高等级)带有 `repair_cost` 组件,严格的物品比较会将其视为不同的物品,因此只有"忽略元数据"才能完成此类挑战——然后会接受*任何*附魔书。现在比较必需物品时会忽略修复成本;附魔、等级、名称、lore 和所有其他物品数据仍会被比较。 + - 🔡 **繁体中文(`zh-TW`)** 翻译得到改进,1.8.0 字符串的覆盖范围也变为完整。如果你运行的是自定义的 `zh-TW.yml`,请删除它(或手动合并)以获取改进。其他语言不受影响。 + + [发布 v1.8.1](https://github.com/BentoBoxWorld/Challenges/releases/tag/1.8.1) + +??? warning "v1.8.0 新内容 —— 可切换的未部署挑战需要更新面板文件" **发布于:** 2026-07-26 兼容性:BentoBox 3.14.0 · Minecraft 1.21.x · Java 21。 @@ -324,66 +394,6 @@ BentoBox 1.17 API 引入了一个允许实现可自定义 GUI 的功能。挑战 [发布 v1.6.1](https://github.com/BentoBoxWorld/Challenges/releases/tag/1.6.1) -## 常见问题 - -??? question "你能添加 X 功能吗?" - 请将其添加到[这里](https://github.com/BentoBoxWorld/Challenges/issues)的列表中。 - -??? question "我如何添加新挑战?" - 官方的方式是通过管理员 GUI 或模板文件添加挑战。 - 请注意,模板文件仅在使用管理员 GUI 中的正确图标("导入模板")后才会导入。GUI 将允许选择要导入到游戏模式中的模板。 - - 但是,也可以选择编辑导出的数据库文件。可以通过以下方式完成:`/[admin_command] challenges` 并单击"导出数据库"按钮。 - -??? question "我可以按岛屿启用挑战吗?这样所有岛屿成员都有相同的挑战?" - 是的,你可以通过插件配置文件来实现:`store-island-data: true` - -??? question "我可以按玩家启用挑战吗?" - 是的,你可以通过插件配置文件来实现:`store-island-data: false` - -??? question "奖励指令不起作用。为什么?" - 最可能的原因是奖励指令定义不正确。指令不需要在其前面加上 `/` 符号。 - - 如果你想从玩家的角度调用指令,你需要在指令调用前添加 `[SELF]`,例如 `[SELF] kill` 将导致玩家调用 `/kill` 指令。 - - 也可能是由权限导致的。`[gamemode].command.challengeexempt` 将防止玩家执行指令。检查玩家是否没有此权限。 - -??? question "如何在奖励指令中添加占位符?" - 目前,插件不支持在奖励指令中使用占位符。如果有必要,你可以在 GitHub 上请求。 - - 当前在奖励指令中唯一支持的占位符是 `[player]` 它返回完成挑战的玩家的名字。 - -??? question "我不喜欢挑战描述中元素的顺序。我可以改变它吗?" - 是的,元素的顺序是在插件语言文件中定义的。 - - [挑战描述](https://github.com/BentoBoxWorld/Challenges/blob/develop/src/main/resources/locales/en-US.yml#L852-L994) - [等级描述](https://github.com/BentoBoxWorld/Challenges/blob/develop/src/main/resources/locales/en-US.yml#L995-L1042) - - 切换或删除说明的某些部分将改变其中显示元素的顺序。 - - ```yaml - lore: |- - [description] - [status] - [cooldown] - [requirements] - [rewards] - ``` - - 这些部分中的每一个都由下面的标签生成,你也可以改变它们。例如 [status] 部分是由以下内容生成的: - - ```yaml - status: - # 已完成不可重复挑战的状态消息 - completed: "&2&l Completed" - # 包含无限可重复挑战完成次数的状态消息 - completed-times: "&2 Completed &7&l [number] &r&2 time(-s)" - # 包含可重复挑战最大可用完成次数的状态消息 - completed-times-of: "&2 Completed &7&l [number] &r&2 out of &7&l [max] &r&2 times" - # 表示达到可重复挑战最大完成次数的状态消息 - completed-times-reached: "&2&l Completed all &7 [max] &2 times" - ``` - ## 翻译 !!! info "挑战的翻译" diff --git a/docs/addons/ControlPanel/index.md b/docs/addons/ControlPanel/index.md index b317ab0..60eb774 100644 --- a/docs/addons/ControlPanel/index.md +++ b/docs/addons/ControlPanel/index.md @@ -69,7 +69,7 @@ ControlPanel 使用两个文件: ### config.yml -主配置文件有一个设置: +主配置文件有两个设置: ??? note "disabled-gamemodes" ControlPanel 不应操作的游戏模式插件名称列表。ControlPanel 不会挂接到这些游戏模式。 @@ -83,9 +83,17 @@ ControlPanel 使用两个文件: - AcidIsland ``` +??? note "template-file" + (**1.16.1+**) 导入控制面板时使用的模板文件。该文件在第一次创建面板时被读取,并在每次执行 `/{admin} bentobox reload` 时重新读取,这样编辑文件并重新加载就可以应用你的更改。该文件必须存在于附属文件夹(`plugins/BentoBox/addons/ControlPanel/`)中。重新加载、管理员 `import` 指令和初始创建都会遵守该设置,让你可以指向自己的文件。 + + 默认值:`controlPanelTemplate.yml` + ### controlPanelTemplate.yml -此文件定义所有控制面板及其按钮。编辑后,运行 `/{admin} cp import` 来加载更改。 +此文件定义所有控制面板及其按钮。编辑后,运行 `/{admin} bentobox reload`(**1.16.1+** 会重新导入模板)或 `/{admin} cp import` 来加载更改。 + +!!! warning "重新加载会替换存储的面板(1.16.1+)" + 面板存储在 BentoBox 的数据库中,而在 1.16.1 之前,模板仅用于初始创建:编辑文件并运行 `bbox reload` 是无效的,除非你还运行了 `cp import`。从 **1.16.1** 开始,每次重新加载都会清空每个活跃游戏模式的存储面板,并从模板文件中重新导入它们。你从模板中*删除*的面板也会消失,任何仅存在于数据库中的内容都会丢失——将所有更改保存在模板文件中。 #### 面板结构 @@ -315,7 +323,7 @@ panel-list: ``` ??? tip "重新加载更改后" - 编辑 `controlPanelTemplate.yml` 后,运行 `/{admin} cp import` 来重新加载。如果你进行了 `config.yml` 的更改,请使用 BentoBox 重新加载指令:`/{admin} bentobox reload`。 + 编辑 `controlPanelTemplate.yml` 后,运行 `/{admin} bentobox reload`(自 **1.16.1** 开始会重新导入模板)或 `/{admin} cp import`。如果你进行了 `config.yml` 的更改,也需要使用 `/{admin} bentobox reload`。 ## 常见问题 @@ -337,6 +345,22 @@ panel-list: ??? question "你能添加功能 X 吗?" 请在[这里](https://github.com/BentoBoxWorld/ControlPanel/issues)添加。 +## 更新日志 + +!!! warning "v1.16.1 新内容——重新加载现在覆盖存储的面板" + **发布于:** 2026-09-02 + + 兼容性:BentoBox 2.7.1 及更高版本(在 3.7.4 和 Minecraft 1.21.4 上验证)· Minecraft 1.21.4 – 26.2 · Java 21。 + + - 🔺 ⚙️ **`bbox reload` 重新导入模板。** 编辑 `controlPanelTemplate.yml` 然后重新加载曾经无效,因为面板存储在数据库中,而模板仅用于初始创建。重新加载现在会清空每个活跃游戏模式的存储面板并从模板中重新导入它们,因此无需 `cp import` 就可让模板编辑生效——从模板中删除的面板也会消失而不是继续存在。 + - ⚙️ **新增 `template-file` 配置选项**(默认值 `controlPanelTemplate.yml`)。重新加载、初始创建和管理员 `import` 指令都会遵守该设置,让你可以指向自己的文件。 + - 🔺 **BentoBox 最低版本降低至 2.7.1。** 1.16.0 声明了 `api-version` 3.10.0,但代码中不需要,导致 BentoBox 在无法运行 BentoBox 3.10+ 的服务器上拒绝加载(`INCOMPATIBLE`)——尤其是 Minecraft 1.21.4,最高只支持到 BentoBox 3.7.4。这些服务器现在可以再次使用当前的 ControlPanel 了。 + - 🔡 更新了繁体中文(`zh-TW`)翻译。 + + 🔺 **重新加载现在覆盖存储的面板。** 如果你一直依赖仅存于数据库的面板更改(任何不在 `controlPanelTemplate.yml` 中的内容),请在更新前将其放入模板中,否则在下次重新加载时会丢失。新的 `template-file` 键会自动添加到 `config.yml`;现有安装无需任何更改即可继续工作。 + + [发布 v1.16.1](https://github.com/BentoBoxWorld/ControlPanel/releases/tag/1.16.1) + ## 翻译 {{ translations("ControlPanel") }} \ No newline at end of file diff --git a/docs/addons/Greenhouses/index.md b/docs/addons/Greenhouses/index.md index 54f52c3..5cff0b3 100644 --- a/docs/addons/Greenhouses/index.md +++ b/docs/addons/Greenhouses/index.md @@ -52,6 +52,7 @@ * 我可以建造一个下界温室吗?试试看...(实际上,你可能需要权限) * 我可以在下界建造温室吗?可以。你可以用它们在下界建立殖民地。 * 哪种生物会在生物区中生成?这是你所期待的,冷亚带针叶林中有狼,在平原上有马等等。 +* 管理员如何更新下界温室使其有机会生成凋零骷髅?在 `biomes.yml` 中的 `NETHER` 配方中添加该生物——详见下文的[自定义生物生成](#自定义生物生成示例凋零骷髅)。 ## 需要的插件 @@ -113,6 +114,37 @@ !!! tip "重叠的温室" 如果两个已持久化的温室互相重叠,启动时会跳过其中一个,并在日志中列出它和与之重叠的记录。用 `/bsbadmin greenhouses list` 查看被跳过的记录及其原因,再用 `/bsbadmin greenhouses delete ` 删除你不想保留的那个。无需编辑数据库,也无需重启。 +## 自定义生物生成(示例:凋零骷髅) { #自定义生物生成示例凋零骷髅 } + +温室能生成的每种生物都在 `plugins/BentoBox/addons/Greenhouses/biomes.yml` 中按配方定义,所以添加一种新生物就只是编辑配置。配方的 `mobs:` 部分中的每个条目有这样的格式: + +``` +ENTITY_TYPE: chance:BLOCK_TO_SPAWN_ON +``` + +例如,要给下界温室添加凋零骷髅生成机会,找到 `NETHER:` 配方并在其 `mobs:` 部分添加一行: + +```yaml +NETHER: + # ... + mobs: + ZOMBIFIED_PIGLIN: 10:NETHERRACK + PIGLIN: 10:NETHERRACK + STRIDER: 10:LAVA + ENDERMAN: 5:NETHERRACK + WITHER_SKELETON: 5:NETHERRACK +``` + +这给了凋零骷髅 5% 的概率在每次生成尝试中出现在温室内的地狱岩上。生成所在的方块可以是温室内的任何方块——为了更像堡垒的氛围你可以改用 `WITHER_SKELETON: 10:NETHER_BRICKS`,但这样玩家就需要在温室内放置下界砖才能触发。 + +使用 **/bsbadmin greenhouses reload**(或你的游戏模式等效指令,如 **/acid greenhouses reload**)或重启服务器来应用改动。现有温室无需重建即可获得新的生物生成。 + +需要记住的事项: + +* **一个配方中所有的生成概率加起来必须是 100 或更少。** 如果新条目使总数超过 100,该生物会被跳过且会在加载时记录错误(`Mob chances add up to > 100% in NETHER biome recipe! Skipping ...`)。 +* 生成还受限于配方的 `moblimit` 和 `maxmobs` 值,以及 `config.yml` 中的生物 tick 间隔——所以一个低的百分比在实际操作中可能感觉很罕见。 +* `ENTITY_TYPE` 必须是有效的 [Bukkit EntityType](https://jd.papermc.io/paper/1.21.5/org/bukkit/entity/EntityType.html) 名称;未知的名称会被跳过并记录警告。 + ## 权限 { #permissions } 权限的完整列表在[这里](Permissions)。 @@ -145,7 +177,29 @@ {{ translations("Greenhouses") }} -!!! note "v1.10.0 新内容 — 管理员指令" +!!! warning "v1.10.2 新内容 — 修复 Paper 26.2 上的崩溃" + **发布于:** 2026-09-06 + + 兼容性:BentoBox API 2.7.1 · Minecraft 1.21.5+ · Java 21。无配置或本地化改动。 + + - 🐛 **植物生长不再在漏斗骨粉耗尽时崩溃。** 当屋顶漏斗只剩一个骨粉且至少一株植物生长时,Greenhouses 会将剩余部分写回为零数量物品。较旧的服务器会无声地容忍这一点;Paper 26.2 在每个植物 tick 时从 `EcoSystemManager.setBoneMeal` 抛出 `IllegalArgumentException: amount must be greater than 0` 异常并中止该温室的生长过程。最后一个骨粉现在只是被简单移除。 + + 🔺 **如果你在使用 Paper 26.2 或更新版本,强烈建议更新此版本。** 每个漏斗耗尽的温室否则会在每个 tick 记录此错误并停止植物生长,直到再次添加骨粉。 + + [发布 v1.10.2](https://github.com/BentoBoxWorld/Greenhouses/releases/tag/1.10.2) + +??? warning "v1.10.1 新内容 — 如果运行 Limits 请重新计算" + **发布于:** 2026-09-01 + + 兼容性:BentoBox API 2.7.1 · Minecraft 1.21.5+ · Java 21。无配置或本地化改动。 + + - 🐛 **Greenhouses 不再让生物绕过 Limits 附属。** 当 Limits 在达到实体限制时取消了一次生成,Greenhouses 会继续处理这个从未生成的实体,运行其"这个生物是否能适应玻璃内?"检查,当它不适应时(幽灵有 4×4×4,常常不适应),调用其 `remove()`。Paper 会为这个操作触发 `EntityRemoveEvent`,尽管该生物从未进入世界,而 Limits 会把它算作真实移除,所以其计数器向下倒数,下一次生成被允许——报告的案例是幽灵在 4/3。已取消的生成现在会被完全忽略。Limits 1.30.1 包含了对应的加强。 + + 🔺 **如果你看到了这个,** 受影响岛屿的 Limits 计数器仍然是错误的,直到它被重建。在更新后让玩家运行一次 `/[player_command] limits recount`(或运行管理员命令 `/[admin_command] limits calc <玩家>`)。 + + [发布 v1.10.1](https://github.com/BentoBoxWorld/Greenhouses/releases/tag/1.10.1) + +??? note "v1.10.0 新内容 — 管理员指令" **发布于:** 2026-07-26 Greenhouses 终于有了管理员指令树。兼容性:BentoBox API 2.7.1 · Minecraft 1.21.5+ · Java 21。 diff --git a/docs/addons/InvSwitcher/index.md b/docs/addons/InvSwitcher/index.md index fe9c3ef..7721128 100644 --- a/docs/addons/InvSwitcher/index.md +++ b/docs/addons/InvSwitcher/index.md @@ -22,6 +22,44 @@ 2. 重启服务器 3. 完成! +## 与其他物品栏插件的兼容性 + +!!! warning "不要运行两个物品栏管理器" + InvSwitcher 必须是唯一管理按世界物品栏的插件。与 Multiverse-Inventories、PerWorldInventory、MultiInv 或类似的插件一起运行会导致两个插件在每次世界切换时都保存和恢复玩家,相互覆盖数据。 + +通常的症状是物品消失:在你的岛屿上捡起一个物品,去到大厅,回来后,岛屿物品栏是空的。控制台中没有任何错误输出,因为两个插件都没有失败——它们各自忠实地保存了另一个插件已经重写过的玩家状态。在测试中,岛屿物品栏最终被保存在了*大厅的*存储键下,而一个空物品栏被保存在了岛屿的键下。 + +InvSwitcher 的版本没有区别。如果你看到这种情况,首先检查是否存在第二个物品栏插件。 + +### Multiverse-Inventories + +这里有两件事容易误导管理员: + +- **将 BentoBox 的世界排除在所有物品栏组之外无法解决。** 组控制的是哪些世界*共享*一个物品栏,而不是 Multiverse-Inventories 管理哪些世界。它仍然会为任何不在任何组中的世界写入一个按世界的配置文件。 +- **`/mv remove ` 也无法解决。** Multiverse-Core 在创建 BentoBox 世界时会重新注册它们,所以移除会在下一次重启时被无声地撤销。设置 `auto-import-3rd-party-worlds: false` 也无法帮助——它只会抑制 Multiverse-Core 启动时运行的导入扫描,而那时 BentoBox 还没有创建它的世界。 + +Multiverse-Inventories 没有配置选项来忽略一个世界,但它有一个绕过权限。首先在 Multiverse-Inventories 的 `config.yml` 中启用它(默认为 `false`): + +```yml +share-handling: + enable-bypass-permissions: true +``` + +然后为每个 BentoBox 世界——包括它的下界和末地——授予 `mvinv.bypass.world.` 权限给每个玩家。使用 [LuckPerms](https://luckperms.net/): + +``` +lp group default permission set mvinv.bypass.world.bskyblock_world true +lp group default permission set mvinv.bypass.world.bskyblock_world_nether true +lp group default permission set mvinv.bypass.world.bskyblock_world_the_end true +``` + +在每个玩家继承的组(如 `default`)上设置权限节点会自动覆盖新玩家。为你运行的每个游戏模式世界重复操作。 + +!!! tip "OP 玩家不会自动获得此权限" + 授予 op 还不够——权限节点必须显式给予。以 op 身份测试但没有该权限看起来完全像修复没有起作用。 + +每个世界使用一个权限节点。避免使用 `mvinv.bypass.world.*`,它会关闭 Multiverse-Inventories 对所有世界的管理,包括你仍想让它管理的那些。 + ## Config.yml InvSwitcher 有一个 `config.yml`,包含两个主要部分。 diff --git a/docs/addons/IslandStats/index.md b/docs/addons/IslandStats/index.md new file mode 100644 index 0000000..d451935 --- /dev/null +++ b/docs/addons/IslandStats/index.md @@ -0,0 +1,136 @@ +# 岛屿统计 + +**岛屿统计** 为每个岛屿而不是每个玩家保存统计数据。它从怪物死亡开始:每个怪物在岛屿上死亡了多少只,以及一个玩家击杀了多少只。它适用于所有游戏模式。 + +由 [tastybento](https://github.com/tastybento) 创建和维护。 + +{{ addon_description("IslandStats") }} + +## 安装 + +1. 将 IslandStats 附属的 jar 文件放入 BentoBox 插件的 addons 文件夹。 +2. 重启服务器。 +3. 附属将创建一个数据文件夹,其中包含 config.yml。 +4. 根据需要编辑 config.yml。 +5. 如果进行任何更改,请重启服务器。 + +IslandStats 需要 BentoBox 3.23.0 或更高版本、Minecraft 26.2 或更高版本和 Java 25。 + +!!! warning "计数从安装附属时开始" + IslandStats 不读取旧的玩家统计数据,所以每个岛屿都从零开始。 + +## 统计 + +该附属为每个怪物类型保存两个计数: + +| 统计 | 计数 | +|---|---| +| `KILL_ENTITY` | 玩家在岛屿上击杀的怪物。与原版 `KILL_ENTITY` 玩家统计的含义相同。 | +| `ENTITY_DEATH` | 岛屿上因任何原因死亡的怪物:玩家、怪物农场、跌落伤害、熔岩。 | + +死亡计入其发生地所在保护区域的岛屿。玩家和盔甲架不计数。访客的击杀计入 `KILL_ENTITY`,除非 `count-visitor-kills` 关闭。岛屿上的每次死亡始终计入 `ENTITY_DEATH`。 + +该附属不使用原版玩家统计,因为它们只记录归功于玩家的击杀,也不记录怪物所在的位置。这样会遗漏怪物农场,并把击杀记到击杀者的岛屿上,而不是怪物死亡的岛屿。 + +### 统计对话框 + +`/[player_command] stats` 打开一个对话框: + +- 摘要页面显示每个统计的总数,以及一个打开它的按钮。 +- 每个统计页面从最多到最少列出怪物,并有上一页、下一页、返回和关闭按钮。 +- 怪物名称以可翻译的文本形式发送,因此每个玩家以其自己的客户端语言看到它们。 + +### 存储 + +统计通过 BentoBox 数据库 API 存储,所以它们进入 BentoBox 配置使用的任何数据库。每个岛屿有一条记录。使用 JSON 数据库时,它们位于 `plugins/BentoBox/database/IslandStatsData/`。计数发生在内存中,更改的岛屿按计时器保存(`save-interval`),并在服务器停止时保存。删除或重置岛屿时,其统计也会被删除。 + +## 配置 + +最新的 `config.yml` 可以在[这里](https://github.com/BentoBoxWorld/IslandStats/blob/develop/src/main/resources/config.yml)找到。 + +??? note "disabled-gamemodes" + 此处列出的游戏模式被 IslandStats 忽略。 + + 默认值:`[]` + + ```yaml + disabled-gamemodes: + - BSkyBlock + ``` + +??? note "count-visitor-kills" + 计算岛屿上由不是成员的玩家击杀的怪物,例如访客或合作成员。这只影响"由玩家击杀"统计。岛屿上的每次怪物死亡始终计入"所有怪物死亡"统计。 + + 默认值:`true` + +??? note "ignored-entities" + 从不计数的实体类型。使用 Bukkit 实体类型名称。盔甲架是服务器的活生物体,所以默认被忽略。 + + 默认值:`ARMOR_STAND` + +??? note "save-interval" + 更改的统计写入数据库的频率(分钟)。统计在内存中计数,服务器停止时总是保存。最小值为 1。 + + 默认值:`5` + +??? note "dialog.page-size" + 统计对话框的每一页显示多少行怪物。范围 1 到 50。 + + 默认值:`15` + +## 命令 + +!!! tip + `[player_command]` 和 `[admin_command]` 是根据你运行的游戏模式而不同的命令。 + 游戏模式的 `config.yml` 文件包含允许你修改这些值的选项。 + 例如,在 BSkyBlock 上,默认 `[player_command]` 是 `island`,默认 `[admin_command]` 是 `bsbadmin`。 + +=== "玩家命令" + - `/[player_command] stats`:打开你的岛屿的统计对话框。 + +=== "管理员命令" + - `/[admin_command] stats `:显示该玩家的岛屿统计。玩家看到对话框,控制台收到统计为聊天行。 + - `/[admin_command] stats reset`:询问确认后清除岛屿的统计。 + +!!! warning "使用你所在世界的命令" + `/[player_command] stats` 仅在该游戏模式的世界中有效。例如,在 OneBlock 世界中使用 OneBlock 命令,而不是 `/is`,以便在多个游戏模式中拥有岛屿的玩家看到正确的岛屿。 + +## 权限 + +!!! tip + `[gamemode]` 是一个前缀,根据你运行的游戏模式而不同。 + +| 权限 | 默认值 | 它允许什么 | +|---|---|---| +| `[gamemode].island.stats` | true | `/[player_command] stats`,打开你的岛屿的统计 | +| `[gamemode].admin.stats` | op | `/[admin_command] stats [reset]` | + +## 占位符 + +{{ placeholders_source("IslandStats") }} + +`` 是小写的怪物类型,如 `zombie` 或 `iron_golem`。使用 PlaceholderAPI 时,占位符看起来像 `%IslandStats_bskyblock_island_kill_entity_zombie%`。 + +## 对于附属开发者 + +其他附属可以通过管理器读取计数: + +```java +IslandStats stats = (IslandStats) BentoBox.getInstance().getAddonsManager().getAddonByName("IslandStats").orElseThrow(); +long zombies = stats.getManager().getCount(island, IslandStat.KILL_ENTITY, EntityType.ZOMBIE); +long allDeaths = stats.getManager().getTotal(island, IslandStat.ENTITY_DEATH); +``` + +??? note "v1.0.0 的新增内容——第一个版本" + **发布时间:** 2026年10月4日 + + 第一个版本。兼容性:BentoBox API 3.23.0 · Minecraft 26.2 及更高版本 · Java 25。[Release 1.0.0](https://github.com/BentoBoxWorld/IslandStats/releases/tag/1.0.0) + + - 每个岛屿的怪物击杀和死亡计数(`KILL_ENTITY` 和 `ENTITY_DEATH`)。 + - 带有 `/[player_command] stats` 的统计对话框,以及 `/[admin_command] stats [reset]` 的管理员查看和重置。 + - 岛屿总数、每个怪物计数和玩家站在其上的岛屿的占位符。 + - 🔡 此版本仅包含 `en-US` 区域设置。欢迎翻译。 + +## 翻译 + +{{ translations("IslandStats") }} diff --git a/docs/addons/Level/index.md b/docs/addons/Level/index.md index dd9a640..03b9b6f 100644 --- a/docs/addons/Level/index.md +++ b/docs/addons/Level/index.md @@ -66,6 +66,17 @@ Level 插件有 3 个通用配置项: 默认值: `true` +??? note "donations-only" + 如果为 true,将完全跳过岛屿方块扫描,岛屿等级仅根据通过 `/island donate` 捐赠的方块计算。这样可以省去每次重新计算时扫描岛屿的 CPU 开销。 + + `/island level`、`/island top`、`/island value` 和 `/island donate` 仍然可以使用。此模式下不会注册 `/island detail`,因为没有可供细分的扫描方块。排行榜面板的查看按钮不再显示“点击查看”,也不会打开详情面板。 + + 当 `zero-new-island-levels: true` 时,岛屿创建/重置时运行的零值岛屿扫描仍会执行,因此初始岛屿的抵扣值会记录到 `initialCount` 中,并在管理员之后关闭 donations-only 时正确应用。开启 donations-only 期间,`/island level` 时会忽略已存储的 `initialCount`,因此在已有岛屿的服务器上开启此模式不会让玩家的等级变成很大的负数。 + + 需要 BentoBox 3.16.0 或更高版本。 + + 默认值: `false` + ??? note "login" 允许设置在玩家登录时计算岛屿等级。 @@ -130,17 +141,19 @@ Level 插件有 3 个通用配置项: ??? note "deathpenalty" 允许指定死亡惩罚。 - 玩家每死一次将损失多少方块价值。 - 默认值 100 意味着每死一次,玩家将损失 1 级(如果 levelcost 为 100)。 + 岛屿每发生一次死亡将损失多少方块价值。 + 默认值 100 意味着每死一次,岛屿将损失 1 级(如果 levelcost 为 100)。 + + 自 v2.29.0 起死亡由 Level 自己**按岛屿**追踪:只有在岛屿自己的空间内、由其成员造成的死亡才计入,即使该成员后来离开岛屿也会保留。详见[死亡惩罚如何工作?](#faq)获取完整规则和与游戏模式 `deaths` 设置的交互方式。 设置为零可不使用此功能。 默认值: `100` ??? note "sumteamdeaths" - 允许对死亡惩罚中的所有队员求和。 + **自 v2.29.0 起已弃用。** Level 现在会计算发生在岛屿上的每一次死亡,无论哪个成员死亡。 - 如果为 false,则只计算队长的死亡次数。 + 该设置恰好被读取一次(对每个岛屿),当 Level 在升级后的第一次计算时从 BentoBox 迁移旧的按世界死亡计数。如果为 `true`,迁移的计数是所有成员旧死亡次数的和;如果为 `false`,仅为所有者的。升级时保持为原有数值以使迁移的等级相匹配,之后可忽略。 默认值: `false` @@ -372,11 +385,34 @@ BentoBox 1.17 API 引入了一个允许实现可自定义 GUI 的功能。我们 {{ placeholders_source(source="Level") }} -## 常见问题 +## 常见问题 { #faq } ??? question "你能添加 X 功能吗?" 请将其添加到[这里](https://github.com/BentoBoxWorld/Level/issues)的列表中。 +??? question "死亡惩罚如何工作?" + 自 v2.29.0 起,Level 为每个岛屿维护自己的死亡记录,独立于 BentoBox 的按玩家死亡计数器。规则如下: + + - 死亡只有在**发生在该岛屿自己的空间内**且死者是该岛屿**成员**时,才会计入该岛屿。在其他世界或访问他人岛屿时死亡不计入。 + - **加入团队不会继承任何东西。** 新成员之前的死亡留在他们自己的岛屿,所以邀请一个死过很多次的玩家不会导致团队等级下降。 + - **离开或被踢出不会恢复等级。** 离开成员在该岛屿的死亡作为匿名计数保留,所以仅因频繁死亡的成员离开就不会降低惩罚。离开后重新加入不会重复计算。 + - **岛屿重置或删除**会清除该岛屿的死亡记录。 + - 惩罚为 `deaths × deathpenalty` 方块价值,在 `level-calc` 公式运行之前扣除。 + - 管理员等级报告(`/[admin_command] level <玩家>`)按成员名称细分惩罚,对于从旧的按世界计数器迁移或由已离开成员造成的死亡有独立的行。 + + **游戏模式 `deaths` 设置。** 每个游戏模式的 `config.yml` 都有一个 `deaths` 块。v2.29.0 之后,只有其中两个设置影响岛屿等级: + + | 设置 | 对 Level 的影响 | + |---|---| + | `counted` | 主开关。如果为 `false`,Level 完全不记录死亡。 | + | `max` | 限制每个成员能对岛屿惩罚贡献的死亡次数。 | + | `team-join-reset` | 无。仅影响 BentoBox 自己的计数器和 `%[gamemode]_deaths%` 占位符。 | + | `reset-on-new-island` | 无。Level 在岛屿重置或删除时清除自己的记录。 | + + BentoBox 的 `/[admin_command] deaths set|add|reset` 指令改变的是 BentoBox 的计数器,不是 Level 的按岛屿记录,所以它们现在也不再影响等级。 + + **从较早版本升级。** 现有的死亡计数在首次计算、成员在其上死亡或成员离开时,对每个岛屿迁移一次。迁移的值复现旧公式在那个时刻会计算出的内容(使用 `sumteamdeaths`),所以升级时岛屿等级不会改变。 + ??? question "如何让 `level-cost` 在每个等级后增加?" `level-cost` 设置是一个固定值,无法按等级逐步增加,因为 BentoBox 通过将单一公式应用于总方块数来计算岛屿等级,而非逐级迭代。 @@ -505,6 +541,21 @@ BentoBox 1.17 API 引入了一个允许实现可自定义 GUI 的功能。我们 [发布 v2.28.1](https://github.com/BentoBoxWorld/Level/releases/tag/2.28.1) +??? warning "v2.29.0 新内容 — 行为改变" + **发布于:** 2026 年 9 月 + + 兼容性:BentoBox API 3.16.0、Minecraft 1.21.x 和 26.1.x、Java 21。 + + - 🔺 **死亡现在按岛屿追踪。** Level 在计算时不再读取 BentoBox 的按玩家按世界死亡计数器。死亡只有在发生于岛屿自己的空间内且玩家是成员时才计入;加入团队不继承任何东西;后来离开的成员的死亡留在岛屿;岛屿重置清除记录。这修复了团队等级在邀请拥有长死亡历史的玩家时崩溃、被踢出后反弹的问题。详见[死亡惩罚如何工作?](#faq)。 + - ⚙️ **`sumteamdeaths` 已弃用。** 它对每个岛屿读取一次以迁移旧计数,其他情况下被忽略。升级时现有等级不变。 + - 🔺 游戏模式的 `team-join-reset` 和 `reset-on-new-island` 设置,以及 `/[admin_command] deaths` 指令,不再影响等级。`counted` 和 `max` 仍然有影响。 + - 管理员等级报告按名字列出每个成员的死亡次数,加上一行代表已离开成员和从旧计数器迁移来的死亡。 + - 🐛 从 top-ten 面板的 View 按钮打开详情面板而没有岛屿时不再抛出错误。 + - 🐛 值面板在构建一个格式错误的方块键的图标时不再出错。 + - 🆕 新增繁体中文(`zh-TW`)本地化。感谢 @qwe664! + + [发布 v2.29.0](https://github.com/BentoBoxWorld/Level/releases/tag/2.29.0) + ## 翻译 {{ translations("Level") }} diff --git a/docs/addons/Limits/index.md b/docs/addons/Limits/index.md index ecf559a..be586b2 100644 --- a/docs/addons/Limits/index.md +++ b/docs/addons/Limits/index.md @@ -171,6 +171,47 @@ blocklimits: 默认值:`false` +### 自动实体重新计数 { #automatic-entity-recounts } + +!!! info "自 1.30.2 起" + 实体计数以增量方式维护,所以任何遗漏的事件(嗅探蛋孵化、生物跨越传送门、崩溃前批量保存中丢失的增量)都可能导致计数偏离现实,除了手动重新计数外别无他法。这些选项在后台自动协调计数。它们**默认关闭**,因为重新计数会加载岛屿保护区域的所有区块:成本随保护范围的平方增长(范围 50 时每个世界 64 个区块,范围 400 时 2601 个)。重新计数是异步的,限流到一次一个岛屿,去重和按岛屿节流,仅重写**实体**计数——方块计数保持不变。重新计数*替换*计数而不是合并,所以仅当岛屿的区块被加载时才准确。 + +=== "recount-on-join" + !!! summary "说明" + 当岛屿拥有者登录时,运行岛屿的仅限实体的后台重新计数。 + + 默认值:`false` + +=== "recount-on-join-cooldown" + !!! summary "说明" + 同一岛屿自动重新计数之间的最小秒数(与定期扫描共享)。 + + 默认值:`300` + +=== "recount-periodic" + !!! summary "说明" + 定期扫描在线岛屿以协调其实体计数,即使所有者保持登录状态。成本和注意事项与 `recount-on-join` 相同。 + + 默认值:`false` + +=== "recount-periodic-interval" + !!! summary "说明" + 定期扫描周期之间的秒数。 + + 默认值:`300` + +=== "recount-periodic-batch" + !!! summary "说明" + 每个扫描周期要协调的岛屿数。在高人口服务器上保持较小。 + + 默认值:`2` + +=== "recount-max-chunks" + !!! summary "说明" + 保护区域覆盖超过此数量区块/世界的岛屿永远不会自动重新计数;每个岛屿记录一次警告。1000 个区块对应约 240 的保护范围。通过 `recount` 和 `calc` 命令的手动重新计数不受影响。 + + 默认值:`1000` + ## 权限 岛主可以拥有覆盖默认设置或世界设置的独占权限。支持两种格式: @@ -207,8 +248,95 @@ GAMEMODE_NAME.limits.admin.limits: {{ placeholders_source(source="Limits") }} +!!! note "方块占位符名称" + `[material]` 是不含 `minecraft:` 命名空间的小写 Minecraft 键,如 `%Limits_bskyblock_island_spawner_limit%`。来自 ItemsAdder 或 Oraxen 的自定义方块使用 `namespace_key`(例如 `itemsadder_ruby_block`),因为冒号在占位符名称中无效。在 1.28.0 到 1.30.0 版本之间,方块的 `_count`、`_limit` 和 `_base_limit` 占位符被错误地注册为带有内嵌的命名空间,无法解析;已在 **1.30.1** 中修复。 + + +## 翻译 + +{{ translations("Limits") }} + +## 无法限制的物品 + +有些物品(目前)无法限制。原因通常是因为有太多方法可以在不被跟踪的情况下移除物品。如果你是程序员并且可以找出如何解决这些问题,请提交 PR! + +* 点燃的 TNT +* 唤魔者尖牙 +* 羊驼唾沫 +* 龙火球 +* 区域效果云 +* 末影信号 +* 小火球 +* 火球 +* 扔出的经验瓶 +* 潜影贝导弹 +* 凋灵头颅 +* 三叉戟 +* 箭 +* 光灵箭 +* 雪球 +* 鸡蛋 +* 拴绳 +* 末影水晶 +* 末影珍珠 +* 末影龙 + +!!! tip "物品展示框和画现在可以被限制 (1.29.0)" + 物品展示框、荧光物品展示框和画此前也在此列表中。自 **1.29.0** 起,实体计数是持久化且事件驱动的,因此这三者现在都可以像其他任何实体一样在 `entitylimits` 下配置。 + + +## 对于开发者:豁免实体 + +!!! info "即将在 1.30.2 之后的下一个版本中推出" + +另一个插件或附属可以生成 Limits 完全忽略的实体。这对于临时生物(如事件波或小游戏 NPC)很有用,这些不应消耗岛屿的实体限制。在 **spawn 消费者中**使用持久数据键 `limits:exempt`(任何值)标记实体,以便在 `CreatureSpawnEvent` 触发时标签已存在: + +```java +NamespacedKey limitsExempt = NamespacedKey.fromString("limits:exempt"); +world.spawn(location, Zombie.class, zombie -> + zombie.getPersistentDataContainer().set(limitsExempt, PersistentDataType.BYTE, (byte) 1)); +``` + +标记的实体: + +- 永远不会被实体或组限制阻止 +- 永远不会被计数,所以它不会使用岛屿的限制 +- 当它死亡、被移除或通过传送门时不会改变任何计数 +- 被跳过重新计数,包括 `calc` 命令和[自动实体重新计数](#automatic-entity-recounts) + +同一岛屿上未标记的实体会照常受到限制。标签与实体一起保存,所以豁免在区块卸载和服务器重启后仍然有效。你不需要 Limits 作为依赖;如果你对其进行编译,`Limits.EXEMPT_KEY` 是相同的键。 + +!!! warning "仅在生成时添加标签" + 在实体生成时添加标签,之后永远不要添加或移除它。稍后标记的实体已被计数,移除时不会递减,之后移除标签会导致相反的问题。无论哪种情况,岛屿的计数都是错误的,直到下一次重新计数。 + + ## 更新日志 +??? note "v1.30.2 新内容 —— 自动实体重新计数" + **发布于:** 2026-09-06 + + 一个活塞计数修复加上一个新的可选功能。兼容性:BentoBox API 2.7.1 · Paper Minecraft 1.21.11 – 26.2 · Java 21。 + + - ⚙️ **自动实体重新计数(可选启用)。** 新的 `recount-on-join` 和 `recount-periodic` 选项在后台协调漂移的实体计数——见上文[自动实体重新计数](#automatic-entity-recounts)。六个新键(`recount-on-join`、`recount-on-join-cooldown`、`recount-periodic`、`recount-periodic-interval`、`recount-periodic-batch`、`recount-max-chunks`)自动添加到 `config.yml` 且使用安全的默认值,所以除非你启用它们,否则没有任何改变。在开启前读取配置注释。感谢 @daniel-skopek。 + - 🐛 **扩展活塞不再计数两次。** 管理员重新计数(`calc`)对每个扩展活塞计数其基座和头部,所以所有活塞都扩展的红石建造会翻倍计数(16 个粘性活塞显示为 32/30),每次重新计数都会放回错误的数字。重新计数现在仅计数基座,破坏两部分的爆炸递减一次。 + - 🐛 **穿越传送门的实体正确递减。** 实体穿越传送门,同时在岛屿保护范围外时,其源维度计数从未被递减。 + + **活塞注意:** 活塞计数膨胀的岛屿在此版本进行一次重新计数(`/[admin_command] limits calc `)后显示正确的数字。 + + [发布 v1.30.2](https://github.com/BentoBoxWorld/Limits/releases/tag/1.30.2) + +??? warning "v1.30.1 新内容 —— 如果你运行 Greenhouses 请重新计数" + **发布于:** 2026-09-04 + + 两个准确性修复。兼容性:BentoBox API 2.7.1 · Paper Minecraft 1.21.11 – 26.2 · Java 21。无配置或区域设置更改。 + + - 🐛 **方块计数和限制占位符再次有效。** 自 1.28.0 以来,每个方块占位符都注册为命名空间内嵌在其名称中,所以 `%Limits_bskyblock_island_spawner_limit%` 实际上是 `%Limits_bskyblock_island_minecraft:spawner_limit%`,PlaceholderAPI 返回其未解析。所有方块 `_count`、`_limit` 和 `_base_limit` 占位符,包括 `_overworld`、`_nether` 和 `_end` 变种,现在都注册在文档化的名称下。实体占位符从未受影响。 + - 🔺 🐛 **取消的生成被移除时实体计数不再漂移。** 当 Limits 在限制处取消生成,生成插件随后对该从不添加的实体调用 `remove()`(Greenhouses 做了这个),Paper 仍然触发 `EntityRemoveEvent`,Limits 为从不计数的生物递减计数,所以下一次生成溜过去(例如 4/3 的恶灵)。从不进入世界的实体移除现在被忽略。 + + 🔺 **重新计数注意:** 如果你运行 Greenhouses(或任何移除其无法生成的实体的插件),受影响岛屿的实体计数可能在旧版本下漂移降低。在受影响的岛屿上运行 `/[admin_command] limits calc `,或让玩家运行 `/[player_command] limits recount`,使计数与现实相匹配。 + + [发布 v1.30.1](https://github.com/BentoBoxWorld/Limits/releases/tag/1.30.1) + ??? warning "v1.30.0 新内容 —— 建议重新计数海带" **发布于:** 2026-08-15 @@ -305,55 +433,4 @@ GAMEMODE_NAME.limits.admin.limits: 兼容性: BentoBox API 2.7.1 · Minecraft 1.21.5 – 26.1.2 · Java 21。 - [Release v1.28.2](https://github.com/BentoBoxWorld/Limits/releases/tag/1.28.2) - -## 翻译 - -{{ translations("Limits") }} - -## 无法限制的物品 - -有些物品(目前)无法限制。原因通常是因为有太多方法可以在不被跟踪的情况下移除物品。如果你是程序员并且可以找出如何解决这些问题,请提交 PR! - -* 点燃的 TNT - -* 唤魔者尖牙 - -* 羊驼唾沫 - -* 龙火球 - -* 区域效果云 - -* 末影信号 - -* 小火球 - -* 火球 - -* 扔出的经验瓶 - -* 潜影贝导弹 - -* 凋灵头颅 - -* 三叉戟 - -* 箭 - -* 光灵箭 - -* 雪球 - -* 鸡蛋 - -* 拴绳 - -* 末影水晶 - -* 末影珍珠 - -* 末影龙 - -!!! tip "物品展示框和画现在可以被限制 (1.29.0)" - 物品展示框、荧光物品展示框和画此前也在此列表中。自 **1.29.0** 起,实体计数是持久化且事件驱动的,因此这三者现在都可以像其他任何实体一样在 `entitylimits` 下配置。 \ No newline at end of file + [Release v1.28.2](https://github.com/BentoBoxWorld/Limits/releases/tag/1.28.2) \ No newline at end of file diff --git a/docs/gamemodes/AOneBlock/index.md b/docs/gamemodes/AOneBlock/index.md index ea958a9..70587b6 100644 --- a/docs/gamemodes/AOneBlock/index.md +++ b/docs/gamemodes/AOneBlock/index.md @@ -208,6 +208,29 @@ OneBlock 将你放置在太空中的一个方块上。只有一个方块。你 - '[SUDO]say 刚刚完成了 [phase]' ``` +=== "end-commands-first-time" + !!! summary "描述" + `end-commands-first-time` 部分允许定义**仅在玩家第一次**完成此阶段时触发的指令。之后再次完成此阶段时不会运行。 + + 指令作为控制台运行,除非指令前缀为 `[SUDO]`,那么指令将作为触发指令的玩家运行。 + + 这些占位符将在指令字符串中被替换为相应的值: + + - `[island]` - 岛屿名称 + - `[owner]` - 岛屿所有者的名称 + - `[player]` - 破坏方块触发指令的玩家名称 + - `[phase]` - 此阶段的名称 + - `[blocks]` - 破坏的方块数量 + - `[level]` - 你的岛屿等级(需要 Levels 插件) + - `[bank-balance]` - 你的岛屿银行余额(需要 Bank 插件) + - `[eco-balance]` - 玩家的经济余额(需要 Vault 和经济插件) + + !!! example "示例" + ```yaml + end-commands-first-time: + - 'broadcast &c&l[!] &b[player] &fhas completed the &d&n[phase]&f phase for the first time.' + ``` + === "requirements" !!! summary "描述" `requirements` 部分允许限制访问下一阶段,直到满足特定要求。 @@ -589,11 +612,169 @@ AOneBlock 插件有其独特的占位符。这些占位符与 AOneBlock 存储 全息图文本接受旧版 `&` 颜色代码、`&#RRGGBB` 十六进制颜色和 MiniMessage 标签(包括渐变)—— 十六进制和 MiniMessage 形式自 1.27.0 起。见[自定义阶段](Phases.md#holograms)。 ??? question "我应该使用 Levels 插件吗?" - 这取决于你,但如果你这样做,请注意因为玩家有一个无限方块,等级可能会变得 - -很高。 + 这取决于你,但如果你这样做,请注意因为玩家有一个无限方块,等级可能会变得很高。 我建议不使用它,而是使用 Likes 插件。 +## Translations + +{{ translations("AOneBlock") }} + +## API + +Since BentoBox 1.17 API implemented a feature that solved an issue with classloaders. Plugins that wants to use access to the code directly, now can do it. + +You just need to add AOneBlock to your project as dependency. You can use Maven for that: + +```xml + + world.bentobox + aoneblock + 1.10.0 + provided + +``` + +AOneBlock addon stores data in a separate database table. + +=== "OneBlockIslands" + !!! summary "Description" + OneBlockIslands stores all information about island progress through phases. + + Link to the source code: [OneBlockIslands](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/dataobjects/OneBlockIslands.java) + + !!! question "Variables" + - "uniqueId": the island unique ID. It is equal to the Island uniqueId. + - "blockNumber": the current broken block number. + - "lifetime": the overall number of broken blocks. + - "phaseName": the current phase name. + - "hologram": the hologram text that is shown. + + !!! example "Code example" + To access this data, you need to access to AOneBlock addon. It can be several ways, but example bellow shows + a generic way that is accessible from everywhere. + + ```java + public void accessToAOneBlockData(@NonNull Island island) { + BentoBox.getInstance().getAddonsManager().getAddonByName("AOneBlock").ifPresent(aOneBlock -> { + OneBlockIslands oneBlockData = aOneBlock.getOneBlocksIsland(island); + + String islandUniqueId = oneBlockData.getUniqueId(); + int brokenBlocks = oneBlockData.getBlockNumber(); + long lifetimeBlocks = oneBlockData.getLifetime(); + String phase = oneBlockData.getPhaseName(); + String hologram = oneBlockData.getHologram(); + }); + } + ``` + +### Events + +AOneBlock has some custom events that are called only in AOneBlock. But BentoBox GameMode events are still triggered in AOneBlock. + +=== "BlockClearEvent" + !!! summary "Description" + This event is triggered before entity is spawned. It contains a list of blocks that will be cleared or replaced with water. + + Can be cancelled. + + Link to the class: [BlockClearEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/BlockClearEvent.java) + + !!! question "Variables" + - `Entity entity` - entity that is spawned. + - `List airBlocks` - the list of blocks that will be replaced with air. + - `List waterBlocks` - the list of blocks that will be replaced with water. + - `boolean cancelled` - the boolean that indicates if event is cancelled. + + !!! example "Code example" + ```java + @EventHandler(priority = EventPriority.MONITOR) + public void onBlockClear(BlockClearEvent event) { + Entity entity = event.getEntity(); + List airBlocks = event.getAirBlocks(); + List waterBlocks = event.getWaterBlocks(); + + boolean cancelled = event.isCancelled(); + } + ``` + +=== "MagicBlockEntityEvent" + !!! summary "Description" + This event is triggered after entity is spawned. It just contains basic information about spawned entity. + + Link to the class: [MagicBlockEntityEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/MagicBlockEntityEvent.java) + + !!! question "Variables" + - `EntityType entityType` - entityType that is spawned. + - `@NonNull Island island` - the island where entity is summoned + - `@Nullable UUID playerUUID` - the user id who triggered entity spawning. Can be Null. + - `@NonNull Block block` - the magic block location. + + !!! example "Code example" + ```java + @EventHandler(priority = EventPriority.MONITOR) + public void onMagicBlockEntity(MagicBlockEntityEvent event) { + EntityType entityType = event.getEntityType(); + + Island island = event.getIsland(); + UUID playerUUID = event.getPlayerUUID(); + Block block = event.getBlock(); + } + ``` + +=== "MagicBlockEvent" + !!! summary "Description" + This event is triggered after magic block is broken. + + Link to the class: [MagicBlockEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/MagicBlockEvent.java) + + !!! question "Variables" + - `@Nullable ItemStack tool` - the tool that broke magic block. + - `@NotNull Material nextBlockMaterial` - the next magic block material. + - `@NonNull Island island` - the island where block is summoned. + - `@Nullable UUID playerUUID` - the user id who broke magic block. Can be Null. + - `@NonNull Block block` - the magic block location. + + !!! example "Code example" + ```java + @EventHandler(priority = EventPriority.MONITOR) + public void onMagicBlock(MagicBlockEvent event) { + ItemStack tool = event.getTool(); + Material nextBlockMaterial = event.getNextBlockMaterial(); + + Island island = event.getIsland(); + UUID playerUUID = event.getPlayerUUID(); + Block block = event.getBlock(); + } + ``` + +=== "MagicBlockPhaseEvent" + !!! summary "Description" + This event is triggered after a new phase has started. + + Link to the class: [MagicBlockPhaseEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/MagicBlockPhaseEvent.java) + + !!! question "Variables" + - `String phase` - the name of the new phase. + - `String oldPhase` - the name of previous phase. + - `int blockNumber` - the block number when new phase starts. + - `@NonNull Island island` - the island where block is summoned. + - `@Nullable UUID playerUUID` - the user id who broke magic block. Can be Null. + - `@NonNull Block block` - the magic block location. + + !!! example "Code example" + ```java + @EventHandler(priority = EventPriority.MONITOR) + public void onMagicBlockPhase(MagicBlockPhaseEvent event) { + String phase = event.getPhase(); + String oldPhase = event.getOldPhase(); + int blockNumber = event.getBlockNumber(); + + Island island = event.getIsland(); + UUID playerUUID = event.getPlayerUUID(); + Block block = event.getBlock(); + } + ``` + ## 更新日志 ??? warning "v1.23.0 新内容 — 需要语言文件更新" @@ -760,163 +941,3 @@ AOneBlock 插件有其独特的占位符。这些占位符与 AOneBlock 存储 🔺 **杂色森林在首次启动时被添加到你的阶段顺序**(日志:`Phase index: added new phase Dappled Forest`),其文件被复制到 `phases/`。你现有的顺序、长度和启用标志不会改变。如果你不想要它,在 `/[admin_command] phases` 中禁用它。 [发布 v1.28.0](https://github.com/BentoBoxWorld/AOneBlock/releases/tag/1.28.0) - -## Translations - -{{ translations("AOneBlock") }} - -## API - -Since BentoBox 1.17 API implemented a feature that solved an issue with classloaders. Plugins that wants to use access to the code directly, now can do it. - -You just need to add AOneBlock to your project as dependency. You can use Maven for that: - -```xml - - world.bentobox - aoneblock - 1.10.0 - provided - -``` - -AOneBlock addon stores data in a separate database table. - -=== "OneBlockIslands" - !!! summary "Description" - OneBlockIslands stores all information about island progress through phases. - - Link to the source code: [OneBlockIslands](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/dataobjects/OneBlockIslands.java) - - !!! question "Variables" - - "uniqueId": the island unique ID. It is equal to the Island uniqueId. - - "blockNumber": the current broken block number. - - "lifetime": the overall number of broken blocks. - - "phaseName": the current phase name. - - "hologram": the hologram text that is shown. - - !!! example "Code example" - To access this data, you need to access to AOneBlock addon. It can be several ways, but example bellow shows - a generic way that is accessible from everywhere. - - ```java - public void accessToAOneBlockData(@NonNull Island island) { - BentoBox.getInstance().getAddonsManager().getAddonByName("AOneBlock").ifPresent(aOneBlock -> { - OneBlockIslands oneBlockData = aOneBlock.getOneBlocksIsland(island); - - String islandUniqueId = oneBlockData.getUniqueId(); - int brokenBlocks = oneBlockData.getBlockNumber(); - long lifetimeBlocks = oneBlockData.getLifetime(); - String phase = oneBlockData.getPhaseName(); - String hologram = oneBlockData.getHologram(); - }); - } - ``` - -### Events - -AOneBlock has some custom events that are called only in AOneBlock. But BentoBox GameMode events are still triggered in AOneBlock. - -=== "BlockClearEvent" - !!! summary "Description" - This event is triggered before entity is spawned. It contains a list of blocks that will be cleared or replaced with water. - - Can be cancelled. - - Link to the class: [BlockClearEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/BlockClearEvent.java) - - !!! question "Variables" - - `Entity entity` - entity that is spawned. - - `List airBlocks` - the list of blocks that will be replaced with air. - - `List waterBlocks` - the list of blocks that will be replaced with water. - - `boolean cancelled` - the boolean that indicates if event is cancelled. - - !!! example "Code example" - ```java - @EventHandler(priority = EventPriority.MONITOR) - public void onBlockClear(BlockClearEvent event) { - Entity entity = event.getEntity(); - List airBlocks = event.getAirBlocks(); - List waterBlocks = event.getWaterBlocks(); - - boolean cancelled = event.isCancelled(); - } - ``` - -=== "MagicBlockEntityEvent" - !!! summary "Description" - This event is triggered after entity is spawned. It just contains basic information about spawned entity. - - Link to the class: [MagicBlockEntityEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/MagicBlockEntityEvent.java) - - !!! question "Variables" - - `EntityType entityType` - entityType that is spawned. - - `@NonNull Island island` - the island where entity is summoned - - `@Nullable UUID playerUUID` - the user id who triggered entity spawning. Can be Null. - - `@NonNull Block block` - the magic block location. - - !!! example "Code example" - ```java - @EventHandler(priority = EventPriority.MONITOR) - public void onMagicBlockEntity(MagicBlockEntityEvent event) { - EntityType entityType = event.getEntityType(); - - Island island = event.getIsland(); - UUID playerUUID = event.getPlayerUUID(); - Block block = event.getBlock(); - } - ``` - -=== "MagicBlockEvent" - !!! summary "Description" - This event is triggered after magic block is broken. - - Link to the class: [MagicBlockEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/MagicBlockEvent.java) - - !!! question "Variables" - - `@Nullable ItemStack tool` - the tool that broke magic block. - - `@NotNull Material nextBlockMaterial` - the next magic block material. - - `@NonNull Island island` - the island where block is summoned. - - `@Nullable UUID playerUUID` - the user id who broke magic block. Can be Null. - - `@NonNull Block block` - the magic block location. - - !!! example "Code example" - ```java - @EventHandler(priority = EventPriority.MONITOR) - public void onMagicBlock(MagicBlockEvent event) { - ItemStack tool = event.getTool(); - Material nextBlockMaterial = event.getNextBlockMaterial(); - - Island island = event.getIsland(); - UUID playerUUID = event.getPlayerUUID(); - Block block = event.getBlock(); - } - ``` - -=== "MagicBlockPhaseEvent" - !!! summary "Description" - This event is triggered after a new phase has started. - - Link to the class: [MagicBlockPhaseEvent](https://github.com/BentoBoxWorld/AOneBlock/blob/develop/src/main/java/world/bentobox/aoneblock/events/MagicBlockPhaseEvent.java) - - !!! question "Variables" - - `String phase` - the name of the new phase. - - `String oldPhase` - the name of previous phase. - - `int blockNumber` - the block number when new phase starts. - - `@NonNull Island island` - the island where block is summoned. - - `@Nullable UUID playerUUID` - the user id who broke magic block. Can be Null. - - `@NonNull Block block` - the magic block location. - - !!! example "Code example" - ```java - @EventHandler(priority = EventPriority.MONITOR) - public void onMagicBlockPhase(MagicBlockPhaseEvent event) { - String phase = event.getPhase(); - String oldPhase = event.getOldPhase(); - int blockNumber = event.getBlockNumber(); - - Island island = event.getIsland(); - UUID playerUUID = event.getPlayerUUID(); - Block block = event.getBlock(); - } - ``` diff --git a/mkdocs.yml b/mkdocs.yml index 3bc9565..885dc5a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,6 +63,7 @@ nav: - 温室: addons/Greenhouses/index.md - 物品转换器: addons/InvSwitcher/index.md - 岛屿飞行: addons/IslandFly/index.md + - 岛屿统计: addons/IslandStats/index.md - 等级: addons/Level/index.md - 点赞: addons/Likes/index.md - 限制: addons/Limits/index.md From ab0145637e838d322b588c277d25225f5f2b75b3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 30 Oct 2026 18:22:34 -0700 Subject: [PATCH 2/2] =?UTF-8?q?docs(zh):=20=E5=9C=A8=E5=8F=AF=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=20GUI=20=E8=A1=A8=E6=A0=BC=E4=B8=AD=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=20command=5Franks=5Fpanel.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/Tutorials/generic/Customizable-GUI.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Tutorials/generic/Customizable-GUI.md b/docs/Tutorials/generic/Customizable-GUI.md index 441443b..b0e54d0 100644 --- a/docs/Tutorials/generic/Customizable-GUI.md +++ b/docs/Tutorials/generic/Customizable-GUI.md @@ -237,4 +237,5 @@ panel_name: | `team_panel.yml` 和 `team_invite_panel.yml` | `/[player_command] team` 及其邀请界面 | | `settings_panel.yml` | `/[player_command] settings`,参见[自定义设置面板](/en/latest/BentoBox/Island-Protection,-Flags-&-Ranks/#customizing-the-settings-panel) | | `admin_settings_panel.yml` | `/[admin_command] settings` | + | `command_ranks_panel.yml` | 从设置面板打开的命令等级面板(3.23.3+),参见[自定义命令等级面板](/en/latest/BentoBox/Island-Protection,-Flags-&-Ranks/#customizing-the-command-ranks-panel) | | `placeholder_panel.yml` 和 `placeholder_list_panel.yml` | 占位符浏览器 |