# :-: 自定義事件
我們在`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!直接讓你雙手空空。