我的世界1.12.2Forge模组开发学习笔记-一切的开始
目录
第一章 导论1. 什么是Forge?
2. Minecraft的运作方式
3. 开发模型
4. 核心概念
第二章 环境配置
1. 需要的工具
2. 配置环境
3. 运行Mod
第三章 正式开始
1. 文件结构
2. 修改Mod信息
本文参考:
第一章 导论
1 什么是Forge?
什么是Forge呢?这个故事很长,听我慢慢和你说1.1Forge的历史
首先我们要明白我的世界也就是Minecraft是用Java写的(基岩版除外),Minecraft代码并没有开源而是被混淆了。早期的开发者为了做出模组,做了一个叫Mod Coder Pack项目简称为MCP。MCP诞生之前,想要制作Minecraft的模组,需要将Minecraft反编译,然后把反编译后生涩难懂的东西大致理解,才能开始制作。
MCP出现后,开发者只需要在反编译反混淆后的环境中去开发,大大降低了模组开发难度。
从MCP项目中诞生出了srg名、notch名和mcp名
以下是srg名、notch名和mcp名在映射表中的例子:
// Notch
boolean a(rw ☃);
// Searge
boolean func_72838_d(Entity p_72838_1_);
// MCP
boolean spawnEntityInWorld(Entity entityIn);
(1) srg名
为了纪念MCP项目开发的领导者Searge,所以就叫了srg名,在srg名中,Minecraft的类名变得可读了,但变量名、方法名等还是不可读,只是有了前缀和尾椎的区分
(2) notch名
notch名是Minecraft直接反编译、反混淆之后的名称,通常是无意义的字母数字组合。
(3) mcp名
这个名称也是我们mod开发中接触最多的名称,在mcp名中,代码已经是可读的了。和我们正常写java程序中的名称没什么两样。但是mcp名是会变动的。
1.2 Forge
随着时间的发展,Mod开发者们意识到,直接修改Jar文件写mod的方式太过于粗暴了,而且Mod和Mod之间的兼容性可以说基本没有,Mod开发者们急需一种工具可以方便地开发Mod,并且能保证mod和mod之间的兼容性,于是Forge就诞生了。
Forge其实就是一套通过修改Minecraft方式实现的第三方API,而且随着时间的发展,MCP现在已经死亡了,除了Forge这套API,Fabric也风头正盛,而Forge本身也在Minecraft 1.13版本到来之后经历了一次重写,引入了大量函数式编程的API。
在你安装完Forge之后,游戏的运行过程中,所有的内容都会反编译成srg名运行,你编译好的mod同样也会被混淆成srg名,保证它可以正常运行。
2. Minecraft的运作方式
2.1 Minecraft的架构
Minecraft的架构大体可以分为C/S架构(客户端/服务端架构)
服务端:负责游戏的逻辑,数据的读写。
客户端:接受用户的输入输出,根据来自服务端的数据来渲染游戏画面。
注意:这里的服务端和客户端只是逻辑上的区分,当玩家在单机模式下,玩家电脑上既有服务端也有客户端,但进入服务器后,玩家的电脑上只存在客户端,而服务端就在服务器上。2.2 如何区分服务器和客户端?
Minecraft的World中有一个isRemote字段,当处于客户端时这个变量值为true,当处于服务端时这个变量值为false。
3. 开发模型
3.1 运行逻辑
如果你看了最开始介绍的参考网站,你可能已经看到他的作者说Minecraft mod 开发基本上遵循了「事件驱动模式」,这个词对于新手来说可能不是很能理解。
在我看来,Minecraft的运行顺序和绝大多数游戏都差不多,甚至和大家平时敲的代码的运行顺序都没什么两样,因为它本身就是代码,肯定是遵循顺序结构的,游戏本身就是一个循环,游戏中的变化就是在这个循环中的不同节点的代码运行的结果,比如游戏可能会先判断玩家是否死亡,后判断玩家的移动,这些顺序一定是合理的,否则游戏就会变得很怪异。
3.2 总线
当然,很多游戏都是多线程的,每个线程都是顺序结构,在Minecraft中就称为总线。
在Forge开发里有两条总线,Mod总线和Forge总线,所有和初始化相关的事件都是在Mod总线内,其他所有事件都在Forge总线内。
4. 核心概念
4.1 注册
如何你想在游戏中添加方块、物品、生物、事件等,那就必须要注册,通过注册才能将东西加入到游戏中。你注册时需要的东西基本上可以分成两个部分:一个注册名和一个实例。
4.2 资源包路径
ResourceLocation就是资源包路径,它可以告诉游戏需要的资源在哪里。
它大概长成这样:minecraft:textures/block/stone.png。代表了原版资源包下的石头的材质图片,它分成两部分,冒号前面的叫做「域(domain)」,在原版中只有一个域,即minecraft域,但是如果你开始开发mod,那么每个mod都会有一个或者多个域。冒号的后半部分是和assets文件夹内的目录结构一一对应的。从某种程度上来说,ResourceLocation就是一个特殊的URL。
4.3 模型材质
Minecraft是一个3D游戏,所以它的模型基本都是3D模型,模型在游戏中就是骨骼,而材质就是皮肤,骨骼只是一个大致的外形,皮肤才可以让物品或生物更好看。材质都是png图片,在制作材质时请保证你的背景都是不透明的,如何是透明或半透明可能会出现不可预知的错误。
第二章 环境配置
1. 需要的工具
1.1 JDK安装
你可以通过访问Java官网来安装JDKwin32位选x86的,win64选x64的
下载后双击打开即可开始安装。如下图,因为安装过程可以采用默认的配置方式,所以可以连续点击下一步直至安装完成。
JDK环境变量的配置需要三个步骤。首先配置JAVA_HOME:右键点击计算机图标,接着点击菜单最下方的属性菜单项,或者连续打开控制面板–系统和安全–系统也可以:
在弹出的窗口中点击左边的高级系统设置:
在弹出的对话框中单击”高级“选项卡,接着点击下方的环境变量:
在环境变量对话框中点击下方的系统变量的新建按钮:
在弹出的新建系统变量里的变量名中输入JAVA_HOME,在变量值中输入JDK的根目录:C:\Program Files\Java\jdk1.8.0_101。然后点击确定,返回环境变量对话框,再次点击新建按钮,分别输入classpath和.;%JAVA_HOME%\lib;,注意,此变量值以英文句点符号开始,以分好结束。然后点击确定,返回环境变量对话框。
最后,在系统变量里面找到Path变量,注意,这次是点击编辑按钮,在弹出的对话框中的变量值的最后,一定是最后,添加如下字符串:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin。注意,前面第一个是分号。如果没有Path变量,则添加Path变量,添加步骤和前面一样,不在重复。
如果你是Windows用户,还需要将开发中的所有编码设置为UTF-8,新建一个名为GRADLE_OPTS的变量,其值为-Dfile.encoding=utf-8
1.2 IDEA
这里推荐用IDEA社区版,因为专业版收费,当然如果你有专业版的使用渠道更好
参考内容:IDEA安装与配置(小白教程)在IDEA官网下载社区版(记得把download旁边的zip换成exe,图中忘换了)
双击安装包
选择安装路径
勾选选项:
点击安装:
安装成功:
到目前为止,IDEA就算是安装完成了
1.3 Forge MDK
Forge1.12.2下载页面,进入页面后点击MDK(不要点击Install)
当然,如果你找不到下载的链接,你可以点击这里下载Forge1.12.2MDK
下载成功后就是一个压缩包
右键解压到一个指定的目录
到此为止,MDK就安装完成了
2. 配置环境
2.1 在IDEA中配置MDK开发环境
打开安装好的IDEA,点击Open
选择解压好的MDK文件夹中的build.gradle文件,点击OK
点击Open as Project
点击Trust Project
等待项目加载完毕
加载完毕后基本都会有报错信息
点击File中的Project Structure
将SDK改为1.8版本,然后点击Apply
在MDK文件夹上方输入cmd然后回车打开命令提示符窗口
输入gradlew.bat setupDecompWorkspace后回车,Linux用户把gradlew.bat改为./gradlew,为了确保java版本为1.8我使用了java -version命令(不要在意为什么命令行目录变了,问就是上一步写完换机子了)
由于构建项目的下载地址在国外,所以大概率会显示失败,重复这个过程直到出现BUILD SUCCESSFUL就成功了
右键build.gradle选择IDEA
点击File -> Settings -> Editor -> File Encodings,将编码方式设置为UTF-8,点击Apply,然后点击OK
如果你出现了下面的提示,那你需要在gradle-wrapper.properties文件中修改distributionUrl的值为https\://mirrors.cloud.tencent.com/gradle/gradle-4.10.3-bin.zip,然后重启IDEA
重新打开IDEA,等待加载完成
2.1 配置启动项
点击右上角Current File -> Edit Configuration,再点击Add new,最后点击Gradle
在Run下面输入runClient,点击Apply,点击OK
3. 运行Mod
3.1 运行
点击右上角的运行按钮(绿色三角)
稍等片刻,就会发现Minecraft已经启动了
3.1 配置Minecraft
点击地球图标,选择简体中文,点击完成
点击Mods
这个Example Mod(你的可能不一样)就是咱们得mod了,名字对应的是代码中的模组名,其内容都可以修改
第三章 正式开始
1 文件结构
我们主要将注意力放在src目录中1.1 Mod资源文件的文件结构
Mod的资源文件有很多类型,如方块物品材质、模型、声音、语言文件等
1.2 mcmod.info文件
src/main/resources目录下有一个叫mcmod.info的文件,它是描述Mod的关键文件,之前我们在游戏中点击Mods后在我们的模组界面中的内容就和这个文件有直接的关系。
1.3 pack.mcmeta文件
src/main/resources目录下有一个叫pack.mcmeta的文件,它是材质包的描述文件,FML是将Mod中的资源文件以材质包的方式加载的。
1.4 Java源代码
Java源代码是以包的形式来组织的。
包的通常表现形式就是由小数点分隔的一系列字符串的集合,如下图中的com.examplemod就是一个包。
包可以是其他包的子包,比如下图的com.example.examplemod就是com.example的子包。

在Java中,大量的代码都是以包的形式组织的,如:
● Java官方提供的很多代码都位于java包下,作为java包的子包,如java.lang、java.util等。
● 所有Minecraft有关代码都位于net.minecraft包下,而所有和MinecraftForge有关的代码都位于net.minecraftforge包下,其中有一个名为net.minecraftforge.fml的子包,存放的是所有FML的代码。
1.5 修改包名
右键com.example.examplemod -> Refactor -> Rename 就可以进行改名(如下图所示)
我改为了fktg.test,其中fktg是我的名字,test是模组名字,完成后点击Refactor
完成后可能会多出来一个com.example的空包,右键删除就可以了
2 修改Mod信息
2.1 修改类名
● 类名应该采用大写驼峰式,大写驼峰式指的是每个单词只有首字母大写,比如:FKTGTest或FktgTest,因为FKTG是缩写所以第一个大写或全大写都可以。
右键ExampleMod -> Refactor -> Rename
我将类名改为了FKTGTest,你也可以改为自己喜欢的(一般和包名对应),完成后点击Refactor
2.2 修改ModID
● ModID是一个Mod的标识符,也就是说,是一个Mod的身份。
● ModID中的英文字母需要全部是小写,最长不超过64个字符。
在刚才改完名的类中找到public static final String MODID = "examplemod";
将其修改为你想要的ModID

2.3 修改Mod的名字
● Name的值会直接暴露给玩家看。
● Name的值可以出现很多字符,大写英文字母、横线、空格都可以。
找到public static final String NAME = "Example Mod";
将其修改为你想要的名称

2.4 关于@Mod注解的介绍
按住Ctrl键后点击Mod
此时会跳转到该注解的代码部分
这里简单介绍一下其中一些值的作用
● dependencies指的是Mod所要求的和其他Mod的关系,默认为空字符串,代表没有要求。
-- 在相应的要求不被满足时,FML也会抛出一个错误而不是继续加载这个Mod。
-- 实际上在生成Mod时,Forge会默认添加一个要求:运行Mod的版本必须不低于当前使用的Forge版本。
● clientSideOnly决定Mod是否只会在客户端加载,这通常用于客户端专用的Mod,默认为false,代表在客户端和服务端都加载。
● serverSideOnly决定Mod是否只会在服务端加载,这通常用于客户端专用的Mod,默认为false,代表在客户端和服务端都加载。
● acceptedMinecraftVersions指的是Mod接受的Minecraft版本,当版本不符时,FML会抛出一个错误而不是继续加载这个Mod。
-- 1.12.2(本教程)表示该Mod只支持Minecraft1.12.2版本。
-- [1.9,1.10.2]表示该Mod支持1.9(包含)到1.10.2(包含)的所有Minecraft版本。
-- [1.11,1.12)表示该Mod支持1.11(包含)到1.12(不包含)的所有Minecraft版本,也就是1.11、1.11.1和1.11.2三个版本。
-- [1.9,)表示该Mod支持从1.9(包含)之后出现的所有Minecraft版本。
-- (,1.7.10],[1.10,)表示该Mod支持1.7.10(包含)之后出现的所有Minecraft版本和从1.10(包含)之后出现的所有Minecraft版本。
2.5 修改@Mod注解
由于本教程只支持1.12.2版本,所以我们修改@Mod注解为以下内容(modid和name在改完类名后就不要动)@Mod(modid = 你的类名.MODID, name = 你的类名.NAME, version = 你的类名.VERSION, acceptedMinecraftVersions = "1.12.2")
修改完后就完成了@Mod注解了


浙公网安备 33010602011771号