Skip to content

星辉魔法(Astral Sorcery) ​

Since after 21.1.2

Astral Sorcery(星辉魔法)整合把流明(lumen)和星能(starlight)作为配方 capability 加入,各配一个存放它们的 Trait,另有三个读取天空与玩家研究进度的条件,以及一个记录机器采用谁的研究进度的 Trait。它只存在于高于 21.1.2 的 MBD2 版本中。

MBD2 Inspector 中的 Astral Lumen Storage Trait:从 Name 到 GUI IO 的通用 Trait 字段,然后是 Capacity 4000、Lumen Types、Max Receive、Max Extract、勾选的 Provide To Network、未勾选的 Draw From Network、Draw Interval 20 和勾选的 Transfer Particles
默认设置下的 `astral_lumen_storage` Trait:一个流明缓冲,把存有的流明供应给 Astral Sorcery 的流明网络,但不从网络汲取。

版本

MBD2 针对 Minecraft 1.21.1 的 Astral Sorcery 2.0.3.63 构建,而 Astral Sorcery 2.0.3 没有 Curios 9.5.1 或更新版本就拒绝启动。Astral Sorcery 没有 API,MBD2 用的是它的内部类:换一个 Astral Sorcery 版本就可能让整合失效。请用整合包里的准确版本测试。

加入了什么 ​

层注册名用途
配方 capabilityastral_lumen单一类型的流明,整数数量,可输入可输出
配方 capabilityastral_starlight某个星座或任意星座的星能,小数数量,只能输入
Traitastral_lumen_storage按类型存放的流明缓冲,暴露为 Astral Sorcery 的流明 capability,并能加入流明网络
Traitastral_starlight_receiver保存透镜送到机器上的星能
Traitastral_researcher记录机器采用哪位玩家的 Astral Sorcery 进度
条件astral_constellation某个星座在天空中
条件astral_celestial_event日食或月食
条件astral_research机器的研究者进度足够
星能网络节点mbd2:machine_starlight_receiver接收器 Trait 在 Astral Sorcery 星能网络里登记的节点
KubeJSinputLumen、outputLumen、inputStarlight、astralConstellationCondition、astralCelestialEventCondition、astralResearchCondition见 KubeJS

所有条目都以模组 ID astralsorcery 为条件。三个 Trait 每台机器各只能加一个。

流明与星能 ​

这两种资源在 Astral Sorcery 里的传输方式不同,所以各有各的 Trait。

流明星能
在 Astral Sorcery 中可存储的资源,分多种类型,如 Aevitas(生息)、Armara(甲御)、Vicio(动势),存放在 Lumen Array 里Starlight Focus Crystal 每 tick 发出的光流,带有它的星座。没有任何东西存储它
怎么传输只能拉取的网络:设备向 16 格内、视线可及的源节点请求流明,或经 Lumen Filament 传得更远用 Linking Tool 建立的链接,从聚焦水晶经 Lens 和 Prism 传递
Traitastral_lumen_storageastral_starlight_receiver
配方方向输入和输出只能输入
数量整数;一瓶为 500小数

流明存储 ​

设置范围默认含义
Capacity(容量)1 及以上4000机器对每种流明各能存多少。一个 Lumen Array 为 4000
Lumen Types(流明类型)流明 ID空允许存入哪些类型,留空接受所有类型。也是 Draw From Network 会请求的类型
Max Receive(最大输入)0 及以上4000每次操作最多存入的流明:经 capability 的每次插入,以及每次从网络汲取时的每种类型
Max Extract(最大输出)0 及以上4000每次操作最多取出的流明,包括 Astral Sorcery 设备从机器汲取
Provide To Network(向流明网络供应)开作为源节点加入流明网络
Draw From Network(从流明网络汲取)关像祭坛一样从网络把流明拉进来
Draw Interval(汲取间隔)1–1200 tick20多久汲取一次
Transfer Particles(传输粒子)开汲取时沿链路显示 Astral Sorcery 的传输效果
Recipe Handler IOIN有输出流明的配方时设为 BOTH 或 OUT
Capability IO按面BOTH每个面上其他模组能否通过 ILumenHandler.BLOCK 插入或提取。internal(内部)是流明网络使用的那一面

机器自身的配方不受 Max Receive 和 Max Extract 限制。Lumen Types 只管存入:某个类型移出列表后,已存的流明仍然留着,也照样能被消耗。调小 Capacity 会丢弃放不下的部分。

接入流明网络 ​

流明不走管道。Astral Sorcery 维护一个节点网络:Lumen Array 等源节点供应流明,祭坛、Lumen Crystallizer 等设备请求流明,Lumen Filament(流明丝结)把请求传下去。两个节点相距不超过 16 格且中间视线无遮挡时,请求就能到达;一串彼此可见的丝结能把它传得更远。

让 Astral Sorcery 给机器供流明:

  1. 在 Lumen Types 里列出机器需要的类型,并打开 Draw From Network。列表为空时它什么都不汲取。
  2. 把机器放在 Lumen Array 16 格以内且两者之间视线无遮挡的位置,或者用 Lumen Filament 补上距离。
  3. 每隔 Draw Interval tick,机器为每种列出的类型发一次请求,在缓冲放得下的范围内最多取 Max Receive。

让 Astral Sorcery 设备使用机器里的流明:保持 Provide To Network 开启。机器会供应它存有的每种类型,范围内的设备每次请求最多取走 Max Extract。网络经由 internal 这一面的 capability IO 抽取:把它设为 IN 或 NONE,机器就什么都不供应。

两者都开启时,机器不会供应 Lumen Types 里列出的类型,所以两台汲取同一类型的机器不会来回互抽。只由配方产出、没有列出的类型仍会供应。

机器每 20 tick 检查一次自己的节点,所以新放下的机器或改过的设置最多要一秒才会出现在网络上。拆掉机器会移除它的节点。Provide To Network 关闭时机器根本没有节点,汲取改为从它的位置发出请求,范围相同。

星能接收器 ​

MBD2 Inspector 中的 Astral Starlight Receiver Trait:从 Name 到 Recipe Logics 的通用 Trait 字段,然后是 Capacity 1000 和折叠的 Constellations 列表
默认设置下的 `astral_starlight_receiver`:按星座存放的星能缓冲,没有 capability IO。Astral Sorcery 自身不存星能,正是这个缓冲让配方可以消耗固定数量。
设置范围默认含义
Capacity(容量)1 及以上1000机器对每个星座的星能各保存多少。一个 Starlight Focus Crystal 在中继损耗前每 tick 大约给出 1 到 2.5
Constellations(星座)星座 ID空保留哪些星座的星能,留空全部保留。其余的在到达时丢弃
Recipe Handler IOIN保持 IN 或 BOTH:星能只会是输入

这个 Trait 没有 capability IO,也没有 auto IO。星能只能经 Astral Sorcery 星能网络的链接进来。

把星能送到机器 ​

  1. 按 Astral Sorcery 典籍的说明搭好 Starlight Focus Crystal(星能聚焦水晶石)。夜间、其星座在天空中时,它给出该星座的星能;其他夜晚什么都不给。
  2. 拿 Linking Tool(链接工具)先右键聚焦水晶、Lens 或 Prism,再右键机器。一条链接最长 16 格,且需要视线无遮挡。要传得更远就用 Lens(每个只有一条出链)和 Prism(可有多条,光流平分)中继。用不纯的水晶做的中继每经过一个都会损失一部分光流。
  3. 机器加载后 20 tick 内会把自己登记为 mbd2:machine_starlight_receiver 节点,并替换之前的方块留在该位置的节点。在此之前就连到它的链接从那时起开始输送。
  4. 每 tick 到达的星能进入对应星座的缓冲,最多到 Capacity。机器所在区块必须已加载。

要求任意星座星能的配方,会先从存量最多的星座取,不够再取下一个。

研究者 ​

astral_researcher 只有一个设置:Refresh Interval(刷新间隔,1–12000 tick,默认 100)。

MBD2 机器没有所有者,所以这个 Trait 把机器绑定到放置它的玩家,并保存该玩家 Astral Sorcery 进度的快照:研究阶段、共鸣星座和已发现的星座。astral_research 条件读取的就是这份快照。

  • 玩家在线时,每隔 Refresh Interval tick 以及每次检查 astral_research 条件时都会重新读取快照。玩家离线时,以最后一次的快照为准。
  • 由假玩家、命令或结构放下的机器保持未绑定,它的 astral_research 配方永远不会运行。脚本可以调用 Trait 的 bindTo(player) 来绑定,参数是服务端玩家;脚本在 MBDMachineEvents.onPlaced 里做的绑定,MBD2 会保留。
  • 开启 Keep data on drop(掉落时保留数据)后,绑定随机器物品一起走:无论之后谁放下它,机器都保留第一位研究者。
  • 多方块结构中,条件会在控制器或某个部件上找这个 Trait。

条件 ​

MBD2 Inspector 中的 Astral Constellation 条件:reverse 未勾选,Constellation 为 Armara,Min Distribution 为 0.5
一个 Astral Constellation 条件:Armara 必须在天空中,且分布不低于 0.5。星座选择器同时按 ID 和显示名称搜索。
条件编辑器名称设置何时通过
astral_constellationAstral Constellation(星辉魔法 - 星座)Constellation(星座,默认 Armara);Min Distribution(最小分布,0–1,默认 0)该星座在机器所在维度的天空中处于活跃状态,且分布不低于 Min Distribution
astral_celestial_eventAstral Eclipse(星辉魔法 - 天象)Event(天象):Solar Eclipse 或 Lunar Eclipse(默认 Solar Eclipse);Whole Day(整天,默认关)天象正在发生;开启 Whole Day 后,天象所在那一天的任何时候都通过
astral_researchAstral Research(星辉魔法 - 研究)Min Tier(最低阶段):Shimmer、Illumination、Resonance、Luminance 或 Radiance(默认 Shimmer);Attuned To(共鸣星座,默认任意);Discovered(已发现星座,默认任意)机器的研究者已达到 Min Tier、共鸣于 Attuned To,并已发现 Discovered
  • Astral Sorcery 每天选一次活跃星座,所以 astral_constellation 整天都会通过。要表达「当它在夜空中时」,再加一个设为夜晚的 day_time 条件。
  • Min Distribution 是 Astral Sorcery 给活跃星座的 0 到 1 的权重,也就是聚焦水晶输出所乘的倍率。0 表示只要活跃即可。
  • 机器没有 astral_researcher Trait,或者它没有绑定玩家时,astral_research 永远不通过。
  • 条件只观察,不消耗任何东西。配方运行期间每 tick 都会重新检查,所以星座离开天空或天象结束时配方会进入等待。
  • 和所有条件一样,reverse 会反转检查结果,同类型的条件之间用 OR 组合:两个 astral_constellation 条件只要其中一个星座在天空中就通过。见条件参考。

KubeJS ​

js
ServerEvents.recipes(event => {
  // 消耗 Aevitas 流明和 Armara 星能,产出 Vicio 流明
  event.recipes.example.starlit_infuser()
    .id('example:starlit_amethyst')
    .duration(200)
    .inputLumen('500x astralsorcery:aevitas')
    .inputStarlight('100x astralsorcery:armara')
    .inputItems('minecraft:quartz')
    .outputItems('minecraft:amethyst_shard')
    .outputLumen('250x vicio')

  // 任意星座的星能,每个工作 tick 消耗
  event.recipes.example.starlit_infuser()
    .id('example:starlit_glowstone')
    .duration(100)
    .perTick(r => r.inputStarlight('0.5'))
    .inputItems('minecraft:redstone')
    .outputItems('minecraft:glowstone_dust')
})
方法每个参数省略数量时
inputLumen(...)、outputLumen(...)'500x astralsorcery:aevitas'、'astralsorcery:aevitas' 或 'aevitas'500,即一瓶
inputStarlight(...)'100' 表示任意星座,'100x astralsorcery:armara' 或 'armara'100

命名空间默认为 astralsorcery,x 后面要跟一个空格。流明数量必须是整数。数量小于等于零,或 ID 不对应任何流明或星座时,配方脚本运行时就会抛出异常。没有 outputStarlight。每 tick 的星能消耗要低于透镜送来的量,否则缓冲耗尽,配方进入等待。

js
ServerEvents.recipes(event => {
  event.recipes.example.starlit_infuser()
    .id('example:eclipse_infusion')
    .duration(200)
    .astralConstellationCondition('armara', 0.5)          // 星座,最小分布 0 到 1
    .dayTime(false)                                        // 只在夜晚
    .astralCelestialEventCondition('lunar_eclipse', true)  // 'solar_eclipse' 或 'lunar_eclipse',整天
    .astralResearchCondition('resonance', 'armara', '')    // 最低阶段、共鸣星座、已发现星座;'' 表示任意
    .inputStarlight('100x armara')
    .inputItems('minecraft:diamond')
    .outputItems('minecraft:nether_star')
})

阶段名为 shimmer、illumination、resonance、luminance 和 radiance;阶段名和天象名不区分大小写。astralResearchCondition 的三个参数都要传。

上面每个方法在没有安装 Astral Sorcery 时都会抛出异常。在 Astral Sorcery 是可选模组的整合包里,用 Platform.isLoaded('astralsorcery') 把这些配方包起来。

机器 UI 与配方查看器 ​

MBD2 机器 UI 中的 Astral Trait 条:流明条 Aevitas 1200/4000、Armara 300/4000、Vicio 0/4000,星能条 Aevitas 0/1000、Armara 42.50/1000,最后是写着 Dev · Shimmer 的研究者标签
游戏内带全部三个 Trait 的机器生成的条。每种列出的流明和星座各有一条自己颜色的条,为空的也包括在内;最后一行是研究者的名字和研究阶段。

三个 Trait 都以 BAR 布局生成 UI:

  • **流明存储:**每种 Lumen Types 里的类型一条,列表为空时每种已存类型一条,显示 数量/容量;没有可显示的内容时是一条灰色的空条。某个类型移出列表后只要还有存量,它的条就保留。悬停可看完整文字。
  • **星能接收器:**按星座同样处理,小数部分显示两位。
  • **研究者:**绑定玩家的名字和研究阶段,或 No researcher bound(未绑定研究者)。

这些条在运行时根据 Trait 的数据生成,不保存在 UI 模板里,所以会跟着机器的实际存量变化。

在配方查看器里,流明显示为该流明的图标,加上该流明颜色的数量和名称,如 -500 Aevitas。星能显示为星座颜色的星形图标,悬停提示里有完整文字,如 -100 Starlight of Armara。每 tick 内容会加上 /t。

Runtime value ​

以下设置可以作为 runtime value 按单台机器覆盖:

Trait键
astral_lumen_storagecapacity、lumen_types、max_receive、max_extract、provide_to_network、draw_from_network、draw_interval
astral_starlight_receivercapacity、constellations

Transfer Particles 和研究者的 Refresh Interval 不能覆盖。

排查清单 ​

  • 编辑器里没有这些 Trait 或 capability:注册表发现阶段 Astral Sorcery 不在,或者它没能加载。Astral Sorcery 2.0.3 需要 Curios 9.5.1 或更新版本。
  • 带 outputLumen 的配方不开始:Trait 的 Recipe Handler IO 仍是 IN,输出类型不在 Lumen Types 里,或者该类型的缓冲已满。
  • 机器从不汲取流明:Lumen Types 为空,16 格内没有视线可及、存有该类型的源节点,或者 Max Receive 为 0。
  • Astral Sorcery 设备不用机器里的流明:Provide To Network 关闭了,internal 的 capability IO 不允许输出,或者 Draw From Network 开启时该类型列在 Lumen Types 里。
  • 星能条一直是空的:没有任何东西链接到机器,现在是白天,聚焦水晶的星座不在天空中,链接被遮挡,或者 Constellations 没有包含该星座。
  • 把星能作为配方输出:做不到,没有任何东西接收它。
  • astral_research 配方从不运行:机器没有 astral_researcher Trait,它是由假玩家或命令放下的,或者研究者还没达到 Min Tier。
  • astral_constellation 在白天也通过:这是预期行为,加上 day_time。
  • 同类 Trait 加不了第二个:这是预期行为,每台机器每种只能有一个。

Released under the MIT License.