资源(Resources)
资源(Resources)是游戏使用的外部文件,但不是代码。最突出的资源类型是纹理,然而,在我的世界(Minecraft)生态系统中存在许多其他类型的资源。当然,所有这些资源都需要代码端的消费者,因此消费系统也分组在本节中。
我的世界(Minecraft)通常有两种资源:用于逻 辑客户端的资源,称为资产(assets),以及用于逻辑服务器的资源,称为数据(data)。资产主要是仅显示信息,例如纹理、显示模型、翻译或声音,而数据包括影响游戏玩法的各种内容,如战利品表、配方或世界生成信息。它们分别从资源包(resource packs)和数据包(data packs)加载。NeoForge为每个模组生成内置的资源包和数据包。
资源包和数据包通常需要一个pack.mcmeta文件;然而,现代NeoForge在运行时为您生成这些,因此您不需要担心它。
如果您对某些内容的格式感到困惑,请查看原版资源。您的NeoForge开发环境不仅包含原版代码,还包含原版资源。它们可以在外部资源部分(IntelliJ)/项目库部分(Eclipse)中找到,名称为ng_dummy_ng.net.minecraft:client:client-extra:<minecraft_version>(用于我的世界(Minecraft)资源)或ng_dummy_ng.net.neoforged:neoforge:<neoforge_version>(用于NeoForge资源)。
资产(Assets)
另请参阅:我的世界(Minecraft) Wiki上的资源包
资产(Assets),或客户端资源,是所有仅与客户端相关的资源。它们从资源包(resource packs)加载,有时也称为旧术语纹理包(源于旧版本,当时它们只能影响纹理)。资源包基本上是一个assets文件夹。assets文件夹包含资源包包含的各种命名空间的子文件夹;每个命名空间都是一个子文件夹。例如,一个id为coolmod的模组的资源包可能包含一个coolmod命名空间,但可能额外包括其他命名空间,如minecraft。
NeoForge自动将所有模组资源包收集到Mod resources包中,该包位于资源包菜单中“选定包”侧的底部。目前无法禁用Mod resources包。但是,位于Mod resources包之上的资源包会覆盖下面资源包中定义的资源。这种机制允许资源包制作者覆盖您的模组资源,也允许模组开发者根据需要覆盖我的世界(Minecraft)资源。
资源包可能包含影响以下内容的文件夹和文件:
| 文件夹名称 | 内容 |
|---|---|
atlases | 纹理图集源 |
blockstates | 方块状态文件 |
equipment | 装备信息 |
font | 字体定义 |
items | 客户端物品 |
lang | 翻译文件 |
models | 模型 |
particles | 粒子定义 |
post_effect | 后期处理屏幕效果 |
shaders | 元数据、片段着色器和顶点着色器 |
sounds | 声音文件 |
texts | 杂项文本文件 |
textures | 纹理 |
waypoint_style | 路径点图标元数据 |
数据(Data)
另请参阅:我的世界(Minecraft) Wiki上的数据包
与资产相反,数据(Data)是所有服务器资源的术语。类似于资源包,数据通过数据包(data packs)(或datapacks)加载。像资源包一样,数据包由一个pack.mcmeta文件和一个根文件夹组成,名为data。然后,再次像资源包一样,data文件夹包含数据包包含的各种命名空间的子文件夹;每个命名空间都是一个子文件夹。例如,一个id为coolmod的模组的数据包可能包含一个coolmod命名空间,但可能额外包括其他命名空间,如minecraft。
NeoForge在创建新世界时自动应用所有模组数据包。目前无法禁用模组数据包。然而,大多数数据文件可以被优先级更高的数据包覆盖(因此通过替换为空文件来移除)。额外的数据包可以通过放置在世界的datapacks子文件夹中,然后通过/datapack命令启用或禁用。
目前没有内置方法将一组自定义数据包应用到每个世界。然而,有一些模组实现了这一点。
数据包可能包含影响以下内容的文件夹和文件:
| 文件夹名称 | 内容 |
|---|---|
advancement | 进度 |
banner_pattern | 旗帜图案 |
cat_variant, chicken_variant, cow_variant, frog_variant, pig_variant, wolf_variant | 实体变体 |
damage_type | 伤害类型 |
datapacks | 内置数据包 |
dialog | 对话框菜单 |
enchantment, enchantment_provider | 附魔 |
instrument, jukebox_song, wolf_sound_variant | 声音引用元数据 |
painting_variant | 绘画 |
loot_table | 战利品表 |
recipe | 配方 |
tags | 标签 |
test_environment, test_instance | 游戏测试 |
trial_spawner | 战斗挑战 |
trim_material, trim_pattern | 盔甲修剪 |
neoforge/data_maps | 数据映射 |
neoforge/loot_modifiers | 全局战利品修改器 |
dimension, dimension_type, structure, worldgen, neoforge/biome_modifier | 世界生成文件 |
此外,它们还可能包含一些与命令集成的系统的子文件夹。这些系统很少与模组一起使用,但值得一提:
| 文件夹名称 | 内容 |
|---|---|
chat_type | 聊天类型 |
function | 函数 |
item_modifier | 物品修饰器 |
predicate | 谓词 |
pack.mcmeta
另请参阅:我的世界(Minecraft) Wiki上的pack.mcmeta(资源包)和pack.mcmeta(数据包)
pack.mcmeta文件保存资源包或数据包的元数据。对于模组,NeoForge使此文件过时,因为pack.mcmeta是合成生成的。如果您仍然需要pack.mcmeta文件,完整规范可以在链接的我的世界(Minecraft) Wiki文章中找到。
数据生成(Data Generation)
数据生成,俗称datagen,是一种以编程方式生成JSON资源文件的方法,以避免手动编写它们繁琐且容易出错的过程。名称有点误导性,因为它适用于资产和数据。
Datagen通过数据运行配置运行,该配置与客户端和服务器运行配置一起为您生成。数据运行配置遵循模组生命周期,直到注册事件触发后。然后触发其中一个GatherDataEvents,您可以在其中以数据提供器的形式注册要生成的对象,将所述对象写入磁盘,并结束过程。
有两个子类型在物理侧上操作:GatherDataEvent.Client和GatherDataEvent.Server。GatherDataEvent.Client可能包含所有要生成的提供器。另一方面,GatherDataEvent.Server可能只包含用于生成数据包条目的提供器。
有两个关于如何注册提供器的建议。前者是在GatherDataEvent.Client中注册所有提供器,并使用runClientData任务生成数据。后者是将客户端提供器注册到GatherDataEvent.Client,将服务器提供器注册到GatherDataEvent.Server,分别通过运行runClientData和runServerData任务生成它们。
由于MDK通过设置默认的clientData配置使用前者解决方案,所有显示的示例将使用前者,通过将所有提供器注册到GatherDataEvent.Client。
所有数据提供器扩展DataProvider接口,通常需要重写一个方法。以下是我的世界(Minecraft)和NeoForge提供的重要数据生成器列表(链接文章添加了更多信息,例如辅助方法):
| 类 | 方法 | 生成 | 侧 | 备注 |
|---|---|---|---|---|
ModelProvider | registerModels() | 模型、方块状态文件、客户端物品 | 客户端 | |
LanguageProvider | addTranslations() | 翻译 | 客户端 | 还需要在构造函数中传递语言。 |
ParticleDescriptionProvider | addDescriptions() | 粒子定义 | 客户端 | |
SoundDefinitionsProvider | registerSounds() | 声音定义 | 客户端 | |
SpriteSourceProvider | gather() | 精灵源 / 图集 |