物品登记

注册项是从 main mod 类完成的,或者是在 preInit 期间从 main mod 类调用的 ModItems 类方法。

Item item = new CustomItem();
string registryname = "my_item";
item.setRegistryName(registryname);
item.setUnlocalizedName(item.getRegistryName().toString());
GameRegistry.register(item);

使用 item.setUnlocalizedName(item.getRegistryName().toString()); 也有一个重要原因! 它确保你的项目的未本地化名称包含 mod ID,以避免 mod 之间的语言文件冲突。

现在这个项目也需要一个模型,这就是 1.7.10 之后的事情变得困难的地方,这只涉及告诉 Minecraft 要加载的纹理的名称,并且可以在项目的构造函数中指定。

final ModelResourceLocation fullModelLocation = new ModelResourceLocation(item.getRegistryName().toString(), "inventory");
ModelBakery.registerItemVariants(item, fullModelLocation);
ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition()
    {
        public ModelResourceLocation getModelLocation(ItemStack stack)
        {
            return fullModelLocation;
        }
    });

请注意,此部分必须仅位于客户端(即客户端代理),因为专用服务器上不存在许多引用的类。

注册具有变体的项目,例如树苗,必须使用 ModelLoader.setCustomModelResourceLocation(item, metadata, resourceLocation) 以不同的方式完成,尽管它允许我们使用 Blockstate 文件来指定我们的变体(这备选方案受欢迎 )。我们的项目不使用变体,所以我们已经完成了。