Minecraft Mod 开发:2-Hello, Minecraft Mod World!
这节我们来在Minecraft日志中输出“Hello, Minecraft Mod World!”
2.1.新建一个主类
新建一个包(这里是com.rycb.etech
),并在其中新建一个类(强烈建议这个类的类名与你的Mod名称相同),这就是Mod的主类了。
src/main/java/com/rycb/etech/EasyTech.java
:
package com.rycb.etech;import com.rycb.etech.init.ModRecipes;
import com.rycb.etech.proxy.CommonProxy;
import com.rycb.etech.tabs.ETechTab;
import com.rycb.etech.util.Reference;
import com.rycb.etech.world.ModWorldGen;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;/*** @author RYCBStudio*/@Mod(modid = Reference.MOD_ID, name = Reference.NAME, version = Reference.VERSION, acceptedMinecraftVersions = Reference.MC_VERSION)
public class EasyTech {@Mod.Instance(Reference.MOD_ID)public static EasyTech instance;@Mod.EventHandlerpublic void preInit(FMLPreInitializationEvent event) {proxy.preInit(event);}@Mod.EventHandlerpublic void Init(FMLInitializationEvent event) {proxy.Init(event);}@Mod.EventHandlerpublic void postInit(FMLPostInitializationEvent event) {proxy.postInit(event);}@SidedProxy(clientSide = Reference.PROXY_CLIENT, serverSide = Reference.PROXY_SERVER)public static CommonProxy proxy;
}
package
,import
显而易见,这里就不多赘述。
(其实package
,import
都不用打,IDEA会自动导入的)
读到这里,你可能会发现,在这些代码中,出现了Reference
。这个是什么,后面会慢慢讲述。
modid
指的是该Mod的唯一标识符name
指的是该Mod的名称version
指的是该Mod的版本号acceptedMinecraftVersions
指的是Mod接受的Minecraft版本,当版本不对时,FML会优雅地抛出一个错误而不是继续加载这个Mod
@instance
注解的作用是将生成的该Mod的实例,注册到对应的Mod的id,同时,也可以访问其他Mod的id对应的实例,当然,这里的id要和本Mod的id相同。
2.2.来点代理!
众所周知,Minecraft Mod有客户端(Client)和服务端(Server)两种使用方式,而两种方式的差异足够大得使Mod需要采用两种初始化方式,而两种方式的差异又足够小得使Mod没有必要制作客户端和服务端两个版本。这时代理便起到了区别两种初始化方式的作用。在单机运行时,Minecraft也会生成一个本地服务端。服务端和客户端之间的差异十分复杂,甚至很多都只是经验之谈,然而有一点往往是通用的,服务端的代码,往往客户端都会执行。
这时,主类中的
@SidedProxy(clientSide = "com.rycb.etech.proxy.ClientProxy", serverSide = "com.rycb.etech.proxy.CommonProxy")public static CommonProxy proxy;
就有用了。
Forge会在加载Mod的时候自动使用上面的类名对这个代理进行实例化。(⚠注意⚠:因为这里用到的类不是引用的,而是以字符串形式存在,故若你要修改代理的位置,请不要忘记修改这个!)(有一次我就是因为这个Debug了半天)
新建包proxy
,并新建一个类CommonProxy
:
src/main/java/com/rycb/etech/proxy/CommonProxy.java
:
package com.rycb.etech.proxy;import net.minecraft.item.Item;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;/*** @author RYCBStudio* Create Time: 2022/1/28* Location:Easy-Tech/com.rycb.etech.proxy/CommonProxy.java* Use the IntelliJ IDEA*/
public class CommonProxy {public void preInit(FMLPreInitializationEvent event) {//TODO}public void Init(FMLInitializationEvent event) {//TODO}public void postInit(FMLPostInitializationEvent event) {//TODO}public void registerItemRender(Item item, int meta, String id) {//TODO}
}
也是在这个包下,再新建一个类ClientProxy
,并继承类CommonProxy
:
package com.rycb.etech.proxy;import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;/*** @author RYCBStudio* Create Time: 2022/1/28* Location:Easy-Tech/com.rycb.etech.proxy/ClientProxy.java* Use the IntelliJ IDEA*/
public class ClientProxy extends CommonProxy{/*@Overridepublic void preInit(FMLPreInitializationEvent event){super.preInit(event);}@Overridepublic void Init(FMLInitializationEvent event){super.Init(event);}@Overridepublic void postInit(FMLPostInitializationEvent event){super.postInit(event);}*/@Overridepublic void registerItemRender(Item item, int meta, String id) {ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), id));}
}
(这里用块注释(/*
和*/
之间的部分)注释掉了的代码是可用可不用的,可以根据需要酌情添加)
2.3.Mod索引文件(Reference.java
)
看了这么久,你是否还记得主类中的Reference
呢?别急,我们马上实现它。
在com.rycb.etech
包(即根目录)下新建包,名为util
,并继续新建一个类Reference
:
src/main/java/com/rycb/etech/util/Reference.java
:
package com.rycb.etech.util;/*** @author RYCBStudio/Java Department* <p>Create Time: 2022/7/29 16:14</p>* <p>Use the IntelliJ IDEA</p>* <p>Location: EasyTech/com.rycb.etech.util/Reference.java</p>* <h1><center>Reference</center></h1>*/
public class Reference {public static final String MOD_ID = "etech";public static final String NAME = "Easy Tech";public static final String VERSION = "0.0.1";public static final String MC_VERSION = "[1.12.2]";public static final String PROXY_CLIENT = "com.rycb.etech.proxy.ClientProxy";public static final String PROXY_SERVER = "com.rycb.etech.proxy.CommonProxy";
}
这下再回到EasyTech.java
(主类),导入标红的地方就可以啦~
2.4.完善你的Mod信息
一个Mod的信息在src/main/resources/mcmod.info
中,填写一些信息即可。
比如,本教程的mcmod.info
是这样的:
src/main/resources/mcmod.info
:
[
{"modid": "etech","name": "Easy Tech","description": "A simple, convenient, useful and surrealistic industrial mod","version": "${version}","mcversion": "${mcversion}","url": "https://github.com/RYCBStudio/EasyTech","updateUrl": "","authorList": ["RYCBStudio"],"logoFile": "Etech_logo.png","screenshots": [],"dependencies": []
}
]
modid
前面已说过,这里就不多赘述。name
是Mod的名称,比如这里就是Easy Tech
(简单科技)description
是Mod的描述,比如这里就是A simple, convenient, useful and surrealistic industrial mod
(一个简单、方便、有用且超现实的工业Mod)version
是你Mod的版本,不建议填写,但若出现以下这种情况,还是建议填写:mcversion
是你的Mod所适用的Minecraft版本,这个不应修改,因为Gradle在构建时会自动注入url
是你的Mod的网站,一般设置为源码存放站点(适用于开源Mod,比如Github链接)或官方网站(适用于闭源Mod和比较大型的Mod)updateUrl
是你的Mod检查更新的网址,若是开源Mod又将源码存放于Github上,就可以填写成https://github.com/你的名字或组织名字/你自定义的项目名称/tags
authorList
是你的Mod的作者,比如这里就是RYCBStudio- 一般未被修改的
mcmod.info
里面还会有credits
的键,这是荣誉(自己去翻译吧),这其实没什么用,删掉也不会报错 logoFile
是你的Mod的Logo文件存放地址,比如这里就是Etech_logo.png
,若你想把它放在不同的文件夹,请使用[相对路径]screenshots
是你的Mod的截图dependencies
是你的Mod的依赖,若是独立Mod,不写即可。
2.5.Hello, Minecraft Mod World!
最后,为了验证我们的Mod是否真的配置好了,我们就在Minecraft控制台中输出“Hello, Minecraft Mod World!”这句话吧!
在你的主类中添加这样一条语句即可:
src/main/java/com/rycb/etech/EasyTech.java(节选)
:
@Mod.EventHandler
public void Init(FMLInitializationEvent event) {System.out.println("Hello, Minecraft Mod World!");proxy.Init(event);
}
IDEA中直接打sout
即可。
那么,代码写好了,怎么运行呢?
很简单,在IDEA的界面左上角有一个绿色的锤子,旁边就是运行游戏。
结果如下:(找不到的可以在日志中按Ctrl+F查找)
Minecraft Mod 开发:2-Hello, Minecraft Mod World!相关推荐
- [Minecraft][Mod开发]如何做一个告示牌点赞mod
本文选用的mc版本是1.16.5,但理论上可用于1.14+.若有人尝试成功,欢迎评论区留言. 需要实现的内容: 1:告示牌写上特定文本后使其作为点赞告示牌 2:点赞告示牌每次点赞后点赞数增加 3:点赞 ...
- 如何渲染一个生物 - Minecraft 1.16 Forge Mod 开发笔记
如何渲染一个生物 - Minecraft 1.16 Forge Mod 开发笔记 基本渲染框架 调用栈 渲染器 `EntityRenderer` 生物基础渲染器 `LivingRenderer` La ...
- 【MineCraft】-- 使用Java开发我的世界Mod
使用idea 2019版本; 确保idea可以正常使用后↓ 一.下载框架 https://github.com/IdeallandEarthDept/IdeallandFramework 下载后解压打 ...
- Minecraft 1.8.9 FML Mod 开发教程
Mod开发教程 https://fmltutor.ustc-zzzz.net/ 转载于:https://www.cnblogs.com/lihuibin/p/8986455.html
- minecraft编程java_第一章 minecraft编程mod
本帖最后由 ggsshh 于 2017-5-16 11:05 编辑 [size=14.0000pt]第一章 [size=14.0000pt]minecraft编程mod[size=14.0000pt] ...
- 【MC 网易-我的世界-mod开发基础笔记】 --- 前期准备
文章目录 说明 前提: 准备工作 建议: 说明 通过网易官方文档的内容已经官方提供的视频相结合,总结的mod开发笔记. 开发必须要掌握基础的python编程基础,且此笔记中,官方的mc开发工具仅仅只是 ...
- 如何开发一款Minecraft Launcher
如何开发一款Minecraft Launcher Minecraft文件介绍 Versions文件夹介绍 版本中的json介绍 Minecraft启动介绍 Libraries介绍 MC参数介绍 lib ...
- 我的世界java版合成表_Minecraft 1.12.2 Mod开发笔记——新的合成表、烧炼规则和燃料...
新的合成表 在这之前,合成表使用 GameRegistry.addShapedRecipe() 创建,但从 1.12 开始,Minecraft 使用 json 文件创建合成表.Forge 会自动加载在 ...
- 饥荒联机版Mod开发——衣服(十一)
饥荒联机版Mod开发--衣服(十一) 前言 总览与下载 modmain prefab 动画 前言 饥荒里面装备栏有三个地方,手,身体,头.上一期我们讲了戴头上的帽子,这期我们讲讲穿在身上的衣服.事实上 ...
- 【MC 网易-我的世界-mod开发基础笔记】 --- 创建第一个空白Mod
目录 创建Mod文件夹 构建Mod的基本目录结构 构建行为包基本结构 构建脚本文件夹基本结构 构建 mod 启动入口脚本 构建资源包基本结构 构建国际化文件基本结构 自定义物品配置中文名称 自定义方块 ...
最新文章
- linux下接口持续集成,部署jenkins持续集成工具
- python取均匀不重复的随机数
- 过了所有技术面,却倒在 HR 一个问题上。。
- Visual BERT论文的简单汇总
- 编程学习初体验(5. 如何自学编程)(3)
- HTML5前端常见攻击方式案例讲解!
- java mysql 死锁,java-Spring JPA MySQL和死锁
- js bom and dom
- 重装vcenter后恢复原来制作的模板!
- 监控视频转发方案探讨-内网转外网
- MongoDB 表结构分析工具介绍 -- Variety
- 资源管理器和计算机的功能基本相同吗,“资源管理器”和“计算机”的功能基本相同...
- 线性代数及其应用第一章总结
- Java游戏开发 —— 扫雷
- SQLyog入门教程:安装与使用
- 阮一峰 ES6 入门读书笔记(十四):async 函数
- 苹果笔记本能玩英雄联盟吗_等了一整年的英雄联盟手游,终于能玩了!
- 关于md导入时本地图片外链失败的解决方法
- android更改menu字体颜色,Android 修改 Menu字体颜色
- MySQL从删库到跑路(0):序章