这节我们来在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!相关推荐

  1. [Minecraft][Mod开发]如何做一个告示牌点赞mod

    本文选用的mc版本是1.16.5,但理论上可用于1.14+.若有人尝试成功,欢迎评论区留言. 需要实现的内容: 1:告示牌写上特定文本后使其作为点赞告示牌 2:点赞告示牌每次点赞后点赞数增加 3:点赞 ...

  2. 如何渲染一个生物 - Minecraft 1.16 Forge Mod 开发笔记

    如何渲染一个生物 - Minecraft 1.16 Forge Mod 开发笔记 基本渲染框架 调用栈 渲染器 `EntityRenderer` 生物基础渲染器 `LivingRenderer` La ...

  3. 【MineCraft】-- 使用Java开发我的世界Mod

    使用idea 2019版本; 确保idea可以正常使用后↓ 一.下载框架 https://github.com/IdeallandEarthDept/IdeallandFramework 下载后解压打 ...

  4. Minecraft 1.8.9 FML Mod 开发教程

    Mod开发教程 https://fmltutor.ustc-zzzz.net/ 转载于:https://www.cnblogs.com/lihuibin/p/8986455.html

  5. minecraft编程java_第一章 minecraft编程mod

    本帖最后由 ggsshh 于 2017-5-16 11:05 编辑 [size=14.0000pt]第一章 [size=14.0000pt]minecraft编程mod[size=14.0000pt] ...

  6. 【MC 网易-我的世界-mod开发基础笔记】 --- 前期准备

    文章目录 说明 前提: 准备工作 建议: 说明 通过网易官方文档的内容已经官方提供的视频相结合,总结的mod开发笔记. 开发必须要掌握基础的python编程基础,且此笔记中,官方的mc开发工具仅仅只是 ...

  7. 如何开发一款Minecraft Launcher

    如何开发一款Minecraft Launcher Minecraft文件介绍 Versions文件夹介绍 版本中的json介绍 Minecraft启动介绍 Libraries介绍 MC参数介绍 lib ...

  8. 我的世界java版合成表_Minecraft 1.12.2 Mod开发笔记——新的合成表、烧炼规则和燃料...

    新的合成表 在这之前,合成表使用 GameRegistry.addShapedRecipe() 创建,但从 1.12 开始,Minecraft 使用 json 文件创建合成表.Forge 会自动加载在 ...

  9. 饥荒联机版Mod开发——衣服(十一)

    饥荒联机版Mod开发--衣服(十一) 前言 总览与下载 modmain prefab 动画 前言 饥荒里面装备栏有三个地方,手,身体,头.上一期我们讲了戴头上的帽子,这期我们讲讲穿在身上的衣服.事实上 ...

  10. 【MC 网易-我的世界-mod开发基础笔记】 --- 创建第一个空白Mod

    目录 创建Mod文件夹 构建Mod的基本目录结构 构建行为包基本结构 构建脚本文件夹基本结构 构建 mod 启动入口脚本 构建资源包基本结构 构建国际化文件基本结构 自定义物品配置中文名称 自定义方块 ...

最新文章

  1. linux下接口持续集成,部署jenkins持续集成工具
  2. python取均匀不重复的随机数
  3. 过了所有技术面,却倒在 HR 一个问题上。。
  4. Visual BERT论文的简单汇总
  5. 编程学习初体验(5. 如何自学编程)(3)
  6. HTML5前端常见攻击方式案例讲解!
  7. java mysql 死锁,java-Spring JPA MySQL和死锁
  8. js bom and dom
  9. 重装vcenter后恢复原来制作的模板!
  10. 监控视频转发方案探讨-内网转外网
  11. MongoDB 表结构分析工具介绍 -- Variety
  12. 资源管理器和计算机的功能基本相同吗,“资源管理器”和“计算机”的功能基本相同...
  13. 线性代数及其应用第一章总结
  14. Java游戏开发 —— 扫雷
  15. SQLyog入门教程:安装与使用
  16. 阮一峰 ES6 入门读书笔记(十四):async 函数
  17. 苹果笔记本能玩英雄联盟吗_等了一整年的英雄联盟手游,终于能玩了!
  18. 关于md导入时本地图片外链失败的解决方法
  19. android更改menu字体颜色,Android 修改 Menu字体颜色
  20. MySQL从删库到跑路(0):序章

热门文章

  1. (014) 类函数和对象函数
  2. 【电脑操作】【鼠标】无线鼠标无反应怎么办?
  3. 计算机网络应用云计算,计算机网络云计算技术应用
  4. 网络语言3c是什么意思,2017网络流行语大全:这些网络新词你知道吗
  5. Android应用商店——项目介绍
  6. Ubuntu cups日志占满磁盘空间问题解决
  7. 糖尿病会对视网膜造成影响吗?
  8. 《一罐猪油》——迟子建
  9. Linux提高CPU使用率并设置固定占比
  10. php编码小坑之调用新浪天气api和阿凡达天气api