Minecraft Forge 1.20.1 模组制作(2):模组基本信息、Gradle构建脚本

上一篇我们讲了如何设置开发环境并导入Forge 1.20.1模板项目。这一篇我们将配置模组的基本信息(如名称、版本号等),并在构建脚本中进行基础的配置。此处,我们暂且将模组命名为Forge Tutorial。

1. 模组主类

1.1 @Mod注解、模组ID

模组主类是Forge识别和加载模组的入口。打开源码的ExampleMod类,可以看到类声明上方有注解:

@Mod(ExampleMod.MODID)

@Mod注解表示该类为一个模组的主类。一个模组必须有且仅有一个主类。

参数ExampleMod.MODID(类内有定义)为该模组的ID。模组ID是一个字符串,用于在所有加载的模组中识别特定模组,在所有模组中必须唯一。这意味着不能将ID设置得过于简单,以免与其他模组撞车。例如模组Alex’s Mobs,ID为"alexsmobs",这是一个较不容易重名的ID;而"am"就是一个糟糕的ID,极易重名。模组ID只能包含小写字母、数字和下划线。这里我们将其改为"forge_tutorial"

另外,我们将主类名称和路径Shift+F6更改为net.sodiumzh.tutorial.ForgeTutorial以匹配模组名称。

Tip:不建议在@Mod注解中直接用引号内容定义模组ID字符串,而应当用一个定义在主类中的静态常量代替(此处为ForgeTutorial.MODID)。即:不要使用@Mod("forge_tutorial")。在模组的其他任何地方需要引用模组ID时,也建议引用该常量而非直接输入引号内容,以免出现难以排查的字符串错误。其他需要经常被引用的字符串(注册表键等)也建议定义常量而非在每个使用处输入引号内容。

1.2 主类的构造方法

主类的构造方法是Forge加载一个模组时最初运行的方法,用于执行一些将本模组内容(注册表项等)最终注册到Forge中的操作。

模板项目的默认主类中有大量的示例,这些内容我们以后会提到,现在暂时将除了MODID和构造方法之外的所有内容都注释掉。目前没有需要注册的内容,因此暂且将构造方法中的所有内容也注释掉,仅保留一行:

MinecraftForge.EVENT_BUS.register(this); // 将本模组注册到Forge事件总线中

2. Gradle构建脚本

Gradle构建脚本用于配置将模组源码打包为jar文件的方法。Gradle构建脚本配置往往是最劝退新modder的地方。我已经见过不止一个想入坑MC模组制作的人卡在Gradle脚本配置上并最终无奈放弃。由于我对Gradle也不是很熟悉,下面仅介绍必要的修改。

Gradle配置脚本为build.gradle,位于项目根目录下。Forge 1.20.1相比1.19大幅度简化了Gradle的修改,将绝大多数需要修改的参数移动到了gradle.properties中,而build.gradle引用这些参数。然而,添加项目依赖(第4节会讲)时仍然需要修改build.gradle

2.1 模组参数修改、gradle.properties

gradle.properties用于为构建脚本中定义的参数赋值。

2.1.1 模组信息

翻到文件最下方Mod Properties。

涉及运行必须修改的是mod_id,改成刚才设置的模组ID(forge_tutorial)。

mod_group_id:改成模组所有类的公共路径。例如如果所有的java文件都位于com.sodiumzh.tutorial或其子包下,则改成com.sodiumzh.tutorial

其他条目是用于在模组界面显示的,视情况修改。

2.1.2 映射

此处的映射(mapping)指从Minecraft混淆源码到人类可读源码的映射。(下2段如果看不懂可以跳过)

未修改的Minecraft源代码是被混淆(obfuscate)过的,其类名、方法名、变量名等为无意义字符串(如aabd,暂且称为“混淆名”)。在Minecraft Forge游戏中加载的类名、方法名、变量名已经从混淆名映射为编号,例如方法名是像m_12345_这样的。这种编号名称叫做SRG名。混淆名和SRG名之间的映射为自动进行,通常不需要考虑。

由于SRG名的可读性仍然差,我们还需要一个映射来将SRG名进一步“翻译”为人类可读名称,这一步也是自动进行的。这种可读名称叫做MCP名。我们写模组的时候需要打交道的绝大多数都是MCP名,只有少数需要考虑SRG名的情况。

以上过程是不需要配置的。如果我们打开项目依赖中的forge源码(位于Gradle: net.minecraftforge:forge:1.20.1-...)的类,会发现虽然类、方法和变量名已经可读,但方法参数等仍然为编号,这会对我们阅读原版代码造成一定困难。我们需要修改的映射即用于处理该情况。

Parchment是一个非官方映射,将方法参数名修改为了人类可读名称,并添加了一些注释。不同MC版本对应的Parchment版本可以在这里查到:https://parchmentmc.org/docs/getting-started

以下导入Parchment:

找到gradle.propertiesmapping_channelmapping_version,改成:

mapping_channel=parchment
mapping_version=2023.09.03-1.20.1

build.gradle最上方的plugins块内加一行:

id 'org.parchmentmc.librarian.forgegradle' version '1.+'

settings.gradle(位于项目根目录)的pluginManagement块中的repositories块内加一行:

maven { url = 'https://maven.parchmentmc.org' }

gradle.properties中的其他参数暂时不需要修改。

3. mods.toml

mods.toml用于向Forge提供该mod的信息。不同于build.gradlemods.toml的内容是会保留到运行时的。即在将源码编译打包为.jar包后,mods.toml仍然保留。游戏启动时Forge时会读取所有模组包中的mods.toml文件以收集模组信息。而build.gradle仅影响编译打包的过程,打包成.jarbuild.gradle不再保留。

打开src/main/resources/META-INF/mods.toml,可以看到其中的值为参数引用。这些引用也指向gradle.properties。目前不需要修改。

4. 增加项目依赖

项目依赖是在模组编辑和测试过程中需要依赖的外部包,包括其他模组。

加入项目依赖后,这些外部包的代码可以被调用,测试时也会加入测试游戏的模组列表,但不会打包进.jar包(除非特殊配置,此处不考虑)。因此如果在代码中使用了这些外部包(类、方法、数据等),需要考虑这些外部包不存在时的情况(此处不展开说)。

4.1 加入JEI依赖

JEI(Just Enough Items)是一个非常常用的显示道具和配方的模组,Forge已经将其预设在了build.gradle中,位于dependencies块中,但是是注释掉的。直接把注释符号删掉即可导入JEI依赖。

JEI依赖的代码中引入了两个参数:mc_versionjei_versionmc_version就是MC版本,直接改成minecraft_version即可;jei_version是JEI的版本,此前没有定义,需要到gradle.properties中定义。在gradle.properties中加一行:

jei_version=15.20.0.106

此外我们需要定义JEI所在的远程仓库(repository)。在repositories块中加入:

    maven {
  		name = "Jared Maven"
  		url = "https://maven.blamejared.com/"
  			}
 	 maven {
    	name = "ModMaven"
   		url = "https://modmaven.dev"
  	}

这样在构建时,程序会在这两个仓库中查找JEI。

4.2 加入其他模组依赖

以下我们以JER(Just Enough Resources)为例引入一个在CurseForge上能下载到的模组依赖。JER是一个常用的用于显示道具掉落来源的实用模组。

首先在repositories中加入Curse Maven(可以理解为CurseForge上能下载到的mc模组所在的仓库)。加入以下代码:

	maven {
        url "https://www.cursemaven.com"
        content {
            includeGroup "curse.maven"
        }
    }

随后在CurseForge上找到需要引入的包(可以在mcmod.cn查找并跳转,不赘述)。例如,JER Forge 1.20.1的其中一个版本位于:https://www.curseforge.com/minecraft/mc-mods/just-enough-resources-jer/files/5057220
进入该网页,找到File Details -> Curse Maven Snippet(点右侧小三角展开)-> Forge,复制其下的代码到build.gradledependencies块中:

implementation fg.deobf("curse.maven:just-enough-resources-jer-240630:5057220")

执行Gradle genIntellijRuns任务,随后刷新项目(见上一章第2节,会花一些时间下载依赖,建议挂代理)。调试运行runClient,可以发现JEI和JER已经出现在模组列表中了。

<think>好的,我现在需要帮助用户了解如何在Minecraft 1.20.1中使用GeckoLib。首先,我应该回忆一下GeckoLib的基本用途,它是一个用于添加自定义实体动画的库,常用于模组开发。用户需要教程或示例代码,特别是针对1.20.1版本。 首先,我应该确认GeckoLib在1.20.1中的版本号。通常,Minecraft版本更新后,模组会有对应的版本,比如1.20.1可能对应GeckoLib 4.0或更高。需要检查官方文档或更新日志,确保信息准确。 接下来,用户可能需要环境配置的步骤。这包括在build.gradle中添加依赖,以及确保正确设置模组加载器,比如Forge或Fabric。这里可能需要指导用户如何修改他们的构建脚本,添加仓库和依赖项。 然后是创建自定义实体。GeckoLib通常涉及扩展GeckoEntity类,并添加动画控制器。需要解释如何注册实体,以及如何编写渲染器。这部分可能需要示例代码,比如一个简单的实体类和渲染器类。 动画的JSON文件也是关键部分。用户需要知道如何创建动画文件,路径结构,以及如何在代码中触发这些动画。可能需要指出资源定位符的正确使用,比如使用modid来指定路径,而不是文件系统路径,这点在引用[1]中提到过,路径格式转换很重要。 另外,常见问题可能包括依赖未正确安装、动画不播放或模型路径错误。需要提醒用户检查日志,确保资源文件在正确的位置,比如assets/modid/animations下的JSON文件。 最后,应该生成相关问题,帮助用户深入理解,比如如何优化动画性能或处理多个动画状态。需要确保问题与用户可能的后续疑问相关,并参考之前的引用,确保路径格式正确。</think># GeckoLib在Minecraft 1.20.1中的使用指南 ### 一、环境配置 1. 添加Gradle依赖(以Forge模组为例): ```gradle repositories { maven { url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" } } dependencies { implementation fg.deobf("software.bernie.geckolib:geckolib-forge-1.20.1:4.2") } ``` *注意:版本号需根据[官方发布页](https://www.curseforge.com/minecraft/mc-mods/geckolib)确认最新版* ### 二、实体动画实现 1. 创建动画实体类: ```java public class RobotEntity extends GeoEntity { private final AnimatableInstanceCache factory = GeckoLibUtil.createInstanceCache(this); public RobotEntity(EntityType<?> type, Level world) { super(type, world); } @Override public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { controllers.add(new AnimationController<>(this, "walk_controller", 10, this::predicate)); } private <E extends GeoAnimatable> PlayState predicate(AnimationState<E> event) { if (event.isMoving()) { event.getController().setAnimation(RawAnimation.begin().thenLoop("animation.robot.walk")); } return PlayState.CONTINUE; } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return this.factory; } } ``` 2. 注册实体渲染器: ```java @OnlyIn(Dist.CLIENT) public class RobotRenderer extends GeoEntityRenderer<RobotEntity> { public RobotRenderer(EntityRendererProvider.Context context) { super(context, new DefaultedGeoModel<>(new ResourceLocation("mymod", "robot"))); } } ``` ### 三、资源文件规范 1. 模型文件路径需遵循Minecraft资源定位符格式: $$assets/mymod/geo/robot.geo.json$$ $$assets/mymod/animations/robot.animation.json$$ *特别注意路径格式转换规则(参考引用[1])* ### 四、常见问题排查 1. 动画不播放时检查: - 确认动画JSON文件中的动画名称与代码调用一致 - 验证模型骨骼与动画关键帧的命名匹配 - 检查是否在客户端注册了渲染器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值