Skip to content

Chapter 7: Custom Machine Upgrades

Machine upgrades can be inserted into the 4 upgrade slots on any IC2 machine to boost its speed, increase its energy buffer, reduce heat in reactors, or upgrade its voltage tier.

IC2 Rebranded provides a fluent builder to create custom upgrades in just a few lines.


1. Creating Upgrades via CONTENT.registerUpgradeItem

Use CONTENT.registerUpgradeItem and configure your upgrade with the fluent builder:

import ic2.api.upgrade.AddonUpgradeItem;
import ic2.api.upgrade.UpgradableProperty;
import net.minecraft.world.item.Item;
import net.neoforged.neoforge.registries.DeferredItem;

// 1. Super Overclock Upgrade: 40% faster (0.6x time), 50% higher power demand
public static final DeferredItem<AddonUpgradeItem> HYPER_OVERCLOCKER =
    MyAddon.CONTENT.registerUpgradeItem(
        "hyper_overclocker",
        new Item.Properties().stacksTo(16),
        builder -> builder
            .suitableFor(UpgradableProperty.Processing)
            .processTimeMultiplier(0.6)
            .energyDemandMultiplier(1.5)
    );

// 2. High-Capacity Energy Buffer Upgrade: Adds +50,000 EU storage per module
public static final DeferredItem<AddonUpgradeItem> DENSE_ENERGY_STORAGE_UPGRADE =
    MyAddon.CONTENT.registerUpgradeItem(
        "dense_energy_storage_upgrade",
        new Item.Properties().stacksTo(16),
        builder -> builder
            .suitableFor(UpgradableProperty.EnergyStorage)
            .extraEnergyStorage(50_000)
    );

// 3. Super Transformer Upgrade: Raises supported input tier by +2
public static final DeferredItem<AddonUpgradeItem> ADVANCED_TRANSFORMER_UPGRADE =
    MyAddon.CONTENT.registerUpgradeItem(
        "advanced_transformer_upgrade",
        new Item.Properties().stacksTo(4),
        builder -> builder
            .suitableFor(UpgradableProperty.Transformer)
            .tierBoost(2)
    );

2. Using Standalone UpgradeDefinition

If you already have your own custom item class and simply want to attach IC2 upgrade behavior to it, create an UpgradeDefinition:

import ic2.api.upgrade.UpgradeDefinition;

// Creates a definition that makes machines 25% faster
UpgradeDefinition speedDef = UpgradeDefinition.speed(0.75, 1.3);

// Creates a definition that adds 10,000 EU storage
UpgradeDefinition energyDef = UpgradeDefinition.energyStorage(10_000);

// Creates a transformer definition (+1 tier)
UpgradeDefinition transformerDef = UpgradeDefinition.transformer(1);

You can then implement IUpgradeItem on your item and delegate directly to your definition:

import ic2.api.upgrade.IUpgradeItem;
import ic2.api.upgrade.UpgradeDefinition;
import net.minecraft.world.item.Item;

public class MyCustomUpgradeItem extends Item implements IUpgradeItem {
    private final UpgradeDefinition definition = UpgradeDefinition.speed(0.7, 1.4);

    public MyCustomUpgradeItem(Properties props) {
        super(props);
    }

    @Override
    public boolean isSuitableFor(ItemStack stack, Set<UpgradableProperty> types) {
        return this.definition.isSuitableFor(types);
    }

    @Override
    public void onTick(ItemStack stack, IUpgradableBlock block) {
        this.definition.onTick(block);
    }

    @Override
    public double getProcessTimeMultiplier(ItemStack stack, IUpgradableBlock block) {
        return this.definition.getProcessTimeMultiplier();
    }

    @Override
    public double getEnergyDemandMultiplier(ItemStack stack, IUpgradableBlock block) {
        return this.definition.getEnergyDemandMultiplier();
    }

    @Override
    public int getExtraEnergyStorage(ItemStack stack, IUpgradableBlock block) {
        return this.definition.getExtraEnergyStorage();
    }

    @Override
    public int getExtraTier(ItemStack stack, IUpgradableBlock block) {
        return this.definition.getTierBoost();
    }
}