
前言
最近闲来无事把网盘和网站重新做了一遍,也是诸位现在看到的样子。但是我忘记把我的网盘里的东西备份了,以至于我的WithCake!的工程文件消失了。这也让我想起我的Gitee上有一份备份。我放弃Gitee而转入GitHub的最大的原因是我觉得Gitee每次限制上传文件数量的设定实在是太那啥了,虽然我也很能理解服务器线程刷写也是很有压力的,相比GitHub这种老牌托管仓库肯定得退让。但是如果我有很多mod的话每次分批上传很容易搞混。研究过GitHub之后我还学会了使用插件自动将工程文件推送到GitHub以方便的更新我的模组。
这也让我思考一个问题,我也有不少朋友希望多学一些什么,即便我的技术不够成熟,但是多拉一些朋友一起学习也可以为我增加讨论的伙伴,通过互相讨论也可以有效的一同提高水平。因此我亦然决定来开创一份博客记录我在开发的过程以及开发时遇到的坑。WithCake!在制作时因为技术原因,写法简单粗暴。现在我认为这并不是坏事,我现在有一个很好的示例来向朋友们介绍在开发Minecraft以及学习Java时的一些思路,没有复杂的写法可以让他们快速上道,通过阅读更多优质的源代码来进一步打磨写代码的水平。
制作一个Mod,至少需要拥有最基本的Java理念知识,包括包名,对象,调用函数,备注等。这篇文章选用WithCake也是尽可能配合没有Java基础的伙计来入坑Java。因此不用太紧张,放轻松,我们慢慢来。
这里有两份由其他大佬制作的开发教程,在1.17.1中部分内容可能不适用,但是依然是非常好的参考,而且这些教程更为专业,阅读过这些教程一定比阅读我的教程能得到更多有用的消息。点击下方按钮来阅读:
构建Java开发环境
WithCake是一个基于Minecraft 1.16.5 Forge-36.2.4开发的模组,因此我们需要构建JDK8。但是这篇教程的主题是将WithCake重构建至1.17.1,因此下载JDK16。是的,我打算直接构建OpenJDK。上官网太麻烦了,是时候来感谢清华大学的大佬们清华大学开源镜像站了。点击这个超链接,选择AdoptOpenJDK,点16,我们需要的是jdk,所以点击jdk,然后选择你的操作系统位数。Windows正常只分为x32,x64因此不需要管其他的,在这个里面作出选择。选择你的操作系统,然后选择HotSpot且尾缀为zip的文件,开始下载吧。
很好,我们完成了最重要的第一步。先把它解压到任何你喜欢且不包含中文的目录位置。比如我的在 C:/Mdk 。右键计算机图标,选择内容,点击进阶系统设定,选择环境变量,在下方系统变量中选择新增,加入一个名为JAVA_HOME的变量,位置则是你刚才解压jdk的位置,如 C:/Mdk/jdk-16。很好,现在在上方的用户变量中找到Path,如果没有的话就新增一个。输入:
%JAVA_HOME%\jer\bin;%JAVA_HOME%\bin
做得好,现在按下Win+R,输入cmd。在启动的黑色窗口里分别输入以下内容来验证你的java与jdk版本:
java -version
javac -version
如果它正在向你报告你的java和jvm的版本,那就是完成了,恭喜你!
当然如果什么也没有发生,也不要慌张,仔细检查你的步骤。如果你确定你是完全按照我的步骤做的,或许你可以尝试使用bing或者百度并搜索jdk环境安装,最好带上你的操作系统情况,这样更容易解决问题。
如果你希望拥有多个jdk,那就新建更多的JAVA_HOME,后面带上你的版本号。比如我有JAVA_HOME8,JAVA_HOME16,JAVA_HOME17。好,现在在JAVA_HOME中输入你现在需要的环境,如我需要8,那就输入%JAVA_HOME8%。现在他会自动变量到JAVA_HOME8的目录环境。
你已经完成了任何Java项目开发的最重要也是最关键的一步,这很好!
获取ForgeMdk开发包
首先进入Forge官网,找到适合的版本。
别着急打开,右键mdk选项,点击复制链接。把你刚才得到的链接黏贴到浏览器地址栏,把前面这一段删除:
https://adfoc.us/serve/sitelinks/?id=271228&url=
这样你就能直接得到下载页,而不用看广告和等待跳过广告的按钮出现。
获取一个炫酷的编译器
Eclipse首当其冲,老Java开发者应该都会首推这款编译器,开源且拥有强大社区,功能完善。 其次是新一代智能化,由JetBrain开发的Java编译器Intellij IDEA,社区版是开源使用的,而且功能非常强大且拥有丰富的插件库。 再有则是通过强大社区的强大插件构建的重型武器VSCode,既能当编辑器也能当编译器。
获取到编辑器,解压mdk包,我们可以开始构建了。首先打开cmd,还记得怎么打开吗?Win+R,输入cmd。cd到你的解压后mdk的目录,亦或者打开mdk文件夹,按住Shift右键,选择启动PowerShell。PowerShell与Command有指令用法区别,需要注意。
Eclipse用户:
在cmd中输入gradlew(Shell输入./gradlew,MacOS或者Linux依然),等待构建。构建成功后输入gradlew genEclipseRuns(./gradlew genEclipseRuns),完成后即可把Eclipse的工作区设定为mdk文件夹中eclipse文件,这样你就可以看到你的项目文件了。
IDEA/VSCode用户
IDEA自带Java开发环境,因此只需要右键mdk文件夹选择在IDEA中打开,等待自动构建。稍后在IDEA的运行选项板中输入gradlew genIntelliJRuns(MacOS以及Linux可能会需要使用./gradlew genIntelliJRuns)等待构建。 VSCode用户需要预先安装Java插件包以及Gradle插件包(Extension Pack for Java和Gradle Extension Pack)。稍后右键mdk文件夹,选择在VSCode中打开,等待自动构建。构建完毕,下方会一个一直在转圈的图标会变成绿色的勾。 如果上述“在IDEA中打开”与“在VSCode中打开”无法被找到,请重新安装并仔细阅读安装想到给出的选项,如果你勾选了正确的内容,不可能不出现这些。如果你不知道发生了什么,可以选择全选。
构建失败
别忙,这是正常的,重来就可以了。如果一直构建失败,可以选择使用爪机热点,节点代理或者VPN。亦或者在腾讯云或者阿里云租赁计时收费云来构建,构建完毕后导出.gradle文件夹并关机。亦或者前往耗子大大的离线开发包获取gradle包。无论是导出gradle或者获取离线gradle,位置都是在C:/user/%YourComputerName%(计算机用户名)下的.gradle中。删除原来的并把获取的包替代。如果你是MCr用户,你应该放在C:/user/%YourComputerName%/.mcreator下的gradle(没有点)。不过这份文章不讲解如何使用MCr制作模组,我比较菜,不会玩MCr。非常抱歉。
预热
启动一次,检查是否能够打开Minecraft客户端,启动Client(VSCode在完成构建和环境编译后点击Run即可),稍作等待,稍后Minecraft的游戏窗口出现且正常打开一个游戏界面。做得很好,很高兴你坚持到这一步——我不知道是不是真的,但是有很多模组开发新人总是在这一步之前就被过于麻烦的操作劝退了。你做的很好,因此我们可以更深入的开发!
示例模组
Forge开发包中预备了一份示例模组。别忙着删掉,这份示例模组还是很有意思的。恩,至少还有一些东西要用。你可以拖出来以后慢慢看。哦,抱歉,我还没讲你应该从那开始。首先在你的工作区的路径导览盒里打开./src/main/java,这里开始就要构建包名。一个被广泛接受的包名命名规则是:com.McID.ModID(./com/McId/ModID)。我的Minecraft账户ID是someoneice,我要做的模组是WithCake,我的包名则是com.someoneice.withcake(./com/someoneice/withcake)。
现在为你的模组创建一份主类吧,创建一份Main.java,然后这样填入你的消息:
@Mod("MODID") //MODID可以是你的模组英语名称的小写
public class Main {
public static final String MODID = "MODID";
public static final String Version = "1";
public static final Logger LOGGER = LogManager.getLogger("[MODID]");
public partyrecipes() {
MinecraftForge.EVENT_BUS.register(this); //Forge订阅到线程Event_BUS,稍后这一部分用于订阅注册表类
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
}
private void setup(final FMLCommonSetupEvent event)
{
}
private void doClientStuff(final FMLClientSetupEvent event)
{
}
public static Logger getLogger()
{
return LOGGER;
}
}
现在我的工作区是这样的:
@Mod("withcake")
public class Main {
public static final String MODID = "withcake";
public static final String Version = "1";
public static final Logger LOGGER = LogManager.getLogger("[withcake]");
public partyrecipes() {
MinecraftForge.EVENT_BUS.register(this);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
}
private void setup(final FMLCommonSetupEvent event)
{
}
private void doClientStuff(final FMLClientSetupEvent event)
{
}
public static Logger getLogger()
{
return LOGGER;
}
}
回到main文件夹,打开resources文件夹中的META-INF文件夹,里面应该有个文件,打开他。
找到这段代码:
[[mods]] #mandatory
# The modid of the mod
modId="examplemod" #mandatory
这里记录了你的modid。modid必须全小写,WithCake的modid则是withcake,按实际情况填写。
modId="withcake" #mandatory
后面还有一些作者,以及模组介绍一类的,你可以按情况填写,这里不多赘述,因为它们并不是最关键的部分。虽然我建议你可以先写掉,并且养成习惯。
苏打水!
咖啡与苏打很般配吗?管他的,我们先来写一个简单的物品:苏打水。
首先创建一个Item文件夹,然后创建文件Soda.java。在public class Soda后面加上空格,然后输入extends Item。这时候Item会错报,因为还没有导入Item类,通过编译器修正自动导入import net.minecraft.world.item.Item; 。然后让你的文件闻起来就像下面这样,我会带上注释:
package com.someoneice.withcake.Item;
import com.someoneice.withcake.withcake;
import net.minecraft.item.Item;
//创建物品Soda
public class Soda extends Item {
//为ItemSoda创建一个实现的方法,public是公共(的方法)的意思
public Soda() {
super(new Properties());
}
}
做的不错,伙计。Forge创建物品需要订阅到线程,因此我们需要一个注册表线程。创建Register文件夹并创建ItemRegister.java文件,然后让你的文件闻起来是这样的:
package com.someoneice.withcake.Init;
import net.minecraft.item.Item;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
public class ItemRegistry {
//创建新的订阅请求,注册modid为withcake。
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS,"withcake");
//Item
public static final RegistryObject<com.someoneice.withcake.Item.Soda> SODA = ITEMS.register("soda",()-> new com.someoneice.withcake.Item.SODA());
}
已经倒了这一步了,伙计,回到Main补上订阅线程的修饰就可以让你拥有第一个黑紫物品了,这个黑紫物品不是别的mod错乱出来的,也不是Minecraft错乱出来的,是你亲手创造但是还没有指定贴图的物品。是不是有点激动了?来添加修饰吧。在 MinecraftForge.EVENT_BUS.register(this); 后方回车,输入:
ItemRegister.ITEMS.register(bus);
导入ItemRegister类,启动客户端,输入/give @s withcake:soda 。稍后就可以得到一打黑紫,你已经做到了!你得到了第一个物品!
物品贴图也属于数据包类,因此我打算分章节讲述,这一章节暂时到此为止,非常感谢你耐心!多练习Java程序以及阅读其他开源项目,可以更好的帮助你提高Java以及制作模组的水平!祝你成功!