我的世界·1.20.1·forge Mod教程·ep2·添加物品和添加创造物品栏
Flandre芙兰
编辑于 2023年07月23日 03:03
收录于文集
共6篇

本教程的部分代码和贴图来自kaupenjoe作者。想看外文的可以看原作者。

贴图的使用还请注意原作者的协议。


创建ModItems类

代码块
JavaScript
自动换行
复制代码
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

代码块
JavaScript
自动换行
复制代码

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类添加注册

代码块
JavaScript
自动换行
复制代码
   public TutorialMod() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();

        ModCreativeModTabs.register(modEventBus);
        ModItems.register(modEventBus);
	...
    }
复制成功


相关的JSON文件的生成

自己手写JSON文件的话容易出现错误,所以我们这里使用Forge提供的自动生成JSON文件的方法

创建Language类,该类负责生成相应的语言文件

代码块
JavaScript
自动换行
复制代码

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

代码块
JavaScript
自动换行
复制代码


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类

代码块
JavaScript
自动换行
复制代码

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启动游戏。


## 测试

可以在游戏中看到效果