@Mod("trajanstanks") public class TankMod { public static final SimpleChannel NETWORK_INSTANCE = NetworkRegistry.newSimpleChannel( new ResourceLocation("trajanstanks", "main"), () -> "1", "1"::equals, "1"::equals ); public static final String MOD_ID = "trajanstanks"; // Directly reference a log4j logger. private static final Logger LOGGER = LogManager.getLogger(); public TankMod() { ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, TankModConfig.SPEC, "trajanstanks-config.toml"); NETWORK_INSTANCE.registerMessage(0, TankInputMessage.class, TankInputMessage::writePacketData, TankInputMessage::new, (packet, ctx) -> { ctx.get().setPacketHandled(true); packet.handle(packet, null); } ); NETWORK_INSTANCE.registerMessage(1, ArtilleryInputMessage.class, ArtilleryInputMessage::writePacketData, ArtilleryInputMessage::new, (packet, ctx) -> { ctx.get().setPacketHandled(true); packet.handle(packet, null); } ); NETWORK_INSTANCE.registerMessage(2, HeavyInputMessage.class, HeavyInputMessage::writePacketData, HeavyInputMessage::new, (packet, ctx) -> { ctx.get().setPacketHandled(true); packet.handle(packet, null); } ); GeckoLib.initialize(); // Register the setup method for modloading IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); eventBus.addListener(this::setup); // Register the enqueueIMC method for modloading eventBus.addListener(this::enqueueIMC); // Register the processIMC method for modloading eventBus.addListener(this::processIMC); eventBus.addListener(this::commonSetup); // Register the doClientStuff method for modloading TankModItems.register(eventBus); TankModEntityTypes.register(eventBus); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); TankNetwork.init(); } public void commonSetup(final FMLCommonSetupEvent event) { TankNetwork.init(); } private void setup(final FMLCommonSetupEvent event) { // some preinit code LOGGER.info("HELLO FROM PREINIT"); LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); } private void enqueueIMC(final InterModEnqueueEvent event) { // some example code to dispatch IMC to another mod InterModComms.sendTo("examplemod", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world"; }); } private void processIMC(final InterModProcessEvent event) { // some example code to receive and process InterModComms from other mods LOGGER.info("Got IMC {}", event.getIMCStream(). map(m -> m.getMessageSupplier().get()). collect(Collectors.toList())); } // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { // do something when the server starts LOGGER.info("HELLO from server starting"); } // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onBlocksRegistry(final RegistryEvent.Register blockRegistryEvent) { // register a new block here LOGGER.info("HELLO from Register Block"); } @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void registerRenderers(final FMLClientSetupEvent event) { Minecraft minecraftClient = Minecraft.getInstance(); EntityRenderers.register(TankModEntityTypes.ARTILLERY_ENTITY_TYPE.get(), ArtilleryEntityRenderer::new); EntityRenderers.register(TankModEntityTypes.TANK_ENTITY_TYPE.get(), TankEntityRenderer::new); EntityRenderers.register(TankModEntityTypes.SHELL.get(), ThrownItemRenderer::new); EntityRenderers.register(TankModEntityTypes.ARTILLERY_SHELL.get(), ThrownItemRenderer::new); EntityRenderers.register(TankModEntityTypes.HEAVY_TANK_ENTITY_TYPE.get(), HeavyTankRenderer::new); // event.registerEntityRenderer(TankModEntityTypes.SHELL.get(), ThrownItemRenderer::new<>(entityRendererManager, minecraftClient.getItemRenderer())); } } }