Complete Example Add-on Mod¶
Here is a complete, copy-pasteable reference add-on mod demonstrating the entire IC2 Rebranded add-on lifecycle:
- Content registration with Ic2AddonContent
- Wrenchable Generator block with active lighting
- Wrenchable Processing Machine block
- Electric Tool (Wrench)
- Custom Machine Upgrade
- Industrial Material Set (Ingot, Dust, Plate)
- Dedicated Creative Mode Tab
- Forge Energy (FE) capability registration
ExampleAddonMod.java¶
package com.example.myaddon;
import ic2.api.block.AddonEnergyBlock;
import ic2.api.block.AddonWrenchableBlock;
import ic2.api.item.AddonElectricTool;
import ic2.api.registry.AddonEnergyCapabilities;
import ic2.api.registry.AddonMaterialSet;
import ic2.api.registry.Ic2AddonContent;
import ic2.api.upgrade.AddonUpgradeItem;
import ic2.api.upgrade.UpgradableProperty;
import ic2.core.block.tileentity.Ic2TileEntityBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.registries.DeferredBlock;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredItem;
@Mod(ExampleAddonMod.MOD_ID)
public final class ExampleAddonMod {
public static final String MOD_ID = "example_ic2_addon";
// 1. Central registration manager
public static final Ic2AddonContent CONTENT = Ic2AddonContent.create(MOD_ID);
// 2. Wrenchable Generator with Active Dynamic Lighting
public static final DeferredBlock<AddonWrenchableBlock> GENERATOR_BLOCK =
CONTENT.registerWrenchableBlock(
"bio_generator",
BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK)
.lightLevel(AddonEnergyBlock.litWhenActive(Ic2TileEntityBlock.ACTIVE, 13)),
ExampleAddonMod::createGenerator
);
public static final DeferredItem<net.minecraft.world.item.BlockItem> GENERATOR_ITEM =
CONTENT.registerBlockItem("bio_generator", GENERATOR_BLOCK);
public static final DeferredHolder<BlockEntityType<?>, BlockEntityType<ExampleGeneratorBlockEntity>>
GENERATOR_BE = CONTENT.registerBlockEntityType(
"bio_generator", ExampleAddonMod::createGenerator, GENERATOR_BLOCK
);
// 3. Wrenchable Processing Machine
public static final DeferredBlock<AddonWrenchableBlock> MACHINE_BLOCK =
CONTENT.registerWrenchableBlock(
"alloy_smelter",
BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK),
ExampleAddonMod::createMachine
);
public static final DeferredItem<net.minecraft.world.item.BlockItem> MACHINE_ITEM =
CONTENT.registerBlockItem("alloy_smelter", MACHINE_BLOCK);
public static final DeferredHolder<BlockEntityType<?>, BlockEntityType<ExampleMachineBlockEntity>>
MACHINE_BE = CONTENT.registerBlockEntityType(
"alloy_smelter", ExampleAddonMod::createMachine, MACHINE_BLOCK
);
// 4. Electric Tool (10k EU capacity, 100 EU/t transfer, Tier 1, 50 EU per use)
public static final DeferredItem<AddonElectricTool> ELECTRIC_WRENCH =
CONTENT.registerElectricTool(
"electric_wrench",
new Item.Properties().stacksTo(1),
10_000.0,
100.0,
1,
50.0
);
// 5. Custom Machine Upgrade: 30% faster (0.7x time), 20% more power demand
public static final DeferredItem<AddonUpgradeItem> SPEED_UPGRADE =
CONTENT.registerUpgradeItem(
"super_speed_upgrade",
new Item.Properties().stacksTo(16),
builder -> builder
.suitableFor(UpgradableProperty.Processing)
.processTimeMultiplier(0.7)
.energyDemandMultiplier(1.2)
);
// 6. Complete Material Set (Ingot, Dust, Plate)
public static final AddonMaterialSet TITANIUM =
AddonMaterialSet.builder(CONTENT, "titanium")
.itemForm("ingot")
.itemForm("dust")
.itemForm("plate")
.build();
// 7. Creative Mode Tab
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> TAB =
CONTENT.registerCreativeModeTab(
"main",
() -> new ItemStack(MACHINE_ITEM.get()),
ExampleAddonMod::fillTab
);
// 8. Mod Constructor
public ExampleAddonMod(IEventBus modEventBus) {
// Register all content to NeoForge with 1 line
CONTENT.register(modEventBus);
// Register FE capabilities for machines & generators
modEventBus.addListener(this::registerCapabilities);
}
private static ExampleGeneratorBlockEntity createGenerator(BlockPos pos, BlockState state) {
return new ExampleGeneratorBlockEntity(GENERATOR_BE.get(), pos, state);
}
private static ExampleMachineBlockEntity createMachine(BlockPos pos, BlockState state) {
return new ExampleMachineBlockEntity(MACHINE_BE.get(), pos, state);
}
private static void fillTab(CreativeModeTab.ItemDisplayParameters params, CreativeModeTab.Output output) {
output.accept(GENERATOR_ITEM.get());
output.accept(MACHINE_ITEM.get());
output.accept(ELECTRIC_WRENCH.get());
output.accept(SPEED_UPGRADE.get());
output.accept(TITANIUM.getItem("ingot"));
output.accept(TITANIUM.getItem("dust"));
output.accept(TITANIUM.getItem("plate"));
}
private void registerCapabilities(RegisterCapabilitiesEvent event) {
// Expose Forge Energy (FE) to other mods: 1 EU = 2 FE
AddonEnergyCapabilities.registerEnergyStorage(event, GENERATOR_BE.get());
AddonEnergyCapabilities.registerEnergyStorage(event, MACHINE_BE.get());
}
}