KubeJS 6.1 Update¶
原文:KubeJS 6.1 Update
面向脚本和整合包开发者¶
-
定时事件现在接受时长作为参数(尤其是字符串,例如
200 t表示以 tick 为单位的时长),用于其延迟时间! -
NetworkEvents.fromServer和NetworkEvents.fromClient已合并为NetworkEvents.dataReceived,它会根据脚本类型处理来自对应端的传入数据。 - 注册表:
event.custom(T)现在是event.createCustom(() => T),它接收一个_供应商(supplier)_而不是直接接收对象,以避免可能提前加载它所依赖的其他注册表元素。请注意,custom 仍然存在,但正因为这个原因,强烈不建议使用! - 事件
.cancel()现在会退出事件代码块——这可能是一个小改动,但可能会影响一些脚本。以前它只会把事件标记为已取消,不做任何其他事情,但现在它还会像 return 一样直接返回。 - 事件结果(Event results)已添加! 你现在可以更精细地控制事件的工作方式,更接近 Architectury / Minecraft 端的处理方式!例如:
ItemEvents.rightClicked('minecraft:stick', event => { // (note that only one of these will work at a time since they all immediately return!) event.cancel() // cancels the event and prevents the click from going through event.success() // cancels the event and forces the click to go through event.exit() // cancels the event without setting a result // in events that support custom results like item stacks, you can also do the following: event.success('minecraft:apple') // success + the result is an apple 🍎 })
目前,这个新系统只在实际的物品右键点击事件中使用,但会随着时间推移扩展到更多事件(显然不会破坏脚本,而且仅使用 event.cancel() 仍然可以正常工作)!
* 大规模后端重写,性能大幅提升——Lat 又对配方事件做了一次梳理,重新设计了配方的解析方式,并修复了异步配方操作,所以如果一切正常,你通常会发现重载时间有所减少!在某些情况下,配方现在用 KJS 加载甚至比原版还要快!
* 不再需要标签变通方案了!(希望如此)——我们修复了首次加载世界时在配方事件中解析标签原料的问题,并总体上改进了配方过滤器的工作方式,所以你不应该再需要那些取巧的双重重载变通方案了(拜托……别再用了 :ioa:)
* Forge 和 Fabric 上的注册表都已修复——我们解决了注册表事件的一些问题,所以你现在应该可以再次正常注册流体、模组注册表等。
- 将 kubejs/logs 中的文件从 .txt 重命名为 .log——这样你就可以在 VSCode 等编辑器中获得语法高亮格式了。
- 修复了资源和数据包顺序——用户添加的资源包和数据包现在会位于 KJS 生成的包之上,所以你应该可以用它们来更改贴图等内容。
-
支持从 kubejs/data 和 kubejs/assets 加载 .zip——你只需把一个 .zip 文件放进该文件夹,它就会被强制加载(位于 KJS 之上、用户包之下)
-
将
debugInfo配置从kubejs/config/common.properties移到local/kubejsdev.properties。不知道当初为什么会放在 common properties 里,它可是给开发者用的_调试_配置。 - 改进了
Platform.mods.modid.name = 'Custom Name'。它现在应该可以配合自定义模组 ID 在 REI 和 ModNameTooltip 中工作了。对于不存在的模组,你应该使用Platform.getInfo('custom_mod_id').name = 'Custom Name'。 - 与 ProbeJS 的配方集成更好——由于 KJS 中新增了 schema 系统,probe 能够更好地显示原料应该放在哪里,而且所需的 hack 更少!
.stage(string)配方函数不再依赖 Recipe Stages 才能工作。- 修复了 Fabric 上的流动流体贴图以及其他流体相关问题。
- 修复了日志中错误过长的显示问题——信不信由你,KJS 本不该为每个配方输出 150 行错误信息。
- 添加了新的包装器
FluidAmounts,用于……流体数量!适合那些记不清多少方块、锭和粒才能凑成一桶的人,或者那些想要让自己的脚本具有跨平台兼容性的人(因为 Fabric 使用 "81000 droplets" 而不是 "1000 mB" 来进行更精确的流体计量) - 添加了自定义通知弹窗——你可以使用
player.notify(title)、(title, subtitle)或(Notification.make(...))。 - 添加了 /kubejs reload config 命令——再也不用重启游戏来更新配置了!
- 添加了 /kubejs packmode [mode] 命令——和上面一样,但完全不用去动文件。
- 添加了 /kubejs help 命令——在游戏内直接显示有用的链接。
- 移除了 /kjs_hand 命令——改为添加了带空格的 /kjs hand 重定向。有些人可能会讨厌这个改动,但下划线比空格难按得多,我相信你很快会习惯并且更喜欢它的。
- 修复了流体注册表的 .tag()——现在也会给流动流体打标签了。
- 你现在可以替换和匹配流体了——你必须使用
Fluid.of('minecraft:water')而不是纯字符串,但你可以把它用在{input: Fluid.of('minecraft:water')}配方过滤器和event.replaceInput('*', Fluid.of('minecraft:water'), Fluid.of('minecraft:lava'))替换函数中,用于支持的配方类型。
面向附属模组开发者¶
-
配方系统完全重写——配方现在使用配方 schema,这是一个(几乎)完全取代旧 RecipeJS 对象的新系统。更多信息请查看 Discord 上的公告
-
事件现在有结果(results),可以更精确地控制返回值,而且我们出于性能考虑添加了
hasListeners()检查。对你来说最明显的变化是,你自己的事件也需要返回一个EventResult。 -
修复了 datagen 问题——KJS 不再让 datagen 在开发环境中永远无法关闭游戏了。我们真的生活在一个奇迹的时代!
更新入门指南(按主题分类,尚未完成):¶
配方 Schema(Recipe Schemas)¶
来自公告:
这是重磅更新。配方 schema 完全_改变了 KubeJS 中自定义配方处理程序的注册方式,而且应该也意味着你之后可以少写很多样板代码。现在每个配方都由一个包含一组_配方组件(recipe components)_的 _schema 定义,这些组件充当底层值的 "codec"。对你来说,这意味着以下内容: - 你将不再主要使用 RecipeJS 子类,而是需要定义一个 RecipeSchema - 每个 schema 使用一组 RecipeKeys,它们是命名的 RecipeComponents,带有一些额外属性,如可选默认值以及用于自动生成构造函数和方法的相关设置 - 一个 RecipeComponent 是一种可复用的配方元素定义(例如输入/输出物品、流体,甚至只是一个数值),它具有角色(input、output、other)、描述(供 ProbeJS 等附属模组使用),并包含(反)序列化和批量配方操作(即配方过滤和替换)的逻辑。在
dev.latvian.mods.kubejs.recipe.component包中提供了大量标准组件,包括方块、物品和流体,通用的组和逻辑组件(array、map、and、or),以及各种基本类型(包括数字范围和字符等专用类型) - 虽然配方 schema _默认_会生成构造函数,但你可以通过自己定义constructor(factory, keys)来覆盖此行为。请注意,这样做会阻止默认构造函数被生成,所以如果你想保留它,就必须自己再定义一次。 (ShapedRecipeSchema就是一个复杂自定义配方构造函数的好例子) - 虽然 schema 在 Java 端取代了 RecipeJS,但在 JS 端,用户创建后仍然会拿到一个 RecipeJS 对象,并为每个组件额外自动生成 "builder" 方法,让用户可以在配方创建后设置例如可选值(如event.smelting(...).xp(20).cookingTime(100))。你也可以通过完全覆写配方工厂来添加更多属性或进行额外的加载后验证!
下载¶
你可以在 https://kubejs.com/downloads 下载 KubeJS 6.1!