我正在为我的世界创建一个mod并创建了一个元数据项,它具有三个变体(默认值1和2)。
当我试图用item:0或什么都不给我的玩家时,我得到了这个物品,它的id只是不带:number的物品,但是当我给item:1时,给定的物品会叠加到物品上: 0。当我从库存中抛出item:0时,item:1成功地提供了自定义纹理,但其id是item,而不是item:1
这是我的带有变体代码的项目:
public Trowel(String name, CreativeTabs tab) {
super(name, tab);
this.tab = tab;
}
public void getSubItems(Item item, CreativeTabs tabs, List<ItemStack> list) {
for(int i = 0; i < EnumTrowel.count(); i++) {
list.add(new ItemStack(item, 1, i));
}
}
@Override
public String getUnlocalizedName(ItemStack stack) {
for(int i = 0; i < EnumTrowel.count(); i++) {
if(stack.getItemDamage() == i) {
return this.getUnlocalizedName() + "_" + EnumTrowel.values()[i].getName();
} else {
continue;
}
}
return this.getUnlocalizedName() + "_" + EnumTrowel.CLEAR.getName();
}
这是我的主类preInit()
public static void preInit(FMLPreInitializationEvent event) {
proxy.registerModelBakeryStuff();
RegistryHandler.registerCustomMeshesAndStates();
RegistryHandler.registerFluid(concrete);
for(int i = 0; i < EnumTrowel.count(); i++) {
ModItems.registerRender(ModItems.TROWEL, i, "trowel_" + EnumTrowel.values()[i].getName());
}
}
这是我的ClientProxy注册方法
@Override
public void registerModelBakeryStuff() {
ModelBakery.registerItemVariants(ModItems.TROWEL, new ResourceLocation(Reference.MOD_ID, "trowel_clear"), new ResourceLocation(Reference.MOD_ID, "trowel_plaster"), new ResourceLocation(Reference.MOD_ID, "trowel_gypsum"));
}
item:0 = trowel_clear(默认变体)
项目:1 = trowel_plaster(1个变体)
项目:2 = trowel_石膏(2个变体)
控制台中没有任何错误。
答案 0 :(得分:0)
我实际上不确定发生了什么问题,因为您已将其他方法隐藏在并非应该放置的其他方法后面(为什么ModItems
拥有registerRender
方法?)
无论如何,如果我针对具有变体的项目剖析my own code 1 ,我会注意到两件事:
variantName + "=" + variant.getByOrdinal(stack.getMetadata()));
等效的内容。该字符串实际上是将元数据映射到其他模型的字符串。我的变体均已指定为枚举,并已硬映射为metadata <-> enum ordinal
。ModelLoader.setCustomModelResourceLocation()
的调用,这告诉游戏如何去寻找该字符串的资源。您的代码可能确实包含了这些内容,但是您没有将其包含在问题中,因此很难弄清哪里出了问题。
GameRegistry
系统过渡到。有一些奇怪的重定向涉及仅将数据推入数组到read them back out again later中,如果您只是在相关事件中构造 事件(即the more widely accepted standard),这实际上是没有必要的。我在不同的地方做同样的事情。