ProbeJS Legacy

ProbeJS Legacy

ProbeJS非官方延续,适用于官方ProbeJS已放弃的版本。

基础库

ProbeJS Legacy

是官方 ProbeJS 已放弃支持的 KubeJS 版本的非官方延续项目。

使用方法

  1. 显然,你需要安装 ProbeJS Legacy。
  2. 进入一个单人世界。使用 /probejs dump 导出 ProbeJS Legacy 收集的数据。对于首次使用的用户,加入世界时会自动完成此操作。
  3. 使用 VSCode 打开你的游戏实例文件夹。
  4. 尽情享受吧!

注意0:输入 @item 或 @block_tag 可查看生成的代码片段。

注意1:游戏实例文件夹是指你能直接看到 kubejs 文件夹的那个目录。

注意2:其他支持 TypeScript 类型(.d.ts)的 IDE 应该也能正常工作。

新特性

(与 ProbeJS 相比)

  • 模拟 Internal

    • ProbeJS Legacy 现在会生成一个 Internal 命名空间,方便用户从 ProbeJS 6 或 ProbeJS Legacy 3 迁移。
    • 示例:Internal.ItemStack 和 Internal.ItemStack_
  • 更完善的参数命名

    • 与 TypeScript 冲突的参数名现在会以更好的方式重命名。
    • 方法/构造函数中的参数名,如果是 arg123 格式,将根据其类型生成的新名称进行重命名。

示例:

"mayUseItemAt"(arg0: $BlockPos$$Type, arg1: $Direction$$Type, arg2: $ItemStack$$Type): boolean

将被重命名为

"mayUseItemAt"(blockPos0: $BlockPos$$Type, direction1: $Direction$$Type, itemStack2: $ItemStack$$Type): boolean
  • 更完善的 $Class<T>

    • ProbeJS 会将 $Class<T> 转换为 typeof T,但忽略了许多不应进行此转换的情况。ProbeJS Legacy 使其更加准确。
    • 现在可以导出一些基础类,例如 java.lang.String 和 java.lang.Character。
    • $Class<T> 中的 T 现在可以实际用于类型提示。
  • 更完善的 instanceof

    • ProbeJS Legacy 现在可以正确支持 obj instanceof $SomeClass,其中 $SomeClass 是通过 java(...) 或 Java.loadClass(...) 加载的类。

示例:

const $BoatItem = java("some.path.to.BoatItem")

let item = Item.of("boat").item; // 这里 `item` 的类型是 `$Item`
if (item instanceof $BoatItem) {
    // 这里 `item` 的类型可以被推断为 `$BoatItem`
}
  • 字段属性化

    • 某些字段会被转换为 getter+setter,以便为 TypeWrapper 提供更好的支持。
    • 考虑一个具有如下字段的 obj: block: $Block,并且在 KubeJS 中 obj.block = "minecraft:stone" 是有效语法。这在以前没有类型支持,但现在 ProbeJS Legacy 可以正确支持。
  • 类型文件共享

    • 通过提取导出类中的公共部分,类型文件的总大小可以比以前小得多。
    • 另一个好处是 TS 服务器现在可以在 3 种脚本类型之间复用公共类型,从而提升 IDE 性能。
  • 更好的注释格式化

    • 开头/结尾的空行现在将被忽略。
    • 如果只有一行有效内容,注释将格式化为一行。
  • 仅限特定侧的方法(由 @OnlyIn 标记)将有注释提示它是服务端专用还是客户端专用。

  • 模块过多的 xxx.d.ts 文件现在将自动拆分为较小的文件,从而提供更好的 IDE 性能。

  • 声明文件中的方法/字段现在会自然排序。

  • global 解析:你放入 global 中的值现在可以被解析。可通过 'global' Resolving Depth 配置来设置解析深度。

  • 以及许多内部更改。如果我把它们全部写下来,这个 Readme 肯定会太长了。

数据收集

KubeJS 事件

对于 1.16.5,ProbeJS Legacy 会记录所有已发布的事件。如果你找不到某些常见事件,请在导出数据前尝试触发它。例如:block.place 事件通过放置方块来触发。

对于 1.20.1,所有已注册的 KJS 事件都会被自动导出,无需触发。

Forge 事件

ProbeJS Legacy 会记录所有 Forge 事件,无论它们是否已被发布。此行为可通过 Class Scanner 配置进行修改。

Java 类

ProbeJS Legacy 将使用多种方法来收集 Java 类。

将记录以下类:

  • 手动加载的类,即通过 java(...) 或 Java.loadClass(...) 加载的类。
  • 被 JS 绑定引用的类,例如 AABB 和 Text。
  • 被已知类引用的类,例如被 ItemStack.class 引用的 Item.class。
  • 注册表对象,例如原版船只的 BoatItem。默认情况下会跳过非原版对象,可通过 Registry Object Filter 配置进行修改。
  • 来自特定模组的类。参见 Mods with forced Full Scanning 配置。
  • 从缓存文件读取的类。缓存文件保存于 <你的实例文件夹>/.probe/classes.txt。
  • 由类扫描器发现的类。参见 Class Scanner 配置。

缘由

起初,我只想为 KubeJS 脚本编写找到某种文档或辅助工具,这样在开发 Enlightend6Expert(https://www.curseforge.com/minecraft/modpacks/enlightened-6-expert) 时就不会感到如此痛苦。 但经过一番研究,我意识到 1.16.5 尽管是最热门的模组版本之一,却连一个合适的 KubeJS 辅助模组都没有。 所以就这样了,一个面向 1.16.5 的 ProbeJS 分支。 这是我的第一个 Java 项目和第一个 Minecraft 模组项目,说实话,ProbeJS 对于像我这样的编程新手来说太难了。谢天谢地,我做到了。

本项目采用 LGPLv3 许可证,与原版 ProbeJS 相同。