# :-: 自定义事件
我们在`EventLoader`类中新建一个我们想要的事件类。
`src/main/java/net/xiaobang/bm/common/EventLoader.java`(部分)
~~~
@Cancelable
public static class PlayerRightClickRainBowBlockEvent extends net.minecraftforge.event.entity.player;.PlayerEvent
{
public final int x;
public final int y;
public final int z;
public final World world;
public PlayerRightClickRainBowBlockEvent(EntityPlayer player, int x, int y, int z, World world)
{
super(player);
this.x = x;
this.y = y;
this.z = z;
this.world = world;
}
}
~~~
很明显,这个类和玩家右键彩虹方块相关。该事件类继承了`PlayerEvent`,`@Cancelable`注解表明了该事件可取消。
## 自定义事件的注册机制
在上一部分,我们注意到`FMLCommonHandler.instance().bus()`和`MinecraftForge.EVENT_BUS`均为`EventBus`类型。该类型提供了名为`register`的方法使得事件可以被注册。
显然,我们自己也可以创建这样一个`EventBus`,并且使得所有自定义的事件在这里被注册。
`src/main/java/net/xiaobang/bm/common/EventLoader.java`**(部分)**
`public static final EventBus EVENT_BUS = new EventBus();`
## 使自定义事件会被触发到
`EventBus`本身提供了一个名为`post`的方法,负责执行事件。大家如果经常翻源代码的话,会在Minecraft的许多类中找到这个方法的调用。这里我们希望在玩家点击草块时触发,我们也如法炮制。
`src/main/java/net/xiaobang/bm/block/BlockRainBow.java`**(部分)**
~~~
public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY,float subZ){
EventHandler.PlayerRightClickRainBowBlockEvent event = EventHandler.PlayerRightClickRainBowBlockEvent(player,x,y,z,worldIn);
EventHandler.EVENT_BUS.post(event);
if (!event.isCanceled() && !worldIn.isRemote)
{
worldIn.setBlockToAir(x,y,z);//设置xyz位置的方块为空气。
return true;
}
return false;
}
~~~
这段代码的意思是:如果事件被取消,那么阻止彩虹方块变成空气,否则彩虹方块变成空气。
## 自定义事件的实现
自定义事件的实现和Forge提供的完全一样,只不过我们要找准在哪里注册。
在`EventLoader`类中添加一个方法。
`src/main/java/net/xiaobang/bm/common/EventLoader.java`**(部分)**
~~~
@SubscribeEvent
public void onPlayerRightClickRainBowBlock(PlayerRightClickRainBowBlockEvent event)
{
if (!event.world.isRemote)
{
Entity tnt = new EntityTNTPrimed(event.world, event.x + 0.5, event.y + 0.5, event.z + 0.5, null);//实例化炸弹实体
event.world.spawnEntityInWorld(tnt);//生成炸弹,让玩家Boom!嘿嘿嘿
}
}
~~~
最后我们注册这个事件:
`src/main/java/net/xiaobang/bm/common/EventLoader.java`**(部分)**
~~~
public EventLoader()
{
MinecraftForge.EVENT_BUS.register(this);
EventLoader.EVENT_BUS.register(this);
}
~~~
现在打开游戏,拿出一个彩虹方块,并右键它,一,二,三.......Duang!直接让你双手空空。