MultiLoader 1.21+ · Part 3

Creating Items (MultiLoader 1.21+)

BEGINNER MULTILOADER 1.21-1.21.1 18 min read · May 24, 2026
MultiLoader 1.21+ · 28 parts
1 Getting Started with MultiLoader 1.21+ 2 Setting Up RegistrationUtils 3 Creating Items (MultiLoader 1.21+) 4 Creating Blocks (MultiLoader 1.21+) 5 Data Generation: Block & Item Models (MultiLoader 1.21+) 6 Data Generation: Block Loot Tables (MultiLoader 1.21+) 7 Data Generation: Crafting Recipes (MultiLoader 1.21+) 8 Data Generation: Block & Item Tags (MultiLoader 1.21+) 9 Custom Food Items (MultiLoader 1.21+) 10 Custom Tools (MultiLoader 1.21+) 11 Custom Armour (MultiLoader 1.21+) 12 Block Entities (MultiLoader 1.21+) 13 Config Files (MultiLoader 1.21+) 14 Custom Sounds (MultiLoader 1.21+) 15 Events and Listeners (MultiLoader 1.21+) 16 Networking and Custom Packets (MultiLoader 1.21+) 17 Data Generation: Advancements (MultiLoader 1.21+) 18 Data Generation: Language Files (MultiLoader 1.21+) 19 Custom Entities (MultiLoader 1.21+) 20 Ore Generation (MultiLoader 1.21+) 21 Introduction to Mixins (MultiLoader 1.21+) 22 Custom Particles (MultiLoader 1.21+) 23 Menus & Screens (MultiLoader 1.21+) 24 Key Bindings (MultiLoader 1.21+) 25 Custom Potion Effects (MultiLoader 1.21+) 26 Custom Enchantments (MultiLoader 1.21+) 27 Custom Commands (MultiLoader 1.21+) 28 Custom Biomes (MultiLoader 1.21+)

Creating new items is one of the key starting points for most mods. In this tutorial we will create a basic item with a model and texture, add it to a custom creative tab, and give it a display name, all from the shared common module.

NOTE
Make sure you have completed the Setting Up RegistrationUtils tutorial before continuing. We rely on RegistrationProvider throughout this guide.

Creating the Item Registry

Create a new class called ItemRegistry inside a registry package in your common project. The full class path will look something like com.example.examplemod.registry.ItemRegistry.

Inside the class, define an empty public static void init() method. We will call this later from CommonClass to ensure the class is loaded and all items registered at the right time. Then declare a RegistrationProvider for the item registry:

java
public class ItemRegistry {
public static final RegistrationProvider<Item> ITEMS =
RegistrationProvider.get(Registries.ITEM, Constants.MOD_ID);
public static Item.Properties getItemProperties() {
return new Item.Properties();
}
public static void init() {}
}

The getItemProperties() helper returns a fresh Item.Properties instance. You can expand this method later to apply common defaults (e.g. stack size, rarity) that should apply to all your mod's items.

Registering an Item

Add a public static final field for your first item. For this tutorial we will create a simple item called Iron Stick:

java
public static final RegistryObject<Item, Item> IRON_STICK = ITEMS.register("iron_stick",
() -> new Item(getItemProperties()));

Next, call ItemRegistry.init() from your CommonClass so the field is resolved when the mod initialises:

java
public class CommonClass {
public static void init() {
ItemRegistry.init();
}
}

Item Model and Texture

Create the item model JSON in your common project under src/main/resources/assets/examplemod/models/item/iron_stick.json:

json
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "examplemod:item/iron_stick"
}
}

The item/generated parent is the standard flat 2D item model. The layer0 texture key points to your texture file.

Next, create a 16×16 PNG texture and save it at src/main/resources/assets/examplemod/textures/item/iron_stick.png. Replaceexamplemod throughout with your own mod ID if you changed it.

TIP
You can use any image editor that exports PNG at 16×16. The Minecraft texture format does not require a specific colour depth, but keeping it at 32-bit RGBA works reliably across all platforms.

Language File

Create (or open) the English language file at src/main/resources/assets/examplemod/lang/en_us.json and add a display name for your item:

json
{
"item.examplemod.iron_stick": "Iron Stick"
}

For any further entries you add to this file, remember to place a comma after each entry except the last. To support other languages, copy this file and rename it with the appropriate Minecraft language code.

Adding a Creative Tab

Rather than cluttering ItemRegistry, create a dedicated CreativeTabRegistry class in the same package:

java
public class CreativeTabRegistry {
public static final RegistrationProvider<CreativeModeTab> CREATIVE_MODE_TABS =
RegistrationProvider.get(Registries.CREATIVE_MODE_TAB, Constants.MOD_ID);
public static final RegistryObject<CreativeModeTab> TAB =
CREATIVE_MODE_TABS.register(Constants.MOD_ID + "_tab", () ->
CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0)
.icon(() -> new ItemStack(ItemRegistry.IRON_STICK.get()))
.displayItems((params, output) -> {
output.accept(ItemRegistry.IRON_STICK.get());
})
.title(Component.translatable("itemGroup." + Constants.MOD_ID + ".tab"))
.build()
);
public static void init() {}
}

Call CreativeTabRegistry.init() from CommonClass.init() alongside your item registry call. Then add the tab's translation key to your language file:

json
{
"item.examplemod.iron_stick": "Iron Stick",
"itemGroup.examplemod.tab": "Example Mod Items"
}

Testing In-Game

Run either the Fabric Client or NeoForge Client run configuration. Open creative mode, find your new tab, and check that your Iron Stick appears. You can also use the give command to test it directly:

shell
/give @s examplemod:iron_stick

You can find the source for this tutorial here:

View Source on GitHub
NEXT IN SERIES

Creating Blocks (MultiLoader 1.21+)

Create a BlockRegistry with registerBlock helpers that auto-register a BlockItem, define a custom block using vanilla property copying, set up block models, textures, blockstates, and a creative tab.

Continue →