官方文档
NeoForge 有两个事件总线:
MOD 总线(Mod Event Bus):
- 在 @Mod 构造器中获取
- 处理 MOD 生命周期事件
- 注册方式:modEventBus.addListener(this::method)
FORGE 总线(Forge Event Bus):
- 使用 @SubscribeEvent 注解
- 处理游戏运行时事件
@Mod(MyMod.MODID)
public class MyMod {
public MyMod(IEventBus modEventBus) {
modEventBus.addListener(this::commonSetup);
modEventBus.addListener(this::onRegisterItems);
}
private void commonSetup(final FMLCommonSetupEvent event) {
event.enqueueWork(() -> {
LOGGER.info("Common setup 完成");
});
}
private void onRegisterItems(final RegisterEvent event) {
}
}
@Mod.EventBusSubscriber(modid = MyMod.MODID)
public class ModForgeEvents {
@SubscribeEvent
public static void onItemRightClick(PlayerInteractEvent.RightClickItem event) {
ItemStack stack = event.getItemStack();
Player player = event.getEntity();
if (stack.is(ModItems.MAGIC_WAND)) {
event.setCanceled(true);
player.displayClientMessage(
Component.literal("你使用了法杖!"), true);
}
}
@SubscribeEvent
public static void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) {
Player player = event.getEntity();
player.sendSystemMessage(
Component.literal("欢迎来到我的世界!"));
}
@SubscribeEvent
public static void onBlockBreak(BlockEvent.BreakEvent event) {
Player player = event.getPlayer();
BlockState state = event.getState();
if (state.is(ModBlocks.RUBY_BLOCK.get())) {
player.displayClientMessage(
Component.literal("你破坏了红宝石块!"), true);
}
}
}
@Mod.EventBusSubscriber(modid = MyMod.MODID)
public class ModEvents {
@SubscribeEvent
public static void onLivingHurt(LivingHurtEvent event) {
if (event.getEntity() instanceof Player) {
if (event.getSource().isFire()) {
event.setAmount(event.getAmount() * 0.5f);
}
}
}
@SubscribeEvent
public static void onEntitySpawn(EntityJoinLevelEvent event) {
if (event.getEntity() instanceof Creeper creeper) {
creeper.setSize(2);
}
}
}
| 事件 | 说明 |
|---|
PlayerEvent.PlayerLoggedInEvent | 玩家登录 |
PlayerEvent.PlayerLoggedOutEvent | 玩家登出 |
PlayerEvent.PlayerRespawnEvent | 玩家重生 |
PlayerInteractEvent.RightClickBlock | 右键点击方块 |
PlayerInteractEvent.RightClickItem | 右键点击物品 |
PlayerInteractEvent.LeftClickBlock | 左键点击方块 |
AttackEntityEvent | 攻击实体 |
| 事件 | 说明 |
|---|
BlockEvent.BreakEvent | 方块被破坏(可取消) |
BlockEvent.PlaceEvent | 方块被放置 |
BlockEvent.NeighborNotifyEvent | 方块邻居变化 |
BlockEvent.FarmlandTrampleEvent | 耕地被踩踏 |
| 事件 | 说明 |
|---|
LivingHurtEvent | 实体受伤 |
LivingDamageEvent | 实体受到伤害 |
LivingDeathEvent | 实体死亡 |
LivingSpawnEvent | 实体生成 |
EntityJoinLevelEvent | 实体加入世界 |
LivingDropEvent | 实体掉落物品 |
| 事件 | 说明 |
|---|
WorldEvent.Load | 世界加载 |
WorldEvent.Save | 世界保存 |
ExplosionEvent.Start | 爆炸开始(可取消) |
ExplosionEvent.Detonate | 爆炸完成 |
ServerChatEvent | 玩家发送消息 |
@SubscribeEvent(priority = EventPriority.HIGH)
public static void onHighPriority(LivingHurtEvent event) {
}
@SubscribeEvent(priority = EventPriority.NORMAL)
public static void onNormalPriority(LivingHurtEvent event) {
}
@SubscribeEvent(priority = EventPriority.LOW)
public static void onLowPriority(LivingHurtEvent event) {
}
@SubscribeEvent
public static void onExplosion(ExplosionEvent.Start event) {
if (event.getLevel().dimension() == Level.NETHER) {
event.setCanceled(true);
}
}
@SubscribeEvent
public static void onFarmlandTrample(
BlockEvent.FarmlandTrampleEvent event) {
event.setCanceled(true);
}
@Mod.EventBusSubscriber(modid = MyMod.MODID)
public class ModEventHandler {
@SubscribeEvent
public static void onBlockBreak(BlockEvent.BreakEvent event) {
Player player = event.getPlayer();
BlockPos pos = event.getPos();
Level level = (Level) event.getLevel();
if (player.isCreative()) return;
BlockState state = level.getBlockState(pos);
if (state.is(Blocks.IRON_ORE) || state.is(Blocks.DEEPSLATE_IRON_ORE)) {
player.giveExperiencePoints(2);
}
}
@SubscribeEvent
public static void onItemRightClick(PlayerInteractEvent.RightClickItem event) {
ItemStack stack = event.getItemStack();
if (stack.is(ModItems.MAGIC_WAND.get())) {
Player player = event.getEntity();
Level level = event.getLevel();
if (!level.isClientSide) {
Location projectile = new Location(level,
player.getX(), player.getEyeY(), player.getZ());
stack.hurtAndBreak(1, player, EquipmentSlot.MAINHAND);
}
event.setCanceled(true);
}
}
@SubscribeEvent
public static void onPlayerDeath(LivingDeathEvent event) {
if (event.getEntity() instanceof Player) {
}
}
@SubscribeEvent
public static void onCraft(PlayerEvent.ItemCraftedEvent event) {
Player player = event.getEntity();
ItemStack crafted = event.getCrafting();
if (crafted.is(Items.DIAMOND_SWORD)) {
player.sendSystemMessage(
Component.literal("你合成了一把钻石剑!"));
player.giveExperiencePoints(10);
}
}
}
@Mod.EventBusSubscriber(modid = MyMod.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT)
public class ModClientEvents {
@SubscribeEvent
public static void onKeyRegister(RegisterKeyMappingsEvent event) {
event.register(ModKeybinds.OPEN_MENU_KEY);
}
@SubscribeEvent
public static void onRenderLevelStage(RenderLevelStageEvent event) {
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_WEATHER) {
}
}
}