本教程的部分代码和贴图来自kaupenjoe作者。想看外文的可以看原作者。
贴图的使用还请注意原作者的协议。
创建ModItems类

import net.kaupenjoe.tutorialmod.TutorialMod;
import net.minecraft.world.item.Item;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public class ModItems {
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TutorialMod.MOD_ID);
public static final RegistryObject<Item> SAPPHIRE = ITEMS.register("sapphire",
() -> new Item(new Item.Properties()));
public static final RegistryObject<Item> RAW_SAPPHIRE = ITEMS.register("raw_sapphire",
() -> new Item(new Item.Properties()));
public static void register(IEventBus eventBus){
ITEMS.register(eventBus);
}
}
创建创造模式的Tab

import net.kaupenjoe.tutorialmod.TutorialMod;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.RegistryObject;
public class ModCreativeModTabs {
public static final String TUTORIAL_TAB_STRING = "creativetab.tutorial_tab";
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, TutorialMod.MOD_ID);
public static final RegistryObject<CreativeModeTab> TUTORIAL_TAB = CREATIVE_MODE_TABS.register("tutorial_tab",
()-> CreativeModeTab.builder().icon(()->new ItemStack(ModItems.SAPPHIRE.get()))
.title(Component.translatable(TUTORIAL_TAB_STRING))
.displayItems((pParameters, pOutput) -> {
pOutput.accept(ModItems.SAPPHIRE.get());
pOutput.accept(ModItems.RAW_SAPPHIRE.get());
pOutput.accept(Items.DIAMOND);
})
.build());
public static void register(IEventBus eventBus){
CREATIVE_MODE_TABS.register(eventBus);
}
}
在TutorialMod类添加注册

public TutorialMod() {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
ModCreativeModTabs.register(modEventBus);
ModItems.register(modEventBus);
...
}
相关的JSON文件的生成
自己手写JSON文件的话容易出现错误,所以我们这里使用Forge提供的自动生成JSON文件的方法

创建Language类,该类负责生成相应的语言文件
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.moditem.ModCreativeModTabs;
import net.kaupenjoe.tutorialmod.moditem.ModItems;
import net.minecraft.data.PackOutput;
import net.minecraftforge.common.data.LanguageProvider;
public class Language extends LanguageProvider {
public Language(PackOutput output,String locale) {
super(output, TutorialMod.MOD_ID, locale);
}
@Override
protected void addTranslations() {
add(ModItems.SAPPHIRE.get(),"Sapphire");
add(ModItems.RAW_SAPPHIRE.get(),"RawSapphire");
add(ModCreativeModTabs.TUTORIAL_TAB_STRING,"TutorialMod");
}
}
创建ItemModel类,该类负责生成item的model的json
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.moditem.ModItems;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraftforge.client.model.generators.ItemModelProvider;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.registries.ForgeRegistries;
import java.util.Set;
import java.util.stream.Collectors;
public class ItemModes extends ItemModelProvider {
public static final String GENERATED = "item/generated";
public static final String HANDHELD = "item/handheld";
public ItemModes(PackOutput output, ExistingFileHelper existingFileHelper) {
super(output, TutorialMod.MOD_ID, existingFileHelper);
}
@Override
protected void registerModels() {
Set<Item> items = ForgeRegistries.ITEMS.getValues().stream().filter(i -> TutorialMod.MOD_ID.equals(ForgeRegistries.ITEMS.getKey(i).getNamespace()))
.collect(Collectors.toSet());
itemGeneratedModel(ModItems.SAPPHIRE.get(), resourceItem(itemName(ModItems.SAPPHIRE.get())));
items.remove(ModItems.SAPPHIRE.get());
itemGeneratedModel(ModItems.RAW_SAPPHIRE.get(), resourceItem(itemName(ModItems.RAW_SAPPHIRE.get())));
items.remove(ModItems.RAW_SAPPHIRE.get());
}
public void itemGeneratedModel(Item item, ResourceLocation texture) {
withExistingParent(itemName(item), GENERATED).texture("layer0", texture);
}
private String itemName(Item item) {
return ForgeRegistries.ITEMS.getKey(item).getPath();
}
public ResourceLocation resourceBlock(String path) {
return new ResourceLocation(TutorialMod.MOD_ID, "block/" + path);
}
public ResourceLocation resourceItem(String path) {
return new ResourceLocation(TutorialMod.MOD_ID, "item/" + path);
}
}
需要将这里两个类注册的MOD总线上,DataGenerators类
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.PackOutput;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import javax.xml.crypto.Data;
import java.util.concurrent.CompletableFuture;
@Mod.EventBusSubscriber(modid = TutorialMod.MOD_ID,bus=Mod.EventBusSubscriber.Bus.MOD)
public class DataGenerators {
@SubscribeEvent
public static void gatherData(GatherDataEvent event){
DataGenerator generator = event.getGenerator();
PackOutput output = generator.getPackOutput();
CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();
ExistingFileHelper helper = event.getExistingFileHelper();
generator.addProvider(event.includeClient(), new ItemModes(output, helper));
generator.addProvider(event.includeClient(),new Language(output,"en_us"));
}
} 运行 runData生成JSON,不过在这之前还需要将你的贴图放入到相应的位置,毕竟贴图没法生成。


启动游戏即可,看到效果,不需要手动移动到assest文件夹里,在打包时候会自动移动。
以DEBUG启动游戏。

## 测试
可以在游戏中看到效果
