其他舞台

其他舞台

完整的基于阶段的进度系统,可在满足特定条件之前阻止Minecraft内容,并配有自动配置工具和高级优化功能。

OtherStages

OtherStages 是一个为 Minecraft Forge 1.20.1 设计的、可配置的、基于阶段(Stage)的进度系统。

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

模组支持的功能

  • 阻止特定物品、物品命名空间、物品标签和 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 值较低的阶段的限制条件。
  • 如果你想要一个清晰的线性进度,请保持 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 Analyzer)物品使用。

stage_info.json

此文件定义了阶段的标识以及向玩家展示的元数据。

支持的字段

字段 必需 类型 说明
display_name 否 string 在命令、消息和解锁界面中显示。如果未提供,则会回退为文件夹名称的格式化版本。
description 否 string 可选的副标题/描述,由解锁界面和阶段信息输出使用。
color 否 string #RRGGBB 格式的十六进制颜色码。用于为解锁界面着色。
icon 否 string 物品 ID,例如 minecraft:diamond_pickaxe。在解锁界面中使用。
order 否 integer 控制进度层级。较高的 order 值表示更高级的阶段。

支持翻译的字符串

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

示例

{
  "display_name": "机器时代",
  "description": "基础自动化现已可用。",
  "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 时进行匹配。

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

被阻止的物品规则在游戏中的生效效果:

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

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 (FTB Quests)
  • 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 驱动的。

进度检查如何运行

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

  • 玩家登录
  • 带冷却时间的玩家 Tick
  • 进度完成
  • 交互
  • 击杀
  • 合成
  • 拾取物品
  • 维度变更

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

/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 命令重载。

链接

Minecraft Logo