多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# :-: 自定义事件 我们在`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!直接让你双手空空。