Skip to content

Level#

Level 可让你的玩家通过放置方块来提升岛屿等级,竞争最高的岛屿等级!

tastybento 创建和维护。

安装#

  1. 将 level 插件 jar 文件放入 BentoBox 插件的 addons 文件夹
  2. 重启服务器
  3. 插件将创建一个数据文件夹,里面有一个 config.yml 文件
  4. 根据需要编辑 config.yml。该配置文件指定方块的价值(见下文)
  5. 如果进行了更改,请重启服务器

配置#

Level 插件有 3 个通用配置项:

  • config.yml 文件包含插件的默认配置。
  • blockconfig.yml 文件包含每个方块的价值。
  • /panels/ 包含管理玩家 GUI 的文件。

config.yml#

配置文件包含插件的主要功能。

最新的 config.yml 可以在这里找到。

本节定义了插件的许多整体设置。

disabled-game-modes

允许指定 Level 插件不应在哪些游戏模式插件中运行。

Level 将不会与这些游戏模式插件挂钩。

默认值: []

log-report-to-console

如果从控制台执行命令,则允许查看等级报告。

默认值: true

concurrent-island-calcs

允许指定一次可以进行多少个岛屿等级计算。

如果队列中有多个,且你的 CPU 可以处理,你可以并行运行岛屿计算。

默认值: 1

calculation-timeout

允许指定等级计算应在多少分钟后停止。

一般来说,计算只需要几秒钟,所以如果这个值被触发,说明有些不对劲。

默认值: 5

zero-new-island-levels

允许指定起始方块是否应包含在岛屿等级中。

如果为 true,Level 将计算初始岛屿的等级,并将其从任何未来的等级计算中移除。 如果移除所有起始方块,玩家等级可能会变成负值。

如果为 false,玩家的初始岛屿方块将计入他们的等级。

默认值: true

login

允许设置在玩家登录时计算岛屿等级。

这会在玩家登录时静默计算他们的岛屿等级。

默认值: false

nether

允许在等级计算中包含下界岛屿。

警告:在游戏中途启用此选项会让拥有岛屿的玩家的岛屿等级突然提高。新岛屿将被正确归零。

默认值: false

end

允许在等级计算中包含末地岛屿。

警告:在游戏中途启用此选项会让拥有岛屿的玩家的岛屿等级突然提高。新岛屿将被正确归零。

默认值: false

include-chests

允许在等级计算中包含箱子内容。

警告:等级计算时间会更长,服务器性能可能受到影响。

默认值: false

underwater

允许指定水下方块倍数。

如果方块低于海平面,它们可以有更高的价值。例如 2 倍。 如果有海洋,则可以促进水下开发。该值可以是小数。

默认值: 1.0

levelcost

允许指定一个岛屿等级的价值。

默认值: 100

最小值: 1

level-calc

允许指定等级计算公式。

  • blocks - 所有方块价值的总和,减去任何死亡惩罚
  • level_cost - 在线性方程中,一个等级的价值

此公式可以包括 +、=、*、/、sqrt、^、sin、cos、tan、log(自然对数)。 结果将始终四舍五入为长整数。

例如,另一个非线性选项可以是: 3 * sqrt(blocks / level_cost)

默认值: blocks / level_cost

levelwait

允许指定等级请求之间的冷却时间(秒)。

默认值: 60

deathpenalty

允许指定死亡惩罚。

玩家每死一次将损失多少方块价值。 默认值 100 意味着每死一次,玩家将损失 1 级(如果 levelcost 为 100)。

设置为零可不使用此功能。

默认值: 100

sumteamdeaths

允许对死亡惩罚中的所有队员求和。

如果为 false,则只计算队长的死亡次数。

默认值: false

shorthand

允许显示较短的岛屿等级数字。

显示向下取整的大等级值,例如 10,345 -> 10k

默认值: false

blockconfig.yml#

方块配置文件包含方块的价值。

最新的 blockconfig.yml 可以在这里找到。

本节定义了方块的价值和限制。

Tip

此文件中的值仅支持整数 -> 完整数字。

Tip

正确的材料名称可以在 Spigot 材料页面找到。

注意:这是最新的 spigot 材料列表: 材料

limits

本节列出了任何特定方块的限制。 超过此数量的方块不会被计算。 此限制适用于所有游戏模式,不是特定于世界的。

格式: MATERIAL: NUMBER

blocks

本节列出了所有游戏模式(世界)中方块的价值。 要指定特定世界的价值,请使用下一节。 任何未列出的方块将具有 0 的价值。空气始终为零。

格式: MATERIAL: NUMBER

CraftEngine 自定义方块也受支持(需要 BentoBox 3.15.0+)。使用其命名空间 ID 作为键:

blocks:
  mynamespace:my_block: 50
  mynamespace:custom_ore: 3
worlds

列出在特定世界中具有不同价值的任何方块。 如果未列出某个方块,将使用 blocks 部分的默认值。 以世界名称为前缀。如果存在,这些值将应用于相关的下界和末地。

示例:

    worlds:
      AcidIsland_world:
        SAND: 0
        SANDSTONE: 0
        ICE: 0

在此示例中,AcidIsland 将对所有方块使用与 BSkyBlock 相同的值,除了沙子、沙石和冰。

可自定义 GUI#

BentoBox 1.17 API 引入了一个允许实现可自定义 GUI 的功能。我们尽量让自定义变得简单,但有些功能需要解释。 你可以在这里找到更多关于 BentoBox 自定义 GUI 如何工作的信息: 自定义 GUI

我如何自定义 GUI?

要自定义 Level 插件的 GUI,你需要 2.10.0 版本。这是第一个实现它们的版本。插件将在 /plugins/bentobox/addons/level 下创建一个名为 panels 的新目录。

目前你可以自定义 3 个 GUI:

  • 排行榜面板: top_panel - 允许查看前 10 名岛屿。
  • 详细方块面板: detail_panel - 允许在游戏中查看详细的方块价值列表。
  • 方块价值面板: value_panel - 允许在游戏中查看每个方块的价值。

每个 GUI 都包含仅由其自身支持的功能。

PREVIOUS|NEXT 按钮类型是什么?

此按钮在 detail_panel 和 value_panel 中可用。 PREVIOUS 和 NEXT 按钮类型允许在方块多于 GUI 中的空间时创建自动分页。 这些类型在 data 下有额外的参数:

  • indexing - 指示按钮是否显示页码。

示例:

    icon: tipped_arrow[potion_contents={custom_color:11546150}]
    title: level.gui.buttons.previous.name
    description: level.gui.buttons.previous.description
    data:
      type: PREVIOUS
      indexing: true
    action:
      left:
        tooltip: level.gui.tips.click-to-previous

TOP 按钮类型是什么?

此按钮在 top_panel 中可用。它按岛屿等级显示排名前 X 的岛屿。

icon 默认为 PLAYER_HEAD,带有正确的玩家皮肤。启用它将使用指定的材料替换它。

data 字段中的 index 允许指定当前位置应显示前 10 名中的哪个位置。

排行榜面板有 2 个实现的操作,功能需要额外的插件:

  • warp - 需要 Warps 插件。仅当玩家岛屿上存在传送标志时才会显示。
  • visit - 需要 Visit 插件。仅当玩家岛屿上允许访问时才会显示。

Fallback 允许在排行榜位置上没有玩家时更改背景图标。

示例:

    #icon: PLAYER_HEAD
    title: level.gui.buttons.island.name
    description: level.gui.buttons.island.description
    data:
      type: TOP
      index: 1
    actions:
      warp:
        click-type: LEFT
        tooltip: level.gui.tips.click-to-warp
      visit:
        click-type: RIGHT
        tooltip: level.gui.tips.right-click-to-visit
    fallback:
      icon: LIME_STAINED_GLASS_PANE
      title: level.gui.buttons.island.empty

VIEW 按钮类型是什么?

此按钮在 top_panel 中可用。它显示查看者的岛屿等级。

icon 默认为 PLAYER_HEAD,带有正确的玩家皮肤。启用它将使用指定的材料替换它。

view 操作允许查看玩家岛屿的详细菜单。

示例:

    #icon: PLAYER_HEAD
    title: level.gui.buttons.island.name
    description: level.gui.buttons.island.description
    data:
      type: VIEW
    actions:
      view:
        click-type: unknown
        tooltip: level.gui.tips.click-to-view

BLOCK 按钮类型是什么?

此按钮在 detail_panel 和 value_panel 中可用。此按钮将给定材料显示为图标。

示例:

  #icon: STONE
  title: level.gui.buttons.value.name
  description: level.gui.buttons.value.description
  data:
    type: BLOCK

命令#

Tip

[player_command][admin_command] 是根据你运行的游戏模式而不同的命令。 游戏模式的 config.yml 文件包含允许你修改这些值的选项。 例如,在 BSkyBlock 中,默认的 [player_command]island,默认的 [admin_command]bsbadmin

  • /[player_command] top: 访问排行榜面板。需要 [gamemode].island.top 权限。
  • /[player_command] level: 触发玩家的等级计算。需要 [gamemode].island.level 权限。
  • /[player_command] value [material]: 允许检查方块价值。需要 [gamemode].island.value 权限。
  • /[player_command] donate: 打开方块捐献 GUI,将方块价值捐献给岛屿等级。需要 [gamemode].island.level.donate 权限。
  • /[player_command] donate hand [amount]: 将手持物品捐献指定数量给岛屿等级。
  • /[admin_command] level <player>: 触发玩家的等级计算。需要 [gamemode].admin.level 权限。
  • /[admin_command] levelstatus: 显示有多少岛屿在队列中。需要 [gamemode].admin.levelstatus 权限。
  • /[admin_command] sethandicap <player> <number>: 允许设置岛屿等级的初始数值。需要 [gamemode].admin.level.sethandicap 权限。
  • /[admin_command] top: 在聊天中显示前 10 名岛屿。需要 [gamemode].admin.top 权限。
  • /[admin_command] top remove <player>: 允许从排行榜中移除玩家。需要 [gamemode].admin.top.remove 权限。

权限#

Tip

[gamemode] 是一个根据你运行的游戏模式而不同的前缀。 前缀是游戏模式的小写名称,即如果你使用 BSkyBlock,前缀就是 bskyblock。 类似地,如果你使用 AcidIsland,前缀就是 acidisland

  • [gamemode].intopten - (默认: true) - 让玩家出现在前 10 名面板中。
  • [gamemode].island.level - (默认: true) - 允许玩家使用 /[player_command] level 命令。
  • [gamemode].island.top - (默认: true) - 允许玩家使用 /[player_command] top 命令。
  • [gamemode].island.value - (默认: true) - 允许玩家使用 /[player_command] value 命令。
  • [gamemode].island.level.donate - (默认: true) - 允许玩家使用 /[player_command] donate 命令。
  • [gamemode].island.level.details.blocks - (默认: true) - 允许玩家查看岛屿的详细方块列表。
  • [gamemode].island.level.details.spawners - (默认: false) - 允许玩家查看岛屿的详细刷怪笼列表。
  • [gamemode].island.level.details.underwater - (默认: false) - 允许玩家查看岛屿的详细水下方块列表。
  • [gamemode].island.level.details.above-sea-level - (默认: false) - 允许玩家查看岛屿海平面以上的详细方块列表。
  • [gamemode].admin.level - (默认: op) - 允许玩家使用 /[admin_command] level <player> 命令。
  • [gamemode].admin.levelstatus - (默认: op) - 允许玩家使用 /[admin_command] levelstatus 命令。
  • [gamemode].admin.level.sethandicap - (默认: op) - 允许玩家使用 /[admin_command] sethandicap <player> <number> 命令。
  • [gamemode].admin.top - (默认: op) - 允许访问 /[admin_command] top 命令。
  • [gamemode].admin.top.remove - (默认: op) - 允许访问 /[admin_command] top remove <player> 命令。
有缺失的内容吗?

你可以在此插件的 addon.yml 文件中找到完整的权限列表。 如果下面的列表中确实缺少了什么,请告诉我们!

占位符#

提示

[gamemode] 是一个前缀,根据你运行的游戏模式而有所不同。

前缀是游戏模式名称的小写形式,即如果你正在使用 BSkyBlock,前缀则为 bskyblock

每个游戏模式正确翻译的占位符可以在以下位置找到:

请阅读主要的占位符页面.

Placeholder Description Level version
%Level_[gamemode]_island_level% Island level of the player's island 1.9.0
%Level_[gamemode]_visited_island_level% Island level of the island the player is standing on 1.9.0
%Level_[gamemode]_top_value_#rank#% Island level of the #rank#-th island in the Top 10 1.9.0
%Level_[gamemode]_top_name_#rank#% Island owner's name of the #rank#-th island in the Top 10 1.9.0
%Level_[gamemode]_top_island_name_#rank#% Name of the #rank#-th island in the Top 10 2.11.0
%Level_[gamemode]_top_members_#rank#% List of the members of the #rank#-th island in the Top 10 2.11.0
%Level_[gamemode]_top_weighted_value_#rank#% Weighted island level (level/number of members) of the #rank#-th island in the Top 10 2.12.0
%Level_[gamemode]_top_weighted_name_#rank#% Weighted island level name (level/number of members) of the #rank#-th island in the Top 10 2.12.0
%Level_[gamemode]_top_weighted_members_#rank#% Weighted island members (level/number of members) of the #rank#-th island in the Top 10 2.12.0
%Level_[gamemode]_top_weighted_island_name_#rank#% Weighted island name (level/number of members) of the #rank#-th island in the Top 10 2.12.0
%Level_[gamemode]_points_to_next_level% Points to the next level for player 2.3.3
%Level_[gamemode]_rank_value% Displays island rank value 2.7.2
%Level_[gamemode]_island_level_raw% Unformatted island level 2.8.1
%Level_[gamemode]_island_total_points% Total number of points counted before applying level formula 2.10.0
%Level_[gamemode]_island_level_max% Maximum level this island has ever been. Current level maybe lower. 2.10.0

常见问题#

你能添加 X 功能吗?

请将其添加到这里的列表中。

如何让 level-cost 在每个等级后增加?

level-cost 设置是一个固定值,无法按等级逐步增加,因为 BentoBox 通过将单一公式应用于总方块数来计算岛屿等级,而非逐级迭代。

实现等级成本递增的方式是使用 level-calc 公式。例如,若要让每个等级比前一个等级难 50%(即 1 级需要 100 个方块,2 级需要 150 个,3 级需要 225 个,以此类推),公式如下:

level-calc: 2.4661 * log(blocks) - (2.4661 * log(level_cost) - 1)

其中 level_cost 是达到 1 级所需的方块数。

以下是该进度曲线的图表:

template

Warning

该公式在 25 级左右开始渐近——达到 26 或 27 级需要极大量的方块,这可能导致大多数玩家最终趋向相同的最高等级。在选择进度曲线时请考虑这一点。

推导自定义公式

要构建适合特定进度曲线的公式:

  1. 在电子表格(如 Excel 或 Google Sheets)中创建目标等级及其对应方块成本的表格。
  2. 绘制该表格的 X/Y 图表。
  3. 右键单击图表并添加趋势线,选择最适合曲线的近似类型(线性、对数、指数等),然后启用"在图表上显示方程"。
  4. 在生成的方程中,将 x 替换为 blocks,并将其作为 level-calc 的值。

例如,上述 50% 进度就是通过这种方式推导出来的,结果为:

level-calc: 2.4661 * log(blocks) - 10.357

template template

更新日志#

v2.23.0 新内容

发布于: 2026-03-xx

  • Oraxen/Nexo 自定义方块支持。 Level 现在可以计算 Oraxen 和 Nexo 自定义方块的价值。在 blockconfig.yml 中使用 oraxen:block_idnexo:block_id 格式定义价值。
  • 每方块占位符。 针对岛屿中跟踪的每种方块类型动态注册占位符(例如 [gamemode]_island_count_<block>)。由于这些是基于配置动态生成的,请参考 blockconfig.yml 了解你服务器上可用的标识符。

发布 v2.23.0

v2.24.0 新内容 — 需要操作

发布于: 2026-04-xx

  • 方块捐献系统。 玩家现在可以将方块从物品栏直接捐献给岛屿等级,而无需将其放置在岛屿上。新命令: /[player_command] donate(GUI)和 /[player_command] donate hand [amount]
  • 新旗帜 ISLAND_BLOCK_DONATION — 控制谁可以捐献方块(默认:岛屿所有者;最低:成员)。
  • 排行榜面板中新增 DONATED 标签,显示捐献方块贡献。
  • 等级公式中新增 island_members 变量。
  • 🔡 所有语言文件迁移至 MiniMessage。 删除 BentoBox/addons/Level/locales/ 并重启以重新生成。
  • 🔺 需要删除 detail_panel.yml — 删除旧面板文件以获取包含捐献标签的更新版本。

发布 v2.24.0

v2.25.0 新内容

发布于: 2026-04-26

  • CraftEngine 自定义方块支持。 CraftEngine 方块现在可在岛屿等级计算中被计数。在 blockconfig.yml 中使用命名空间 ID 添加(如 mynamespace:my_block: 50)。需要 BentoBox 3.15.0+。可通过在 config.yml 中设置 disabled-plugin-hooks: [CraftEngine] 禁用。
  • 可本地化的 hand 关键字。 /island donate/island value 中的 hand 参数现可通过新的 island.donate.hand.keyword 语言键翻译。英文 hand 始终作为备用被接受。
  • 🔡 所有 16 个非英语语言文件已更新,包含缺失的键。
  • 🔡 乌克兰语语言文件现已完整翻译。

🔡 重新生成语言文件以获取新的 island.donate.hand.keyword 键。

发布 v2.25.0

v2.26.0 新内容

发布于: 2026-05-04

  • 可配置捐献面板。 捐献 GUI 现在通过新的 panels/donation_panel.yml 模板完全可配置,与价值面板、详情面板和前十面板一致。管理员可以将面板调整为 1 至 6 行、重新排列四个命名按钮(INFOCANCELPREVIEWCONFIRM)、更换图标,并添加装饰性物品。捐献网格会自动填充非边框、非命名按钮的所有格子。
  • force-shown: [1,2,3,4] 控制面板使用的行数(支持 1–6 行)。四个必需按钮按其 data.type 放置。如果模板缺失或任一必需按钮不存在,面板将回退到先前硬编码的 4 行布局。
  • 🐛 装饰性模板物品现在会真正显示在物品栏中;自定义 title: 现已生效;force-shown 现作为列表解析(与其他面板 YAML 一致)。
  • 无 API 破坏、无语言变化、无 config.yml 迁移。

⚙️ 捐献面板布局。 首次启动时会生成新的 panels/donation_panel.yml — 不修改即保持 2.25.0 的布局,或编辑以自定义。

发布 v2.26.0

翻译#

帮助我们保持翻译准确

现在 BentoBox 及其插件的大多数翻译已借助 AI 完成——大部分工作已经做好, 但 AI 并不完美。我们真正需要社区提供的是错误报告和纠正

  • 发现错误或措辞不当?请在 bentobox.world 的相关仓库(我们 GitHub 组织的短链接)上提交 issue 或 PR,或者在 Discord 上告知我们。
  • 想要添加全新语言?请在相关仓库的 src/main/resources/locales/ 目录下 提交包含新语言文件的 PR,或在 Discord 上联系我们,我们会为你提供帮助。
语言 语言代码 进度
英语(美国) en-US 100%(默认)
中文(中国) zh-CN 100%
乌克兰语 uk 100%
俄语 ru 100%
匈牙利语 hu 100%
印尼语 id 100%
土耳其语 tr 100%
德语 de 100%
拉脱维亚语 lv 100%
捷克语 cs 100%
法语 fr 100%
波兰语 pl 100%
荷兰语 nl 100%
葡萄牙语 pt 100%
西班牙语 es 100%
越南语 vi 100%
韩语 ko 100%

API#

从 Level 2.7.2 和 BentoBox 1.17 开始,其他插件可以直接访问 Level 插件数据。但是,对于不想使用太多依赖项的插件来说,插件请求仍然是一个很好的解决方案。

Maven 依赖#

Level 为其他插件提供了 API。这涵盖了 Level 2.8.1 及更高版本。

Note

将 Level 依赖项添加到你的 Maven POM.xml 中:

    <repositories>
        <repository>
            <id>codemc-repo</id>
            <url>https://repo.codemc.io/repository/maven-public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>world.bentobox</groupId>
            <artifactId>level</artifactId>
            <version>2.8.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

使用最新的 Level 版本。

然后,一旦你拥有岛屿所在的世界,并确认玩家是该世界中岛屿的所有者,你就可以通过询问 Level 来获得玩家的等级。

Level 的 JavaDoc 可以在这里找到。

事件#

描述

当玩家等级被计算时触发的事件。

链接到类: IslandLevelCalculatedEvent

变量

  • Island island - 岛屿对象。
  • UUID targetPlayer - 计算等级的玩家的 ID。
  • Results results - 计算出的岛屿结果。

代码示例

@EventHandler(priority = EventPriority.MONITOR)
public void onLevelCalculated(IslandLevelCalculatedEvent event) {
    UUID user = event.getTargetPlayer();
    Island island = event.getIsland();
    Results results = event.getResults();

    // 来自结果的死亡惩罚。
    int deathHandicap = event.getDeathHandicap();

    // 来自结果的岛屿初始等级。
    long initialLevel = event.getInitialLevel();

    // 来自结果的岛屿等级。
    long level = event.getLevel();

    // 这将覆盖岛屿等级为 100。
    event.setLevel(100);

    // 达到下一级所需的点数
    long pointsToNextLevel = event.getPointsToNextLevel();

    // 来自结果的报告文本。
    List<String> report = event.getReport();
}

描述

在计算玩家等级之前触发的事件。

链接到类: IslandPreLevelEvent

变量

  • Island island - 岛屿对象。
  • UUID targetPlayer - 计算等级的玩家的 ID。

代码示例

@EventHandler(priority = EventPriority.LOW)
public void beforeLevelCalculated(IslandPreLevelEvent event) {
    UUID user = event.getTargetPlayer();
    Island island = event.getIsland();
}

插件请求处理程序#

直到 BentoBox 1.17,由于我们用于加载插件的类加载器,我们在访问 BentoBox 环境之外的数据时遇到了问题。 这意味着数据只能从其他插件访问。但是 BentoBox 实现了 PlAddon 功能,这意味着请求处理程序不再是必需的。

有关插件请求处理程序的更多信息可以在这里找到。

描述

返回给定世界中玩家的岛屿等级。

输入

  • world-name: String - 世界名称。
  • player: UUID - 玩家的 UUID。

输出

玩家的岛屿等级,如果输入无效或该玩家在此世界中没有岛屿,则为 0L

Failure

如果未提供 world-nameworld-name 不存在或不是游戏模式世界,此处理程序将返回 0L

代码示例

    /**
     * 返回给定世界中玩家的岛屿等级。
     * @param playerUUID 玩家的 UUID,不为 null。
     * @param worldName 岛屿所在的世界(主世界)名称,不为 null。
     * @return 玩家的岛屿等级,如果输入无效或该玩家在此世界中没有岛屿,则为 {@code 0L}。
     */
    public long getIslandLevel(UUID playerUUID, String worldName) {
        return (Long) new AddonRequestBuilder()
            .addon("Level")
            .label("island-level")
            .addMetaData("world-name", worldName)
            .addMetaData("player", playerUUID)
            .request();
    }

描述

返回拥有的岛屿位于前 10 名的玩家,映射到他们岛屿的等级。

输入

  • world-name: String - 世界名称。

输出

Map<UUID, Long>,包含拥有的岛屿位于前 10 名的岛主的 UUID,映射到他们岛屿的等级。

Failure

如果未提供 world-nameworld-name 不存在或不是游戏模式世界,此处理程序将返回空 map。

代码示例

    /**
     * 返回拥有的岛屿位于前 10 名的玩家,映射到他们岛屿的等级。
     * @param worldName 岛屿所在的世界(主世界)名称,不为 null。
     * @return 一个 Map,包含拥有的岛屿位于前 10 名的岛主的 UUID,映射到他们岛屿的等级,
     *         如果指定的世界不存在或不包含岛屿,则返回一个空 map。
     */
    public Map<UUID, Long> getTopTen(String worldName) {
        return (Map<UUID, Long>) new AddonRequestBuilder()
            .addon("Level")
            .label("top-ten-level")
            .addMetaData("world-name", worldName)
            .request();
    }

Last update: May 9, 2026 23:22:41