Skip to content

2.x 基础概念

事件和事件总线

Forge通过事件总线来拦截游戏中的事件,然后进行处理。

例如,当玩家右键点击方块时,Forge会拦截这个事件,然后进行处理。

主要的事件总线有两条,一条是Mod事件总线,一条是Forge事件总线。

Mod事件均在软件包net.minecraftforge.client.event中,而Forge事件均在软件包net.minecraftforge.event中。

Mod事件总线

Mod事件总线我们已经见过两次了,一是在注册的时候,二是在引入现有创造模式物品栏的时候,这段代码就是获取了一个Mod事件总线的实例:

注册物品

注册物品的事件比较特殊,在你使用register方法时就自动帮你订阅了这个事件,所以你不需要再手动订阅了。

var bus = FMLJavaModLoadingContext.get().getModEventBus();

然后我们在这条总线上注册了我们的容器:

ITEMS.register(bus);

订阅事件

而其他大多数事件都不能用这种形式进行注册,所以我们需要手动告诉Forge我们要订阅这个事件。

像引入现有创造模式物品栏的时候,我们就是这样做的:

@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = Thirst.MOD_ID)

Forge事件总线

而Forge事件总线我们还没见过,这里先简单说说:

Forge事件总线是一个静态的变量,我们可以通过MinecraftForge.EVENT_BUS来获取这个变量的实例。

也就是说我们注册的时候可以这样写:

MinecraftForge.EVENT_BUS.register(/*Something Registerable*/);

而参数我们应当填进去一个类本身或者类实例,这个类中会有些方法,它们的参数是事件的实例。

然后只要我们对这个方法添加注解@SubscribeEvent,然后添加到时间总线中,这个方法就会在对应的事件发生时被调用。

如果是静态方法,在注册的时候填入的参数是类本身,如果是实例方法,那么就填入类的实例。

和Mod事件总线一样,另外一种方法就是使用注解,只需要把@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = MODID)改成@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, modid = MODID)即可

可能你没听懂,没关系,后面遇到的时候我会给出一个具体的例子说明的,

Block与BlockState

将这两个概念直译过来就是“方块和方块状态”。

其实这个直译的名字相当不错,Block就代表了“这是什么方块”,BlockState就代表了“这个方块现在是什么状态”。

如果你还不能理解,举个简单的例子:

  • 炼药锅是一种Block
  • 炼药锅是否有水就是两种不同的方块状态。

Item与ItemStack

如果你理解栈位这个概念,那么直译过来的名字你应该很快就能理解。

如果你不理解,那么Item代表了“这是什么物体”,ItemStack代表了“这个物品格里面的物品是怎样的”

  • 钻石是一种Item
  • 64个钻石是某个物品栏的某格里的内容的ItemStack