世界生成路由器

世界生成路由器

将维度划分为世界集,并控制其他模组在每个世界中生成、刷新或掉落的内容——完全通过配置实现,无需任何内容模组。

Worldgen Router 让整合包作者能够通过配置文件控制其他模组在每个维度中可能生成、刷新或掉落的内容。完全通过配置文件实现,无需内容模组,无需编写代码,也无需针对每个模组编写兼容补丁。

你可以控制的内容

  • 生物群系、结构、地物与雕刻器 — 按维度,在生成时生效
  • 自然生成,包括区块生成期间生成的生物
  • 战利品、交易、合成与玩家物品栏,每一项均可独立开关
  • 整个模组命名空间或单个 ID,它们之间有固定的优先级顺序
  • 多套独立的主世界–下界–末地分组,传送门可在每组内部路由
  • 通过配置文件声明的自定义维度,支持模板、固定种子和传送门路由
  • 游戏内可解释每条允许/拒绝决策,包括最终生效的具体规则
  • 被拒绝的结构 ID 会立即令 /locate 失败,而不是扫描区块寻找永远不可能生成的内容

安装它不会改变任何东西

初始配置文件自带 default = "allow"。放入 jar 文件后,你的整合包玩法与之前完全一致。在您编写规则之前,不会拒绝任何内容。

只需一个值即可开始整理:

[world_sets.curated]
overworld = "minecraft:overworld"
nether    = "minecraft:the_nether"
end       = "minecraft:the_end"

default = "deny"
allow_namespaces = ["minecraft", "yourmod"]

该分组现在只生成其允许的命名空间所拥有的内容。未被任何世界分组声明的维度行为与原版完全一致。

在一个原本开放的整合包中阻止两个模组只需一行:

deny_namespaces = ["somemod", "othermod"]

运行要求

仅支持 Minecraft 1.21.1 和 NeoForge 21.1.x。 这个范围是刻意锁定的:此模组直接挂钩 1.21.1 的世界生成内部机制,未在其他版本上验证。

仅需 Minecraft + NeoForge 即可启动 — 无强制依赖。允许列表存放在配置文件中,因此从整合包中添加或移除模组永远不需要重建 jar 文件。

规则能够准确表达你的意图

规则按类别 — structure、feature、carver、entity、biome、item — 和实施点划分。因此,“整理此处生成的内容,但不要动玩家的物品栏”只需几行,而不是一个愿望:

[world_sets.curated.rules.item]
apply_to = ["loot", "trade"]

同样的机制也意味着你可以整理生成周期而不剥夺工具:

[world_sets.curated.rules.entity]
apply_to = ["natural_spawn"]   # 生物停止生成;/summon 和刷怪蛋仍然有效

优先级固定、完全且可检查

deny_ids > allow_ids > deny_namespaces > allow_namespaces > default

永远不必猜测哪条规则生效:

/worldgenrouter explain structure somemod:some_structure
result    DENIED
matched   rules.structure.deny_namespaces
priority  3 of 5 - checked after deny_ids, allow_ids did not match

/worldgenrouter status 会按类别打印生效规则。/worldgenrouter reload 会实时重新读取它们 — 编辑出错时会保留之前的规则,而不是导致服务器崩溃。

维度、数据包和可复用配置

  • 在配置中声明自定义维度。 使用 overworld、nether 或 end 模板,或提供你自己的生成器 JSON,并可选择固定种子。
  • 在世界分组内部路由传送门。 一个分组可以拥有自己的主世界、下界和末地,在该主世界点燃的传送门会到达该分组自己的下界 — 绝不会到达原版下界。
  • 数据包可以附带一个世界分组,这样整合包可以同时携带其维度和管理这些维度的规则。数据包也可以向现有分组添加拒绝规则,但绝不能放宽规则:已安装的数据包不能悄悄撤销服务器所有者的隔离设置。
  • 主题(Themes) 允许通过 extends 让多个世界分组共享一套规则。
  • 快照(Snapshots) 可将包含 200 个模组的允许列表变成一行。

当它拒绝启动时

此模组宁可报错失败,也不会静默地什么都不做 — 未知键、规则列表中的标签或已删除的键都会中断启动并指明文件名、世界分组和键。静默地忽略拼写错误的 allow_namespace 可能导致世界分组未执行任何规则,而你可能直到地形已经生成后才发现问题。

已知限制,事先说明

  • 全局生物群系系统。 通过自己的全球区域系统(而非维度的生物群系源)放置生物群系的模组,无法被一个整理过的分组完全包含 — 外部生物群系仍可能出现在其中。此模组在启动时检测到这种情况并发出警告,而不是假装无事发生;在不存在已验证适配器的情况下,它会拒绝启动,而不是让一个全局系统绕过隔离规则。适配器锁定版本,因此它们挂钩的系统的未测试版本也会拒绝加载,而不是错误地生成你的世界。这仅适用于检测到的全局生物群系系统会绕过你实际上已执行的隔离规则的情况 — 仅安装不支持的模组本身永远不会阻止游戏启动。启动时会明确指出发现了什么;整合包作者指南列出了哪些系统已覆盖,哪些未覆盖。
  • 已保存到区块中的生物会保留。 生成规则适用于生物可能被创建的那一刻;不会清除世界已有的实体。但物品栏会被清除。
  • 规则列表中的标签(#namespace:id)目前会被拒绝,而不是静默地不匹配任何内容。
  • /locate 使用标签与使用 ID 不同。 被拒绝的 ID 会立即从搜索中消失;而标签通常也包含允许的成员,原版会继续寻找这些成员。这种搜索可能耗时很长,看起来像卡住了一样。在断定拒绝失败之前,请先定位一个普通的 ID。
  • 世界生成不追溯既往。 规则适用于其之后的区块生成;现有地形保留其已有内容。

文档

完整的设置教程 — 每个配置文件、类别覆盖、实施点、快照、声明维度、两种数据包格式、主题、验证报告和兼容性矩阵 — 都在整合包作者指南中。

错误报告和整合包作者问题: GitHub issues。