战利品箱

战利品箱

默认提供六个不同等级的战利品箱。你可以使用数据包或KubeJS来自定义自己的战利品箱。

杂项

战利品箱

战利品箱是一个由定义驱动的战利品箱模组。该模组只注册一种战利品箱物品,即 lootbox:loot_box;实际的箱子类型存储在物品的 loot_box_id 数据中。战利品箱可以来自内置定义、数据包或 KubeJS。

在登录时以及执行 /reload 之后,服务器会将最终定义与每个客户端同步。在多人游戏中,JEI、创造模式物品栏、物品名称、颜色、提示文本和奖励预览因此都使用服务器的数据。

快速开始

/lootbox give @s lootbox:common
/lootbox give @s lootbox:rare 3

内置箱子等级从低到高依次为:

common → unusual → rare → epic → legendary → endurance

耐力奖励箱有 0.01% 的概率进入其奖励抽取。在这些抽取中,80% 会给予 100 个钻石块,20% 会给予 100 个绿宝石块。其余 99.99% 的概率会给予另一个耐力奖励箱。

内置战利品表可选用地包含来自通用机械、机械动力、Iron's Spells 'n Spellbooks、Goety、应用能源2、Terra Entity、暮色森林和以太世界的代表性物品。缺失的模组会被自动跳过,绝不会成为硬性依赖。

数据包

请将定义放置在:

data/<命名空间>/loot_boxes/<id>.json

完整示例:

{
  "display_name_key": "example.lootbox.name",
  "color": "#00E5FF",
  "rolls": 2,
  "jei_info_key": "example.lootbox.jei_info",
  "entries": [
    {
      "item": "minecraft:diamond",
      "min": 1,
      "max": 3,
      "weight": 10,
      "luck_weight": 2,
      "condition": { "type": "luck", "min": 2 }
    },
    {
      "tag": "minecraft:music_discs",
      "min": 1,
      "max": 1,
      "weight": 5
    },
    {
      "box": "lootbox:rare",
      "min": 1,
      "max": 1,
      "weight": 1
    }
  ]
}

根字段

字段 类型 描述
display_name_key 字符串 箱子名称的翻译键。推荐使用。如需使用字面文本,请改用 display_name。
color #RRGGBB、0xRRGGBB 或整数 应用于箱子纹理的颜色。默认为白色。
rolls 整数 每次开启的奖励抽取次数。默认为 1。
jei_info_key 字符串 JEI 信息面板的翻译键。如需使用字面文本,请改用 jei_info。
entries 数组 奖励条目。每个条目必须且只能定义 item、tag 或 box 其中之一。

奖励条目

  • item:固定的物品 ID。
  • tag:物品标签 ID。将从标签中均匀随机选择一个物品,同时该条目的总权重保持不变。数据重载后会重新解析标签。
  • box:另一个战利品箱的 ID。
  • min、max:数量范围。
  • weight:基础条目权重。
  • luck_weight:最终权重为 weight + 玩家幸运值 × luck_weight。
  • condition: {"type":"luck","min":2}:要求玩家的幸运值至少为 2。
  • condition.display_key 或 condition.display:用于在 JEI 和提示文本中显示已注册自定义条件的文本。

标签奖励仍作为一个逻辑奖励条目。在 JEI 中,所有匹配的物品会显示在一个输出槽位中并在该槽位内循环显示。在详细提示文本中,会显示前两个匹配物品以及匹配物品的总数。

KubeJS

将战利品箱定义放在 kubejs/server_scripts/lootbox.js 中,以便它们可以被 /reload 重新执行。仅在需要完整游戏重启期间注册的内容时才使用 startup_scripts。

建议在重新注册之前清除之前的脚本定义:

const LootBoxApi = Java.loadClass('net.xuwu.lootbox.LootBoxApi')

LootBoxApi.clearScriptedDefinitions()
LootBoxApi.registerCondition(
  'has_vip_tag',
  ctx => ctx.hasPlayer() && ctx.player().getTags().contains('vip'),
  ctx => 'VIP required'
)

LootBoxApi.registerTranslated(
  'example:vip',
  'example.lootbox.vip',
  1,
  LootBoxApi.entries(
    LootBoxApi.entry('minecraft:diamond', 1, 2, 10, 2, 'has_vip_tag', ''),
    LootBoxApi.entryTag('minecraft:music_discs', 1, 1, 5, 0, '', ''),
    LootBoxApi.entryBox('lootbox:rare', 1, 1, 1, 0, '', '')
  ),
  0x00E5FF,
  'example.lootbox.vip_jei_info'
)

数据包与 KubeJS 对照表

数据包 KubeJS 描述
display_name register 字面形式的箱子名称。
display_name_key registerTranslated 翻译键形式的箱子名称。
item entry 固定物品奖励。
tag entryTag 从标签中均匀随机选择。
box entryBox 另一个战利品箱作为奖励。
jei_info_key register(..., color, jeiInfoKey) JEI 信息的翻译键。
condition.display_key entryWithConditionKey、entryTagWithConditionKey、entryBoxWithConditionKey 条件文本的翻译键。
min、max、weight、luck_weight 所有 entry* 方法 数量、权重和幸运权重。

标签、箱子以及带翻译的条件也可以独立组合使用:

LootBoxApi.registerTranslated(
  'example:translated',
  'example.lootbox.translated',
  1,
  LootBoxApi.entries(
    LootBoxApi.entryTagWithConditionKey(
      'minecraft:music_discs', 1, 1, 10, 0, 'has_vip_tag', 'example.condition.vip'
    ),
    LootBoxApi.entryBox('lootbox:endurance', 1, 1, 1, 0, '', '')
  ),
  0x7C4DFF,
  'example.lootbox.translated_jei_info'
)

配置

所有设置都存储在 config/lootbox-common.toml 中。服务器的配置决定了实际的游戏规则:

  • hide_default_boxes:隐藏内置箱子,并将其从创造模式物品栏和 JEI 中移除。默认为 false。
  • mob_drops_enabled:启用在被击杀的生物上掉落内置战利品箱。默认为 true。
  • enable_mekanism_rewards、enable_create_rewards、enable_irons_spellbooks_rewards、enable_goety_rewards、enable_ae2_rewards、enable_terra_entity_rewards、enable_twilight_forest_rewards 和 enable_aether_rewards:分别独立启用可选的模组集成。全部默认为 true。
  • mob_drop_chances:配置六个内置箱子等级的掉落几率。每次击杀最多掉落一个内置箱子。检查顺序依次为:Endurance、Legendary、Epic、Rare、Unusual、Common。

接收到服务器快照后,客户端会使用服务器的箱子列表和隐藏设置刷新 JEI 和创造模式物品栏。本地客户端配置仅在连接到服务器之前作为界面回退使用。

JEI

安装了 JEI 后,每个可见的战利品箱都会显示一个配方条目,包含其输入箱子和可能的奖励:

  • 输入和输出槽位使用 JEI 的标准槽位背景。
  • 标签奖励被合并到一个输出槽位中,并在所有匹配物品之间循环显示,而不会分割该标签条目的总权重。
  • 大量奖励列表显示在可滚动的 7×4 奖励网格中。拖动滚动条或使用鼠标滚轮浏览所有奖励。
  • 悬停输出项会显示其数量、权重、幸运权重、在当前幸运值下的最终概率以及条件。
  • 未满足幸运条件的奖励在 JEI 和提示文本中均一致地显示 0.00%。
  • jei_info_key 或内置箱子的获取/掉落信息显示在 JEI 条目的下方。较长的英文文本会自动换行。

自动战利品箱开启器

自动战利品箱开启器在其输入槽位中接受一个战利品箱,并将生成的奖励送出其输出物品栏。可以从“功能方块”创造模式标签页中访问,或使用以下配方合成:

铁锭 | 漏斗 | 铁锭
铁锭 | 红石 | 铁锭
铁锭 | 铁锭 | 铁锭

该方块需要铁镐或更高等级的镐才能在被开采时掉落自身。如果它被无效工具破坏或强制移除方块破坏,其中存储的所有物品仍然会掉落。

多人游戏与重新加载

  1. 将数据包放入世界的 datapacks 目录,并将 KubeJS 定义放入服务器的 kubejs/server_scripts 目录。
  2. 执行 /reload。
  3. 服务器会重新计算数据包和 KubeJS 的定义,并将最终快照发送给每一位在线玩家。
  4. 客户端会自动刷新 JEI、创造模式物品栏、箱子名称、颜色和奖励显示。玩家无需在每个客户端上单独安装或执行相同的脚本。

如果新箱子不可见,请首先确保服务器和客户端使用匹配的模组版本。然后依次检查 hide_default_boxes、KubeJS 日志以及 /reload 后的服务器日志。未知或已移除的定义会通过物品快照安全显示,并且不会导致已包含这些箱子的世界崩溃。