我的世界1.12.2Forge模组开发学习笔记-一切的开始

第一章 导论

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安装

参考CSDNJDK1.8安装教程

你可以通过访问Java官网来安装JDK
win32位选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安装与配置(小白教程)
在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注解了

2.6 修改mcmod.info

之前简单介绍过这个文件,mcmod.info文件内容就是模组的描述内容,其内容会体现在在游戏的Mods列表中。
posted @ 2024-07-14 01:01  方块特工  阅读(2583)  评论(2)    收藏  举报