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

news2024/7/4 4:56:38

前言

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_ID
    public static final String MOD_ID = "tutorialmod";
    public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

    @Override
    public void onInitialize() {
        // 在模组初始化时注册自定义物品
        ModItems.registerModItems();
    }
}

TutorialModClient.java

定义客户端,目前暂且用不到,先写入以下代码

package com.example;

import net.fabricmc.api.ClientModInitializer;

public class TutorialModClient implements ClientModInitializer {
    @Override
    public 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_DIAMOND
    public static final Item ZER_DIAMOND = regItem("zer_diamond",
            new Item(new FabricItemSettings()));

    // 自定义物品示例:ZER_INGOT
    public 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.coloradmin.cn/o/856782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新型高速 JavaScript 运行时 Bun 0.7 发布

导读近日,新型 JavaScript 运行时 Bun 正式发布了 0.7 版本,带来了重大的升级。据悉,Bun 是一个配套齐全的 JavaScript 解决方案,集运行时、打包器、转译器和包管理器于一体,追求极致的运行速度。此次更新主要集中在与…

命令提示符之操作基础(Windows)

打开命令提示符 方法一 打开指定文件的文件夹,在路径栏里输入“cmd”,回车,就进入控制台了。默认路径就是指定文件夹的路径。 方法二 打开指定的文件夹,按住shift键,在空白处右击,在菜单栏中选择“在此处打…

基于nodejs+vue+uniapp微信小程序的短视频分享系统

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 3.1小程序端 用户注册页面,输入用户的个人信息点击注册即可。 注册完成后会返回到登录页面,用户输入自己注…

液态金属——究竟是个美丽的概念还是大有可为

液态金属是一种新型的合金材料,在低温熔炼制备工艺下,将不同的金属材料按照一定的配比,通过温度控制使其充分融合,从而形成新的金属材料(也可以理解为表面工艺处理手法)。 液态金属可看作由正离子流体和自由…

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互

文章目录 引入IPC通信[主/渲染]进程对应渲染进程>主进程代码测试测试效果 主进程>渲染进程代码测试测试效果 双向通信代码测试测试效果 引入 electron项目常常由一个主进程和多个渲染进程构成,渲染进程之间是隔离的,而所有渲染进程都和主进程共享…

优雅的使用 Dockerfile 定制镜像

一、使用 Dockerfile 定制镜像 1.1、Dockerfile 定制镜像 1.2、FROM 指定基础镜像 1.3、RUN 执行命令 1.4、构建镜像 1.5、镜像构建上下文(Context) 1.6、其他 docker build 的用法 二、Dockerfile 指令 2.1、COPY 2.2、ADD 2.3、CMD 2.4、EN…

IDEWA项目实践——mybatis的一些基本原理以及案例

系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala IDEA项目实践——动态SQL、关系映射、注解开发 文章目录 系列文章目录 1.MyBatis …

基于Tars高并发IM系统的设计与实现-实战篇5

基于Tars高并发IM系统的设计与实现-实战篇5 群聊服务 GroupChatServer 群聊服务既可以接受来自BrokerServer的用户请求,也需要接收来自其他服务的RPC请求;所以本服务提供两套RPC接口:通用RPC接口和专用RPC接口。 通用RPC接口 通用RPC接口主要处理如下…

Jenkins自动化打包脚本

一、背景 jenkins可以设置定时任务打包,也已手动点按钮打包,还可以通过执行http请求打包,今天我们就通过shell脚本,通过curl命令进行jenkins打包。 二、步骤 2.1 在jenkins上构建项目 设置触发器 2.2 通过shell脚本触发远程构…

【RabbitMQ上手——单实例安装5种简单模式实现通讯过程】

【RabbitMQ入门-单实例安装&5种简单模式实现通讯过程】 一、环境说明二、安装RabbitMQ三、用户权限及Virtual Host设置四、5种简单模式实现通讯过程的实现五、小结 一、环境说明 安装环境:虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8RabbitMQ版本:…

并发——线程的生命周期和状态

文章目录 Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态(图源《Java 并发编程艺术》4.1.4 节)。 线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示&am…

点对点协议PPP

点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。PPP协议是因特网的正确标准。 基本格式: PPP协议是数据链路格式。格式如下: 标志(Flag)字段: PPP的定界符,取值为0x7E 地址(Address)字段: 取值为0xFF&…

多语言自动翻译海外跨境电商独立站源码开发

要搭建一个多语言自动翻译的海外跨境电商独立站,需要进行以下步骤: 1. 选择合适的开发语言和框架:根据自己的技术实力和需求,选择适合的开发语言和框架。 2. 设计数据库结构:根据电商的业务需求,设计数据…

【CHI】架构介绍

Learn the architecture - Introducing AMBA CHI AMBA CHI协议导论--言身寸 1. AMBA CHI简介 一致性集线器接口(CHI)是AXI一致性扩展(ACE)协议的演进。它是Arm提供的高级微控制器总线架构(AMBA)的一部分。…

电源控制--对数与db分贝

在控制理论中,"db"通常表示分贝(decibel)的缩写。分贝是一种用于度量信号强度、增益或衰减的单位。 在控制系统中,分贝常用于描述信号的增益或衰减。通常,增益以正数的分贝值表示,而衰减以负数的…

C语言——九九乘法表

//九九乘法表 //用程序做一个九九乘法表 #include<stdio.h> int main() {int i,j,result;printf("\n");for(i1;i<10;i){for(j1;j<i;j){resulti*j;printf(" %d*%d%-d",i,j,result);}printf(" \n");}}

成集云 | 畅捷通采购单同步至钉钉 | 解决方案

源系统成集云目标系统 介绍 畅捷通是一家专业的金融科技公司&#xff0c;致力于为投资者提供便捷、高效的金融服务。通过畅捷通T的交易方式&#xff0c;投资者可以更加灵活地进行买卖交易&#xff0c;并且在交易完成后即可获得结算款项&#xff0c;无需等待T1的结算周期。 钉…

利用multiprocessing实现多线程,并实现多个参数传递函数的多并行

前言 利用多线程一般来说都是有 一定的大数据需求。 比如一个函数可能被不断的调用很多次 一般来说我们会使用for循环&#xff0c;但是为了节省时间&#xff0c;我们采用多线程的方式来解决这个问题 show you code 单参数输入 举了两个例子&#xff0c;一看便知 func为我们的函…

探索MongoDB的奥秘:基本命令使用入门指南

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 探索MongoDB的奥秘&#xff1a;基本命令使用入门指南 ⏱️ 创作时间&a…

世界算力简史(下)

世界算力简史&#xff08;上&#xff09; 世界算力简史&#xff08;中&#xff09; 今天终于要完结了…… █ 1980-1990&#xff1a;PC时代 IBM-PC和“兼容机” 上一篇&#xff0c;我们说到&#xff0c;70年代微处理器崛起&#xff0c;使得个人电脑开始大量出现。 这种情况&…