其他阶段

其他阶段

完整的基于阶段的进度系统,可锁定Minecraft游戏内容直至满足特定条件,配备自动配置工具及高级优化功能。

管理

OtherStages

OtherStages 是一个可配置的、基于阶段的进度系统,适用于 Minecraft Forge 1.20.1。

它允许你将内容锁定在自定义阶段之后,并通过可配置的进度规则来解锁这些阶段。相同的阶段元数据也驱动游戏内的解锁覆盖界面、物品提示文本以及多个警告系统。

模组支持的功能

  • 封锁特定的物品、物品命名空间、物品标签以及区分 NBT 的物品变体。
  • 对物品的使用、放置、攻击、挖掘、玩家合成结果、锻造/铁砧操作、切石机、类似熔炉的手动配方插入、战利品掉落以及可直接使用的装备栏位应用物品限制。
  • 封锁生物、结构、维度以及村民交易等级。
  • 使用每个阶段的 display_name、description、icon 和 color 显示阶段解锁覆盖界面。
  • 在被封锁的物品上显示提示文本警告。
  • 警告玩家远离被限制的维度,并可选择将玩家传送出去。
  • 实时检测被封锁的结构,并阻止在其内部的交互、破坏、放置和攻击行为。
  • 在安装了 JEI 或 REI 模组时,隐藏被封锁的物品。
  • 通过进度、物品数量、经验、维度、击杀数、合成数、FTB Quests 以及嵌套的 AND / OR 逻辑来解锁阶段。
  • 使用 otherstages:stage_analyzer 物品从存储方块生成 JSON 片段。

重要行为

  • 阶段文件夹的名称即是内部的阶段 ID。它可以是任何内容,例如 machine_age、arcane_tier 或 chapter_03。
  • 每个阶段都必须有 stage_info.json 文件。其他 JSON 文件是可选的。
  • 阶段的 order(顺序)很重要。如果玩家拥有一个 order 值更高的阶段,则该玩家也满足来自较低顺序阶段的限制。
  • 如果你希望实现清晰的线性进度,请保持 order 值唯一且递增。
  • 示例阶段文件夹会在首次启动时自动创建。它们只是示例;你可以重命名或删除它们。

文件夹布局

首次启动时,模组会在以下位置创建配置文件:

config/
  otherstages-server.toml
  otherstages/
    stages/
      <stage_name>/
        stage_info.json
        blocked_items.json
        blocked_mobs.json
        blocked_structures.json
        blocked_dimensions.json
        blocked_villager_trades.json
        progression.json
    generated/

config/otherstages/generated/ 文件夹被阶段分析器物品使用。

stage_info.json

此文件定义了阶段的身份标识和向玩家显示的元数据。

支持的字段

字段 必需 类型 说明
display_name 否 字符串 在命令、消息和解锁覆盖界面中显示。如果未设置,则回退到格式化的文件夹名称。
description 否 字符串 可选的副标题/描述,用于解锁覆盖界面和阶段信息输出。
color 否 字符串 十六进制颜色,格式为 #RRGGBB。用于为解锁覆盖界面上色。
icon 否 字符串 物品 ID,例如 minecraft:diamond_pickaxe。用于解锁覆盖界面。
order 否 整数 控制进度层级。较高的 order 值意味着更高的阶段。

支持翻译的字符串

如果 display_name 或 description 以 otherstages. 开头,则会被视为翻译键。否则,它们将作为纯文本显示。

示例

{
  "display_name": "Machine Age",
  "description": "Basic automation is now available.",
  "color": "#4FC3F7",
  "icon": "minecraft:observer",
  "order": 3
}

可选的每个阶段文件

blocked_items.json

用于封锁特定物品 ID、物品命名空间、NBT 变体、标签、基于菜单的访问规则以及与相同阶段关联的交互驱动型方块目标。

支持的键:

  • blocked_items
  • blocked_namespaces
  • blocked_tags
  • tagList (blocked_tags 的旧别名)
  • blocked_recipes
  • blocked_menu_classes
  • blocked_menu_packages
  • blocked_menu_types
  • blocked_block_ids
  • blocked_block_classes
  • blocked_block_entity_classes
  • blocked_block_entity_packages

每个 blocked_items 条目支持:

  • item
  • 可选的 nbt
  • 可选的 exact_match

示例:

{
  "blocked_items": [
    { "item": "minecraft:diamond_pickaxe" },
    {
      "item": "minecraft:potion",
      "nbt": { "Potion": "minecraft:strong_healing" },
      "exact_match": false
    }
  ],
  "blocked_namespaces": [
    "create"
  ],
  "blocked_tags": [
    "forge:tools/netherite"
  ],
  "blocked_recipes": [
    "minecraft:iron_pickaxe",
    "minecraft:netherite_upgrade_smithing"
  ],
  "blocked_menu_packages": [
    "appeng",
    "com.refinedmods.refinedstorage"
  ],
  "blocked_menu_types": [
    "minecraft:anvil",
    "minecraft:smithing"
  ],
  "blocked_block_ids": [
    "create:mechanical_crafter"
  ],
  "blocked_block_entity_packages": [
    "com.simibubi.create.content.kinetics.crafter"
  ]
}

命名空间匹配是精确的。create 会封锁 create:*,但它不会封锁 createaddition:*。

blocked_recipes 匹配配方 ID,目前对玩家合成网格、工作台、锻造菜单、切石机以及手动将材料插入类似熔炉的菜单时有效。

blocked_menu_classes 匹配精确的菜单类名。blocked_menu_packages 匹配其完全限定名称以配置前缀开头的任何菜单类。blocked_menu_types 在注册了 MenuType ID 时匹配该 ID。

blocked_block_ids 匹配已放置方块的 ID 本身,例如 create:mechanical_crafter。blocked_block_classes 匹配运行时的方块类。blocked_block_entity_classes 和 blocked_block_entity_packages 用于那些暴露方块实体但不打开普通菜单的交互驱动型机器。

被封锁物品规则在游戏中的生效效果:

  • 阻止直接使用该物品。
  • 阻止放置被封锁的方块以及使用被封锁的工具或武器。
  • 在玩家合成网格和工作台中清除被封锁的合成结果。
  • 在玩家合成网格、工作台、锻造菜单、切石机以及手动将材料插入类似熔炉的菜单时,封锁已配置的配方 ID。
  • 阻止手动将被封锁的物品放入非玩家的菜单槽位,包括许多模组化的工作台和终端。
  • 当没有所需阶段的玩家打开已配置的被封锁菜单时,自动关闭该菜单。
  • 拒绝对已配置的交互驱动型方块(如 create:mechanical_crafter)进行交互,即使它们不打开普通菜单。
  • 拒绝使用被封锁输入物的锻造或铁砧操作。
  • 阻止从类似结果的菜单槽位中取出被封锁的输出物,防止其被移动到可直接使用的玩家槽位。
  • 通过将物品移动到主物品栏或在主物品栏满时丢弃,从快捷栏、副手、护甲栏和支持的 Curios 槽位中移除被封锁的物品。
  • 阻止被封锁的物品在玩家主物品栏中运行正常的玩家物品栏更新。
  • 过滤掉为该玩家生成的战利品中的被封锁物品。

OtherStages 保持基于玩家的状态。来自其他模组的自动化仍然可以制造被封锁的物品,但被封锁的玩家不能将其放置在可直接使用的槽位中,不能手动使用它们,也不能手动将被封锁的配方材料喂入许多菜单驱动的机器界面。

blocked_mobs.json

封锁列表中实体的自然生成和附近的生成尝试。

{
  "blocked_mobs": [
    "minecraft:enderman",
    "minecraft:warden"
  ]
}

blocked_structures.json

封锁进入和在列出的结构内部进行交互。

{
  "blocked_structures": [
    "minecraft:stronghold",
    "minecraft:ancient_city"
  ]
}

Minecraft 1.20.1 为许多村庄变体使用单独的 ID,因此请包含你想要封锁的每个变体。

blocked_dimensions.json

封锁前往列出的维度的传送。

{
  "blocked_dimensions": [
    "minecraft:the_nether",
    "minecraft:the_end"
  ]
}

如果在 otherstages-server.toml 中启用了 teleportOnInvalidDimension,那么登录时发现处于被限制维度内的玩家可以被传送回安全位置。

如果玩家的重生点设置在被封锁的维度内,则重生目标将被重置为主世界。

blocked_villager_trades.json

根据职业和等级封锁村民交易。

每个条目支持的字段:

  • profession
  • level
  • min_level
  • max_level

profession 可接受:

  • 职业 ID,例如 minecraft:librarian
  • *
  • any
  • 空值 / null

示例:

{
  "blocked_villager_trades": [
    {
      "profession": "*",
      "min_level": 2,
      "max_level": 5
    },
    {
      "profession": "minecraft:cleric",
      "level": 1
    }
  ]
}

如果某个村民既有允许的交易也有被封锁的交易,则交易界面打开时只会显示可访问的报价。如果没有任何可访问的交易,玩家将收到一条警告信息。

progression.json

定义玩家如何解锁该阶段。

支持的条件类型:

  • advancement
  • item_count
  • experience
  • dimension
  • kill_count
  • craft_count
  • ftb_quest
  • and
  • or

示例:

{
  "unlock_conditions": {
    "type": "AND",
    "conditions": [
      { "type": "advancement", "advancement": "minecraft:story/enter_the_nether" },
      { "type": "item_count", "item": "minecraft:blaze_rod", "count": 8, "consume": true },
      { "type": "dimension", "dimension": "minecraft:the_nether" }
    ]
  },
  "next_stage": "end_access"
}

next_stage 是可选的。作为你自己阶段链的文档可能很有用,但实际的解锁逻辑是由 unlock_conditions 驱动的。

进度检查的运行方式

模组会在发生有用事件时自动重新评估进度,这些事件包括:

  • 玩家登录
  • 玩家带有冷却时间的游戏刻更新
  • 完成进度
  • 交互
  • 击杀
  • 合成
  • 拾取物品
  • 维度变化

你也可以使用以下命令强制重新检查:

/otherstages check <player>

命令

所有命令都在 /otherstages 下,需要权限等级 2。

阶段检查

/otherstages stage list
/otherstages stage <stage_name> info
/otherstages player <target> info

阶段管理

/otherstages player <target> add <stage>
/otherstages player <target> remove <stage>
/otherstages player <target> clear
/otherstages player <target> reset

reset 现在使用 config/otherstages-server.toml 中的 defaultStartingStage 值。

进度与重载

/otherstages check <player>
/otherstages reload
/otherstages cache clear
/otherstages cache info

cache info 打印当前物品缓存条目、被追踪的玩家、命中数、未命中数、失效数和命中率。

调试辅助

/otherstages debug item
/otherstages debug menu
/otherstages debug block
/otherstages debug stages
/otherstages dimension check <player> <dimension>
/otherstages dimension list <player>

debug menu 在存在当前打开的菜单时打印该菜单,或者在关闭后打印最后记住的非玩家菜单。它会显示类、包、已注册的菜单类型、当前玩家是否被其封锁、适用的所需阶段(如果有),以及可供复制的 blocked_menu_* 片段。它还会建议哪个键通常最适合当前屏幕。

debug block 检查你所注视的方块。它适用于诸如 Create 模组之类的系统,在这些系统中,交互可能是由方块驱动而非菜单驱动的。它现在会打印可供复制的 blocked_block_* 片段,并建议最稳定的键来使用。如果该方块看起来不像是基于菜单的,那么 blocked_menu_* 可能不是正确的杠杆。

客户端行为

解锁覆盖界面

当一个阶段被授予时,客户端会收到一个阶段解锁通知,其中使用了:

  • display_name
  • description
  • icon
  • color

这是当前通用的覆盖界面格式。它不依赖于诸如 stone_age、iron_age 或 diamond_age 之类的阶段名称。

提示文本

被封锁的物品会添加一行提示文本,告诉玩家需要哪个阶段。

JEI / REI

如果安装了 JEI 或 REI,则会根据每个玩家已解锁的阶段,为其隐藏被封锁的物品。

维度和结构警告

  • 被限制的维度会使用一个警告覆盖界面,并可选择进行安全传送。
  • 被限制的结构会使用警告覆盖界面,外加强制的交互封锁。

服务器配置

主服务器配置文件:

config/otherstages-server.toml

重要选项:

  • enableStageMode
  • enableTooltips
  • enableWarnings
  • warningDuration
  • teleportOnInvalidDimension
  • defaultStartingStage
  • enableDebugLogging
  • cacheSize

defaultStartingStage 目前被 /otherstages player <target> reset 命令使用。在当前代码路径中,它不会在首次登录时自动授予每个新玩家。

阶段分析器

模组包含了 otherstages:stage_analyzer 物品。

使用方法:

  1. 给自己这个物品。
  2. 潜行并右键点击一个存储方块。
  3. 模组会扫描其中的内容,并将 JSON 行写入 config/otherstages/generated/。
  4. 将生成的行复制到你的 blocked_items.json 文件中。

分析器支持原版的容器和许多模组化的存储系统(通过直接支持或反射回退实现)。

如果点击的方块不是支持的容器,分析器会回退到方块检查读取模式,显示方块的 ID 和状态属性。

备注与当前范围

  • 本 README 文档记录的是当前代码路径中活跃的、由加载器支持的阶段文件。
  • 存在一些未来限制类型的内部框架,但本 README 仅文档记录当前在游戏玩法中强制执行的特性。
  • 每个阶段都必须有 stage_info.json 文件。
  • 文件夹名称即是内部的阶段 ID。
  • 较高的 order 值意味着更高的进度等级。
  • 如果一个阶段应该表现为更后期等级,请给它一个更大的 order 值。
  • 编辑 JSON 文件后,使用 /otherstages reload 命令重新加载。