tutorial:items
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorial:items [2024/07/03 02:17] – [Adding model and textures] removed the image that mismatches solidblock | tutorial:items [2025/04/01 08:57] (current) – [Adding model, texture and model mapping] solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~REDIRECT> | ||
| + | |||
| ====== Adding an Item ====== | ====== Adding an Item ====== | ||
| Line 5: | Line 7: | ||
| Adding a basic item is one of the first steps in modding. You're going to need to create an ''< | Adding a basic item is one of the first steps in modding. You're going to need to create an ''< | ||
| - | ===== Create an Item instance ===== | + | ===== Create an Item instance |
| + | |||
| + | :!: If you're in version 1.21.2 or above, please directly read [[#Creating Items in 1.21.2+]]. | ||
| First, create an instance of ''< | First, create an instance of ''< | ||
| Line 15: | Line 19: | ||
| // for versions below 1.20.4 | // for versions below 1.20.4 | ||
| public static final class_1792 CUSTOM_ITEM = new class_1792(new FabricItemSettings()); | public static final class_1792 CUSTOM_ITEM = new class_1792(new FabricItemSettings()); | ||
| - | // for versions since 1.20.5 | + | // for versions since 1.20.5, below 1.21.2 |
| public static final class_1792 CUSTOM_ITEM = new class_1792(new class_1792.class_1793()); | public static final class_1792 CUSTOM_ITEM = new class_1792(new class_1792.class_1793()); | ||
| [...] | [...] | ||
| Line 21: | Line 25: | ||
| </ | </ | ||
| - | ===== Register the item ===== | + | ===== Register the item (before 1.21.2) |
| We've create a basic item, but it still does not exist in Minecraft, because it has not been registered. In Minecraft, almost everything has an registry, and items are no exceptions. | We've create a basic item, but it still does not exist in Minecraft, because it has not been registered. In Minecraft, almost everything has an registry, and items are no exceptions. | ||
| - | You'll use the vanilla registry system for registering new content. The basic syntax is ''< | + | You'll use the vanilla registry system for registering new content. The basic syntax is ''< |
| - | For versions since 1.21, an '' | + | For versions since 1.21, an '' |
| < | < | ||
| Line 60: | Line 64: | ||
| </ | </ | ||
| - | ===== Best practice of registering items ===== | + | ===== Best practice of registering items (before 1.21.2) |
| In the code above, you simply created //one// item. However, it is not convenient if you have //many// items in your mod, as you need to register and create an '' | In the code above, you simply created //one// item. However, it is not convenient if you have //many// items in your mod, as you need to register and create an '' | ||
| Line 71: | Line 75: | ||
| | | ||
| // an instance of our new item | // an instance of our new item | ||
| - | public static final class_1792 CUSTOM_ITEM = register(new class_1792(new class_1792.class_1793()), " | + | public static final class_1792 CUSTOM_ITEM = register(" |
| - | public static Item register(Item instance, | + | public static |
| // For versions below 1.21, please replace '' | // For versions below 1.21, please replace '' | ||
| return class_2378.method_10230(class_7923.field_41178, | return class_2378.method_10230(class_7923.field_41178, | ||
| Line 83: | Line 87: | ||
| </ | </ | ||
| - | Remember to refer to some method | + | Remember to refer to some methods or fields in the mods initializer |
| < | < | ||
| public class ExampleMod implements ModInitializer { | public class ExampleMod implements ModInitializer { | ||
| Line 93: | Line 97: | ||
| </ | </ | ||
| - | > **Note:** Some experienced users may decide to use reflection to automatically all static fields of a class. This is also a preferable way, but should be used with caution. | + | > **Note:** Some experienced users may decide to use reflection to automatically |
| - | ===== Adding model and textures | + | |
| + | ===== Creating Items in 1.21.2+ ===== | ||
| + | |||
| + | Since 1.21.2, the item registration is tutally rewrited. You have to store a '' | ||
| + | |||
| + | < | ||
| + | java.lang.NullPointerException: | ||
| + | </ | ||
| + | |||
| + | To make it run correctly, you should write like below: | ||
| + | |||
| + | <code java> | ||
| + | public final class TutorialItems { | ||
| + | private TutorialItems() { | ||
| + | } | ||
| + | |||
| + | public static final Item CUSTOM_ITEM = register(" | ||
| + | |||
| + | public static Item register(String path, Function< | ||
| + | final RegistryKey< | ||
| + | return Items.register(registryKey, | ||
| + | } | ||
| + | |||
| + | public static void initialize() { | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | In the method '' | ||
| + | |||
| + | ===== Adding model, texture | ||
| If you registered your item properly in the first step, you can successfully get your item by typing command ''/ | If you registered your item properly in the first step, you can successfully get your item by typing command ''/ | ||
| Line 100: | Line 134: | ||
| [Server-Worker-1/ | [Server-Worker-1/ | ||
| - | That's because we haven' | + | That's because we haven' |
| * Item model: '' | * Item model: '' | ||
| * Item texture: '' | * Item texture: '' | ||
| + | * Item model definition (since 1.21.4): '' | ||
| Our example texture can be found [[https:// | Our example texture can be found [[https:// | ||
| A basic item model template is: | A basic item model template is: | ||
| - | <code JavaScript> | + | <code JavaScript |
| { | { | ||
| " | " | ||
| Line 117: | Line 152: | ||
| </ | </ | ||
| The '' | The '' | ||
| + | |||
| + | An item model definition is also needed since 1.21.4 (not needed before 1.21.4), of which the content may be: | ||
| + | <code javascript / | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | The item model definition will define the item model that the item uses. | ||
| + | |||
| + | > :!: Creating these files manually for each item can be tiring. You may refer to [[datagen_model]] for data generation. | ||
| ===== Creating an Item class ===== | ===== Creating an Item class ===== | ||
| - | To add additional behavior to the item you will need to create an item class. The default constructor requires an '' | + | You have created a simple |
| < | < | ||
| public class CustomItem extends class_1792 { | public class CustomItem extends class_1792 { | ||
| - | |||
| public CustomItem(class_1793 settings) { | public CustomItem(class_1793 settings) { | ||
| super(settings); | super(settings); | ||
| Line 133: | Line 181: | ||
| < | < | ||
| public class CustomItem extends class_1792 { | public class CustomItem extends class_1792 { | ||
| - | |||
| public CustomItem(class_1793 settings) { | public CustomItem(class_1793 settings) { | ||
| super(settings); | super(settings); | ||
| } | } | ||
| + | // write this if the version is below 1.21.2: | ||
| @Override | @Override | ||
| public class_1271< | public class_1271< | ||
| user.method_5783(class_3417.field_14983, | user.method_5783(class_3417.field_14983, | ||
| return class_1271.method_22427(user.method_5998(hand)); | return class_1271.method_22427(user.method_5998(hand)); | ||
| + | } | ||
| + | | ||
| + | // write this if the version is 1.21.2 or higher: | ||
| + | @Override | ||
| + | public ActionResult use(World world, PlayerEntity user, Hand hand) { | ||
| + | user.playSound(SoundEvents.BLOCK_WOOL_BREAK, | ||
| + | return ActionResult.SUCCESS; | ||
| } | } | ||
| } | } | ||
| Line 149: | Line 204: | ||
| < | < | ||
| public final class TutorialItems { | public final class TutorialItems { | ||
| - | |||
| [...] | [...] | ||
| // an instance of our new item | // an instance of our new item | ||
| - | public static final CustomItem CUSTOM_ITEM = new CustomItem(new class_1792.class_1793()); | + | |
| + | // For versions below 1.21.2: | ||
| + | | ||
| + | |||
| + | // For versions since 1.21.2: | ||
| + | public static final CustomItem CUSTOM_ITEM = register(" | ||
| [...] | [...] | ||
| } | } | ||
| </ | </ | ||
| - | If you did everything correctly, using the item should now play a sound. | + | If you did everything correctly, using the item should now play a sound. You can also [[tooltip|add some tooltips]] for the item based on your item class. |
| - | ===== What if I want to change | + | ===== Item components ===== |
| + | Sometimes you may need to add some default components for the item, such as max stack size or fire durability. This can be done by calling '' | ||
| + | |||
| + | In this example, the item will be unbreakable by default, while hiding tooltips about it. | ||
| + | < | ||
| + | // For versions below 1.21.2: | ||
| + | public static final CustomItem CUSTOM_ITEM | ||
| + | .component(DataComponentTypes.UNBREAKABLE, | ||
| + | |||
| + | // For versions since 1.21.2, before 1.21.4: | ||
| + | public static final Item CUSTOM_ITEM | ||
| + | .component(DataComponentTypes.UNBREAKABLE, | ||
| + | |||
| + | // For versions since 1.21.4: | ||
| + | public static final Item CUSTOM_ITEM | ||
| + | .component(DataComponentTypes.UNBREAKABLE, | ||
| + | </ | ||
| + | |||
| + | Specifically, | ||
| - | For this you would use '' | ||
| < | < | ||
| public class ExampleMod implements ModInitializer { | public class ExampleMod implements ModInitializer { | ||
| - | |||
| // An instance of our new item, where the maximum stack size is 16 | // An instance of our new item, where the maximum stack size is 16 | ||
| - | public static final CustomItem CUSTOM_ITEM = new CustomItem(new class_1792.class_1793().maxCount(16)); | + | |
| + | // For versions below 1.21.2: | ||
| + | | ||
| + | |||
| + | // For versions since 1.21.2: | ||
| + | public static final Item CUSTOM_ITEM = register(" | ||
| [...] | [...] | ||
| } | } | ||
| Line 178: | Line 258: | ||
| [...] | [...] | ||
| | | ||
| + | // For versions below 1.21.2 | ||
| @Override | @Override | ||
| public void onInitialize() { | public void onInitialize() { | ||
| [...] | [...] | ||
| - | FuelRegistry.INSTANCE.add(TutorialItems.CUSTOM_ITEM, | + | FuelRegistry.INSTANCE.add(TutorialItems.CUSTOM_ITEM, |
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | In practice, when you have many items to register, as registering quantities of items may be effort-consuming and messy, you can consider placing | + | However, in practice, when you have many items to register, as registering quantities of items may be effort-consuming and messy, you can consider placing |
| + | |||
| + | In versions below 1.21.2, you need to use Fabric API's '' | ||
| <code java> | <code java> | ||
| public final class TutorialItems { | public final class TutorialItems { | ||
| [...] | [...] | ||
| | | ||
| + | // For versions below 1.21.2 | ||
| public static void registerFuels() { | public static void registerFuels() { | ||
| - | FuelRegistry.INSTANCE.add(CUSTOM_ITEM, | + | FuelRegistry.INSTANCE.add(CUSTOM_ITEM, |
| } | } | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | In versions since 1.21.2, use Fabric API's '' | ||
| + | <code java> | ||
| + | public final class TutorialItems { | ||
| + | [...] | ||
| + | | ||
| + | // For versions since 1.21.2 | ||
| + | public static void registerFuels() { | ||
| + | FuelRegistryEvents.BUILD.register((builder, | ||
| + | // You can add multiple items at once in this lambda. | ||
| + | builder.add(CUSTOM_ITEM, | ||
| + | }); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| And then refer to this method in your '' | And then refer to this method in your '' | ||
| <code java> | <code java> | ||
| Line 210: | Line 310: | ||
| Similarly, you can use a '' | Similarly, you can use a '' | ||
| - | ==== Next Steps ==== | + | ===== Next Steps ===== |
| - | [[tutorial:itemgroup|Add your item to your own ItemGroup]]. | + | Try [[itemgroup|adding |
tutorial/items.1719973041.txt.gz · Last modified: 2024/07/03 02:17 by solidblock