前言
Fabric 是 Minecraft 一款非官方的模組 API,與 Forge mod 不同。它以輕量級和高性能為設計目標,專注于支持新版本的 Minecraft。
Fabric 和 Forge 在各自的加載編譯流程上差別很大,所以你很難看見有同時支持二者的 mod,除非做了兼容性處理
Fabric 還支持 kotlin 編程
環境配置
以下及后續的所有教程均基于 fabric 官方 wiki 總結精華與踩坑得來,如有覺得下方內容不夠詳細的,可以查看原網站:https://fabricmc.net/wiki/zh_cn:tutorial:setup
安裝必要前置
JDK17
及以上版本(硬性要求,低于此版本的 JDK 無法編譯 Gradle)
Intellij Idea
任意版本
此外,我們還需要使用 fabric 提供的 fabric-example-mod
作為第一個 mod 的開發模板
前往官網的模板生成器,生成你想要的對應 MC 版本模板,我這里使用的是 1.20 的
https://fabricmc.net/develop/template/
配置 gradle
眾所周知,這是最最最最惡心的環節,有可能卡的你生無可戀并出現無法預知的弱智錯誤,在此處我將詳細介紹我所踩到的坑以及目前遇到錯誤的解決方案
解壓 template 文件
把上一步下載好的 ZIP 文件解壓到任意一個文件夾內,并確保全路徑絕對不能包含中文和其他特殊符號(下劃線可以)
刪除多余的 RAEDME.md
.github
LICENSE
然后使用 IDEA 打開該項目文件夾
緊接著此時 IDEA 會自動開始配置 gradle,立馬點擊停止!!!等我們配置代理和鏡像源后再重新構建,否則巨慢!!!而且可能直接下載到一半就報錯
修改鏡像源
配置鏡像源以及代理可以參考這個網站:Fabric 鏡像與代理配置
將 settings.gradle
替換為以下內容
pluginManagement {repositories {maven {name = 'Fabric'url = 'https://repository.hanbings.io/proxy'}gradlePluginPortal()}
}
向 build.gradle
添加如下內容(如果已存在,則直接替換掉)
repositories {maven {url 'https://maven.aliyun.com/nexus/content/groups/public'}maven {url 'https://repository.hanbings.io/proxy'}
}
配置外部代理
是的,即使你配置了鏡像源,可能依然會非常卡,如果你掌握了科學上網的方法,那么可以嘗試添加一個代理
打開項目目錄下的 gradle.properties
文件
添加如下代碼
- proxyHost 即為代理地址(我這邊默認就是 127.0.0.1)
- proxyPort 為你開的代理軟件對應的端口
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=10809
實際上,如果你參考其他教程,可能會在上方順便注冊 https 代理,但是我一旦注冊了必定報錯而無法下載對應庫,所以我就索性刪掉了,只留下比較核心的內容
構建 gradle 與反編譯
構建
構建的方式很簡單,打開 IDEA,右鍵點擊項目目錄,選擇“重新構建”即可
構建成功的標志是你在構建輸出窗口看見 BUILD SUCCESSFUL
反編譯
該步驟必須要在 gradle 構建成功后執行,否則會一直卡著動不了
使用管理員權限打開命令提示符,進入項目所在的目錄
執行該代碼:gradlew genSources
等待時長浮動較大,反正最后構建成功會給你一個大大的綠色提示滴~
第一個物品
此系列參考油管教程:https://www.youtube.com/watch?v=fQYNhfAwLf8&list=PLKGarocXCE1EeLZggaXPJaARxnAbUD8Y_&index=2
制作物品所需的圖像資源包:https://url.kaupenjoe.net/yt331/assets
由于油管上最新的教程只有 1.19 的,而目前代碼風格有所變動,我會針對 1.20 新改動做出對應解釋
物品注冊
首先請各位按照下圖所示文件結構,在對應位置新建空的 Java 類文件,如果文件已存在就不管
新建的文件將在后續逐步填充,不要在意
TutorialMod.java
該文件原始的名稱應該是 ExampleMod.java
由于 Java 特性,類名必須和文件名一致,故我們可以使用快捷鍵 shift+f6
快速執行主類名稱的更改,同時任何引用此類的位置的名稱都會做出對應更改,十分方便!
package com.example;import com.example.item.ModItems;
import net.fabricmc.api.ModInitializer;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;// 主要類,用于初始化模組
public class TutorialMod implements ModInitializer {// 定義模組的MOD_IDpublic static final String MOD_ID = "tutorialmod";public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);@Overridepublic void onInitialize() {// 在模組初始化時注冊自定義物品ModItems.registerModItems();}
}
TutorialModClient.java
定義客戶端,目前暫且用不到,先寫入以下代碼
package com.example;import net.fabricmc.api.ClientModInitializer;public class TutorialModClient implements ClientModInitializer {@Overridepublic void onInitializeClient() {}
}
ModItems.java
在該文件內執行物品的注冊操作
當我們注冊物品時,務必牢記注冊物品所用到的物品名!!!后續為物品添加紋理以及模型時都會用到的
package com.example.item;import com.example.TutorialMod;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;public class ModItems {// 自定義物品示例:ZER_DIAMONDpublic static final Item ZER_DIAMOND = regItem("zer_diamond",new Item(new FabricItemSettings()));// 自定義物品示例:ZER_INGOTpublic static final Item ZER_INGOT = regItem("zer_ingot",new Item(new FabricItemSettings()));// 定義注冊物品到游戲的物品注冊表的方法// 物品注冊需要接收兩個參數:1.MODID 2.物品名稱private static Item regItem(String name, Item item) {return Registry.register(Registries.ITEM, new Identifier(TutorialMod.MOD_ID, name), item);}// 在模組初始化時調用,用于注冊自定義物品public static void registerModItems() {TutorialMod.LOGGER.debug("TutorialMod正在注冊Items,MOD_ID:" + TutorialMod.MOD_ID);// 在這里添加更多的自定義物品注冊邏輯}
}
資源文件
為 resources 文件夾新增如下圖所示結構
下面將介紹對應結構的作用
lang/en_us.json
定義物品或者方塊在游戲內部顯示的名稱models/item/zer_diamond.json
定義模型textures/item/zer_diamond.png
定義模型對應的貼圖fabric.mod.json
模組屬性設置tutorialmod.mixins.json
模組混合屬性設置
en_us.json
首先當然是配置我們的語言文件啦
對于我們開發者來說,推薦首先使用英文,后續可以逐步補全中文翻譯
所以en_us.json
表示當你的 MC 客戶端使用英文時顯示的翻譯,對于的中文翻譯文件就是zh_cn.json
填入代碼
{// 注意格式 item.MOD_ID.物品名稱// 所以知道為什么我要叫你牢記物品注冊時用到的名稱了吧!"item.tutorialmod.zer_diamond": "Zhiller's Diamond","item.tutorialmod.zer_ingot": "Zhiller's Ingot"
}
zer_diamond.json
在這里配置物品的模型文件
因為當前物品只是一個手拿物品,所以模型可以說就是一個簡單的平面,不需要做過多修飾
寫入以下代碼
{"parent": "item/generated","textures": {"layer0": "tutorialmod:item/zer_diamond"}
}
另外一個方塊文件
zer_ingot.json
大家直接如法炮制即可
紋理
在 textures 文件夾下對應的 block 以及 item 文件夾添加方塊和物品的紋理文件
注意,紋理文件名必須和方塊或物體注冊名完全一致!使用 png 格式!
fabric.mod.json
目前僅需修改我打了注釋的幾個地方的內容,其他的不管
{"schemaVersion": 1,"id": "tutorialmod", // 在這修改MOD_ID"version": "${version}","name": "Example mod", // 你的MOD名字"description": "This is an example description! Tell everyone what your mod is about!","authors": ["zhiller"], // MOD作者"contact": {"homepage": "https://fabricmc.net/","sources": "https://github.com/FabricMC/fabric-example-mod"},"license": "CC0-1.0","environment": "*","entrypoints": {// main入口點文件所在位置"main": ["com.example.TutorialMod"],// client客戶端入口點文件所在位置"client": ["com.example.TutorialModClient"]},// 混合文件所在位置"mixins": ["tutorialmod.mixins.json"],"depends": {"fabricloader": ">=0.14.21","minecraft": "~1.20.1","java": ">=17","fabric-api": "*"},"suggests": {"another-mod": "*"}
}
tutorialmod.mixins.json
由于我們在 src 根目錄下的 mixin 包內文件沒有做任何修改,故下方代碼也不需要做任何修改
但請注意要修改該文件的文件名,開頭必須是你的 MOD_ID
哦!
{"required": true,"package": "com.example.mixin","compatibilityLevel": "JAVA_17","mixins": ["ExampleMixin"],"injectors": {"defaultRequire": 1}
}
運行!
沒錯!你目前已經創建了第一個屬于你的個人物品,現在進入客戶端來看看成果把~
依次點擊:gradle->fabric->runClient
執行客戶端
新建一個超平坦世界,輸入該指令獲取你注冊的物品:give @p tutorialmod:zer_diamond 1