【Minecraft】Fabric Mod开发完整流程1 - 环境配置与第一个物品

前言

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 文件夹新增如下图所示结构
在这里插入图片描述

下面将介绍对应结构的作用

  1. lang/en_us.json 定义物品或者方块在游戏内部显示的名称
  2. models/item/zer_diamond.json 定义模型
  3. textures/item/zer_diamond.png 定义模型对应的贴图
  4. fabric.mod.json 模组属性设置
  5. 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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60127.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day23-113. 路径总和ii

113. 路径总和ii 力扣题目链接(opens new window) 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树,以及目标和 sum 22, 思路 利用…

Rpc异步日志模块

Rpc异步日志模块作用 在一个大型分布式系统中,任何部署的分布式节点都可能发生崩溃,试想如果用普通的办法,即先排查哪个节点down掉了,找到down掉的节点后采取调试工具gdb调试该节点,进而排查宕机的原因。这中排查方法…

JavaWeb 手写Tomcat底层机制

目录 一、Tomcat底层整体架构 1.简介 : 2.分析图 : 3.基于Socket开发服务端的流程 : 4.打通服务器端和客户端的数据通道 : 二、多线程模型的实现 1.思路分析 : 2.处理HTTP请求 : 3.自定义Tomcat : 三、自定义Servlet规范 1. HTTP请求和响应 : 1 CyanServletRequest …

多用户跨境电商商品库系统快速搭建(全开源)

搭建一个多用户跨境电商商品库系统需要以下步骤: 1. 确定系统需求:首先,需要明确系统的功能需求,包括商品管理、订单管理、用户管理、支付管理等。根据具体需求确定系统的功能和界面设计。 2. 确定技术栈:选择合适的…

Maven: No compiler is provided in this environment.

在Eclipse中运行Maven项目,报错: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 解决方法: Windows > Preferences > Java > Installed JREs > Add > Standard VM,…

python——案例14:斐波那契数列

兔子生殖为例子而引入,故又称“兔子数列”, 其数值为:1、1、2、3、5、8、13、21、34……在数学上, 这一数列以如下递推的方法定义: F(0)1,F(1)1, F(n)F(n - 1)F(n - 2)(n ≥ 2,n ∈ …

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象,虽然Java有垃圾回收机制(GC),但是对于还保持着引用, 该内存不能再被分配使用,逻辑上却已经不会再用到的对象,垃圾回…

研发工程师玩转Kubernetes——PVC通过storageClassName进行延迟绑定

不同的PV可以使用相同的StorageClass,它们是一对多的关系。 PV可以设置节点亲和性。比如下图,local-storage-class-waitforfirstconsumer-pv-ubuntuc只能在节点ubuntuc上;local-storage-class-waitforfirstconsumer-pv-ubuntud只能在节点ubu…

MySQL不知道密码,直接修改密码

很简单,我们跳过验证,直接进去修改就好 修改配置文件 vim /etc/my.cnf在[mysqld]下直接添加配置 skip-grant-tables如图: 保存,退出即可。 重启服务 service mysqld restart进入MySQL #(直接点击回车,密码为空)…

Fast Tone Mapping for High Dynamic Range Images

Abstract 我们提出了一种快速、有效、灵活的色调再现方法,在低动态范围再现设备中保留了高动态范围场景的可视性和对比度印象。 一个单一的参数控制能见度和对比度在一个简单和优雅的方式和互动速度。 新方法使用简单,计算效率高。 实验表明&#xff0c…

Git详解及使用

Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…