// 26.1.2: @EventBusSubscriber 에는 modid 만 지정한다.// bus 속성과 Bus enum 은 삭제됐고, 핸들러가 어느 버스로 갈지는// 이벤트 타입(@SubscribeEvent 파라미터)을 보고 자동으로 판별된다.@EventBusSubscriber(modid = ExampleMod.MOD_ID)public class ModEventHandlers { // RegisterEvent 는 Mod 버스 이벤트 → 자동으로 Mod 버스에 등록 @SubscribeEvent public static void onRegister(RegisterEvent event) { // 레지스트리 등록 }}// 런타임 이벤트도 동일하게 modid 만 지정한다.@EventBusSubscriber(modid = ExampleMod.MOD_ID)public class GameEventHandlers { // LivingHurtEvent 는 런타임 이벤트 → 자동으로 NeoForge 버스에 등록 @SubscribeEvent public static void onLivingHurt(LivingHurtEvent event) { // 엔티티 데미지 처리 }}
가장 확실한 판단 기준: 이벤트 클래스가 net.neoforged.fml.event.IModBusEvent를 구현하는지 봅니다. 구현하면 Mod 버스 이벤트, 구현하지 않으면 NeoForge(게임) 버스 이벤트입니다. NeoForge의 모든 Mod 버스 이벤트는 이 마커 인터페이스를 구현하며, @EventBusSubscriber의 버스 자동 판별도 바로 이 인터페이스를 기준으로 동작합니다. IDE에서 이벤트 클래스를 열어 상속 계층에 IModBusEvent가 있는지만 확인하면 됩니다.
// ❌ ServerStartingEvent를 modEventBus에 등록 → 절대 호출 안 됨modEventBus.addListener(this::onServerStarting);// ✅ NeoForge.EVENT_BUS 사용NeoForge.EVENT_BUS.addListener(this::onServerStarting);
두 방향의 실패 양상이 다릅니다.
런타임 이벤트를 Mod 버스에 등록(위 예시) → 그 이벤트는 Mod 버스에서 post()되지 않으므로 핸들러가 호출되지 않습니다. 뚜렷한 에러 없이 조용히 넘어갈 수 있으니, 핸들러가 동작하지 않으면 가장 먼저 버스를 의심하세요.
Mod 버스 이벤트(IModBusEvent)를 게임 버스(NeoForge.EVENT_BUS)에 등록 → NeoForge가 등록을 거부하며 예외를 던집니다: IModBusEvent events are not allowed on the common NeoForge bus! Use a mod bus instead.
어느 쪽이든 사전 예방책은 같습니다 — 이벤트가 IModBusEvent를 구현하는지부터 확인하세요.
같은 핸들러를 양쪽 버스에 모두 등록하는 것도 금지입니다. 이중 호출이 발생해 예측 불가능한 동작을 만듭니다.
// ❌ 이중 등록 — 절대 하지 말 것modEventBus.addListener(this::onSomeEvent);NeoForge.EVENT_BUS.addListener(this::onSomeEvent);