Minecraft 1.16.5mod开发 (2.总线概念和第一个物品)

总线

        在编写代码之前,介绍一下事件系统。

所谓事件就是我们游戏中所作出的动作、附魔、达成条件替换、特殊效果等一系列都属于事件,但是我们所编写的事件系统不是Minecraft自带的,是Forge实现的。

如果要详细了解可以查看Boson 1.16其中还牵扯总线的概念与事件处理器。

在编写事件时有两种方式 一种是实例方式,一种是静态的方式。

public class MyForgeEventHandler {
    @SubscribeEvent
    public void pickupItem(EntityItemPickupEvent event) {
        System.out.println("666!");
    }
}

@SubscribeEvent注解,这个注解的作用就是标记下方的pickupItem 方法是一个事件处理器

所监听的事件是由其中的参数控制

EntityItemPickupEvent,说明监听的是实体捡起物品这个事件。

当然写完只会还需要注册到总线中(Forge总线和Mod总线)

Forge总线负责的就是除了生命周期事件外的所有事件

命令:MinecraftForge.EVENT_BUS.register()

Mod总线主要负责游戏的生命周期事件,也就是初始化过程的事件

命令:FMLJavaModLoadingContext.get().getModEventBus().register()

所以这个例子我们就要注册到Forge总线中(可以在初始建立的java类中写入,直接当成所有总线的类)

FMLJavaModLoadingContext.get().getModEventBus().register()

如果都采取实例方法的注册会变得非常麻烦,这时就可以使用Forge提供的静态方法

在类上加入

@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)注解

其中最后的MOD为Mod总线 Forge为Forge总线。

题外话:我们可以把modid封装在使用时直接调用

@Mod(类名.MODID)
public class 类名{
    public static final String MODID = "自己的MODID";
}

将自己的modid封装一下在调用的时候直接调用类

物品

        明确具体步骤 创建自己物品的类继承原版中的物品--》》实例化物品--》》注册物品

1.首先创建两个平级的包 存放我们的物品等和总线各种实例化(名字看自己)

这里就用我自己的来进行介绍    在common中再次创建item包存放我们所有item类后创建咱们的一个物品类并且让这个类继承原版的Item

public class testItem extends Item {
    public testItem(Properties p_i48487_1_) {
        super(p_i48487_1_);
    }
}

非常EZ,然后我们要重写一下这个构造方法(也可以在实例时写入属于的位置和属性)

public class testItem extends Item {
    public testItem() {
        super(new Properties().group(ItemGroup.MATERIALS));
    }
}

 其中Properties方法就是确定这个物品的属性和属于创造中的哪一个物品栏(MATERIALS就是杂物的意思)

之后,我们去实例和注册这个物品

在core包中 建立init包存放我们的注册和实例 建立ItemInit类

public class ItemInit {
    //注册对象
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, BlitzMod.MODID);
    public static final RegistryObject<testItem> TEST_ITEM = ITEMS.register("test_item", testItem::new);
}

第一句就是注册我们这个类中的全部内容

DeferredRegister<Item>这个泛型表明我们需要注册的东西是物品

DeferredRegister.create(ForgeRegistries.ITEMS, BlitzMod.MOD_ID)创建了一个实例,这个类里有两个参数ForgeRegistries.ITEMS代表了我们要注册的是物品,第二个参数填入的应该是你的modId

第二句就是实例化我们的物品

也是通过RegistryObject<testItem>泛型 其中存放我们的物品 其中参数第一个为【注册名】,第二个为【注册对象的实例】 具体为什么只能用小写看文献就对了^^具体我也不清楚。

这样我们就完成了实例和注册,就差最后的实现声明。

上文提到过注册总线 我们已经将实例与注册准备好接下来就是将它放入我们的MOD总线中

public BlitzMod(){
    ItemInit.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
}

(写到Mod注解下类的实例方法中)。

此时我们开启游戏