MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.21.1模组开发教程/5.1.第一个物品:修订间差异

来自MCBBS Wiki
跳到导航 跳到搜索
 
(未显示同一用户的1个中间版本)
第50行: 第50行:
     @Override
     @Override
     protected void registerModels() {
     protected void registerModels() {
         basicItem(ModItems.EXAMPLE_ITEM.get());
         basicItem(ModItems.ONE_EXAMPLE_ITEM.get());
         //最简单的一个物品模型。
         //最简单的一个物品模型。
         withExistingParent(ModItems.ANOTHER_EXAMPLE_ITEM.getId().toString(), mcLoc("item/generated"))
         withExistingParent(ModItems.ANOTHER_EXAMPLE_ITEM.getId().toString(), mcLoc("item/generated"))
第88行: 第88行:
     @Override
     @Override
     protected void addTranslations() {
     protected void addTranslations() {
         addItem(ModItems.EXAMPLE_ITEM, "Example Item");
         addItem(ModItems.ONE_EXAMPLE_ITEM, "One Example Item");
         //添加某物品的本地化名。
         //添加某物品的本地化名。
         //还有其他一些辅助方法,如addBlock、addDimension之类的。
         //还有其他一些辅助方法,如addBlock、addDimension之类的。
第94行: 第94行:
     }
     }
  }
  }
中文语言文件的LanguageProvider类似,这里就不贴代码了。


最后不要忘了在GatherDataEvent监听器中添加你的LanguageProvider!
最后不要忘了在GatherDataEvent监听器中添加你的LanguageProvider!

2025年9月7日 (日) 18:12的最新版本

为模组添加新物品可以说是Modder最常见也是最简单的需求了。对于没有什么额外行为的物品,直接用Item类即可;如果需要有额外的逻辑,则需要先继承Item类,并覆写相应的方法。读者可以自行翻阅Item和IItemExtension的源码。

Item的构造方法接受一个Item.Properties,这个对象指定了物品的一些基本属性,如最大堆叠数、耐久值等等。

注册物品当然是用延迟注册机制:

public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(TutorialMod.MODID);

//一个最简单的物品注册。
//这个物品的注册名是<modid>:one_example_item。
public static final DeferredItem<Item> ONE_EXAMPLE_ITEM = ITEMS.registerSimpleItem("one_example_item");

//registerSimpleItem的另一个重载,第2个参数传入该物品的属性。
public static final DeferredItem<Item> ANOTHER_EXAMPLE_ITEM = ITEMS.registerSimpleItem("another_example_item", new Item.Properties(). ...);

//对于复杂的物品(表现为先继承Item类再实例化),调用registerItem。
public static final DeferredItem<ItemSubClass> ONE_SUBCLASS_ITEM = ITEMS.registerItem("one_subclass_item", ItemSubClass::new, new Item.Properties(). ...);

//别忘了在你的入口类构造方法中调用它!
public static void register(IEventBus bus) {
   ITEMS.register(bus);
}

运行runClient进入游戏,用/give命令就可以得到你注册进游戏的物品了。

模型文件和纹理

为了让我们的物品的外观不是紫黑块,我们需要给物品指定模型文件和纹理。

物品的模型文件位于路径assets/<modid>/models/item下,新建一个名为你的物品的注册名的path的JSON文件(如对示例代码中的ONE_EXAMPLE_ITEM而言,模型文件名就是one_example_item.json)。物品模型文件的格式在中文 Minecraft Wiki上有详尽的说明,这里只做简要示例:

{
   "parent": "minecraft:item/generated",
   "textures": {
       "layer0": "tutorialmod:item/one_example_item"
   }
}

parent父模型我们设定为minecraft:item/generated,这是物品的通用父模型;再在textures下指定该物品模型的第0层纹理为assets/<modid>/textures/item/<your_item_name>.png

将准备好的纹理PNG文件放入指定的位置,runClient打开游戏,你应该能看到你的新物品不是紫黑块了。

数据生成

物品模型的对应的DataProvider实现类是ItemModelProvider,其提供了一些辅助方法来简化物品模型的datagen。

public class MyItemModelProvider extends ItemModelProvider {
   public MyItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) {
       super(output, TutorialMod.MODID, existingFileHelper);
   }

   @Override
   protected void registerModels() {
       basicItem(ModItems.ONE_EXAMPLE_ITEM.get());
       //最简单的一个物品模型。
       withExistingParent(ModItems.ANOTHER_EXAMPLE_ITEM.getId().toString(), mcLoc("item/generated"))
               .texture("layer0", ResourceLocation.fromNamespaceAndPath(...))
       //通用的datagen代码,可以通过继续调用#texture增加更多层的纹理。
   }
}

简单的物品模型可以这样datagen出来。至于复杂的物品模型(如涉及到不同视角的自定义变换),一般是通过Blockbench做出来的,能直接导出为JSON文件,因此一般不通过datagen生成(虽然也确实可以)。

语言文件

你可能会注意到你的物品的名称是类似于item.<modid>.xxx这种形式,这是物品的本地化键名,代表我们还没有对物品进行本地化。

语言文件在assets/<modid>/lang下,也是JSON文件,我们先创建英文语言文件: en_us.json:

{
   "item.tutorialmod.one_example_item": "One Example Item"
}

英文语言文件在其他语言文件缺失时会被使用,就以本系列教程的受众来说,我们还应该添加简体中文(zh_cn.json)的语言文件:

{
   "item.tutorialmod.one_example_item": "一个示例物品"
}

好了,现在这个物品看上去真的没什么问题了。

数据生成

public class ENLanguageProvider extends LanguageProvider {

   public ENLanguageProvider(PackOutput output) {
       super(output, TutorialMod.MODID, "en_us");
       //第二个参数是你的MODID,第三个参数是生成的语言文件的对应语言的代码。
   }

   @Override
   protected void addTranslations() {
       addItem(ModItems.ONE_EXAMPLE_ITEM, "One Example Item");
       //添加某物品的本地化名。
       //还有其他一些辅助方法,如addBlock、addDimension之类的。
       //还可以直接调用add方法,用于自定义本地化键名的本地化。
   }
}

中文语言文件的LanguageProvider类似,这里就不贴代码了。

最后不要忘了在GatherDataEvent监听器中添加你的LanguageProvider!