---
该模组的功能是什么?
静态数据创建了第三类资源:“静态数据”,让模组可以通过一种简单、有结构的方式互相搜索彼此和他们的环境,寻找兼容性和互操作信息。
例如,一个模组可能会注册一个基于一组基本方块的斜坡形状方块,但也可以基于模组方块注册新的斜坡。标签在这种情况下并不早可用!静态数据却可以。
模组互操作数据的责任并非锁定在一个特定的位置。与模组A相关的静态数据,由模组A、模组B、第三方模组甚至是一个静态数据包提供。来自这些来源的数据可以混合和叠加使用。
为什么我们需要静态数据?
静态数据是固定的
数据包和资源包的重新加载不会影响静态数据和静态数据包。在您的模组的整个生命周期内,可以访问相同的数据,并且可以通过数据的来源模组(如果有)进行识别。您永远不必为这些数据调用任何入口点,也不必关心模组从哪个加载器加载的,数据已经存在。您永远不必担心连接到服务器是否已更改数据,因为静态数据不会更改,这样您可以有信心一次性地初始化数据。
静态数据早已准备就绪
只要加载器中的第一个入口点运行 - 无论该入口点是quilt-loader、qsl、qfapi还是模组集成入口点,如果您的模组被要求初始化某些内容,静态数据已经准备好。
您可以使用它来触发注册
由于普通数据包随时间而变化,使用它们改变静态注册非常麻烦。由于静态数据不会更改,并且在注册表被冻结之前已经可用,您可以使用从静态数据中获取的信息来注册方块和实体。这是其存在的主要原因 - 允许模组以消失的方式相互传达功能信息,但不依赖于这些模组使用相同的模组加载器。
我如何提供静态数据?
模组提供静态数据就像提供其他类型数据一样
静态数据位于`assets`和 `data` 目录旁边的 `staticdata` 目录中,并且项目在静态数据文件夹内进行分组。因此,如果模组“architecture_extensions”正在搜索“blockgroups”路径下的文件,并且您提供了一个名为“obsidian.json”的集成,那么此文件的完整路径将是
src/main/resources/staticdata/architecture_extensions/blockgroups/obsidian.json
请注意,您根本不使用自己的命名空间 - 通过将数据放在您的模组内部,您的模组ID已经提供。
玩家和包制作者可以提供静态数据包
根目录名为“staticdata”的zip文件是有效的静态数据包。这与资源包完全相同,除了静态数据。要提供与上一节相同的文件,zip文件内的路径如下:
/staticdata/architecture_extensions/blockgroups/obsidian.json
在根目录内放置`pack.mcmeta`和`pack.png`是可选的,并且当前会被忽略。
静态数据包 zip 文件可以从两个地方加载:
- 从 mod 内部,在根 `src/main/resources/staticdata/` 文件夹中
- 从根目录中的 `.minecraft/staticdata/` 文件夹加载,如果没有,则在任何模组请求静态数据时将创建它
放置在子目录中的静态数据包将无法访问。
原始文件可以放在 staticdata 文件夹中
这些文件仍然需要进行命名空间处理,但再次使用上面的示例:
.minecraft/staticdata/architecture_extensions/blockgroups/obsidian.json
只要文件放置在正确的命名空间文件夹中,它们将对数据搜索产生影响。
---
如何在我的模组中使用静态数据?
首先,依赖静态数据。这需要一个 gradle `modImplementation` 条目和一个 quilt.mod.json `depends` 条目。有关当前版本和 maven/gradle 详细信息,请参阅源代码储存库。
其次,建议向您的 gradle 添加一个 `include`,以便该库内置在您的 jar 中。由于某种原因,这似乎并不意味着 `modImplementation`,所以您可能需要同时使用这两行。
第三,在您的 `modInitializer` 中,您可以这样做:
java
//您可以在这里使用 quilt-json5或jankson
Gson gson = new GsonBuilder().create();
//获取此文件夹及其子文件夹中的所有静态数据
List
new Identifier(MODID, "bees"), //Search for mymod:bees
true // 是,通过子文件夹进行递归搜索
);
for(StaticDataItem dataItem : dataItems) {
// MyDataObject 是表示您想要的数据的类
MyDataObject dataObject = gson.fromJson(item.getAsString(), MyDataObject.class);
// 这仅仅是建议 - 静态数据最有用,如果您有条件地加载数据!
String requiredMod = dataObject.only_if_present;
if (requiredMod != null && !requiredMod.isBlank()) {
// 当指定的模组存在时应该才加载
if (!QuiltLoader.isModLoaded(requiredMod)) continue;
}
//现在您准备好使用数据了!
doSomethingWithTheData(dataObject);
}
假设 `MyDataObject` 类看起来像这样
java
public class MyDataObject {
public String only_if_present;
//其他数据在公共字段中进入
}
如何在我的模组包中使用这个模组?
这是一个jar中的模组,通常嵌入到其他模组中,而且这种模组的性质使得无需进行配置即可进行模组互操作。因此,只需下载并一起玩这些利用了它的模组,您就可以获得静态数据的基本好处。
但是,如果您想深入了解,请考虑制作一个静态数据包,并将其与您的模组包一起发行!每个模组对互操作的处理方式都不同,因此请查阅该模组的文档以获取更多信息。
Static Data 1.1.3+1.21.1
Filesystems have different path-separators, which if we're not careful can pollute Identifiers with disallowed characters. In almost all cases, the files StaticData deals with are from nio `ZipFS` or `java.util.zip.ZipInputStream`. These sources always return forward slashes as PathSeparators, allowing... incorrect logic to work without giving any warning of trouble.
This failed with the addition of bare-folder StaticData Packs. These files are sourced directly from the OS filesystem, which can report *multiple consecutive backslashes* that resisted any quick band-aid fix that still relied on String splitting and replacements.
This update rewrites and sets aside the logic that constructs Identifiers from relative Paths, only ever using `Path.nameCount` and `Path.getName` to acquire the directory structure and filename, and recombines the result with forward slashes that Identifier allows. This is more in line with how I've been doing things recently in places like EarlyTags, and should be nearly bulletproof.
Static Data 1.1.1+1.21.1
Static Data 1.1.0+1.20.4
收录