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.EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        proxy.preInit(event);
    }

    @Mod.EventHandler
    public void Init(FMLInitializationEvent event) {
        proxy.Init(event);
    }

    @Mod.EventHandler
    public 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
new_pk
pk_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{
    /*
    @Override
    public void preInit(FMLPreInitializationEvent event)
    {
        super.preInit(event);
    }

    @Override
    public void Init(FMLInitializationEvent event)
    {
        super.Init(event);
    }

    @Override
    public void postInit(FMLPostInitializationEvent event)
    {
        super.postInit(event);
    }
    */
    @Override
    public 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的版本,不建议填写,但若出现以下这种情况,还是建议填写:warning
  • 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的界面左上角有一个绿色的锤子,旁边就是运行游戏。
set_1
set_2
set_3
结果如下:(找不到的可以在日志中按Ctrl+F查找)
Hello, Minecraft Mod World!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要编写一个Java语言的Minecraft mod,使得当玩家受伤时会自动打开创造模式,可以按照以下步骤进行: 1. 下载并安装Minecraft Mod开发工具,例如Eclipse或IntelliJ IDEA。 2. 创建一个新的Minecraft mod项目。 3. 在mod的代码中,使用Minecraft Forge提供的事件监听器来检测玩家受伤事件。 4. 在受伤事件发生时,通过Minecraft Forge提供的API将玩家的游戏模式切换到创造模式。 以下是一些示例代码来实现此功能: ```java import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventHandler; @Mod(modid = "mymod", version = "1.0") public class MyMod { @EventHandler public void init(FMLInitializationEvent event) { MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onLivingHurt(LivingHurtEvent event) { if (event.getEntity() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.getEntity(); if (player.getHealth() - event.getAmount() <= 0) { player.setGameType(GameType.CREATIVE); } } } } ``` 上述代码中,我们注册了一个事件监听器来监听实体受伤事件。在事件处理程序中,我们检查实体是否为玩家,并检查玩家是否会在此次伤害事件中死亡。如果是,则将玩家的游戏模式切换到创造模式。请注意,我们使用了Minecraft Forge提供的API来设置玩家的游戏模式。 完成上述步骤后,编译并打包你的mod,然后将它安装到Minecraft游戏中。当你在游戏中受伤时,你的游戏模式将会自动切换到创造模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值