Line 4:
Line 4:
== Adding Properties to Items ==
== Adding Properties to Items ==
−
<code><nowiki>ItemModelsProperties::registerProperty</nowiki></code> is used to add a property to a specific item. The <code>ResourceLocation</code> parameter is the name given to the property (e.g. <code><nowiki>new ResourceLocation("pull")</nowiki></code>). The <code>IItemPropertyGetter</code> is a function that takes the <code>ItemStack</code>, the <code>ClientWorld</code> it’s in, and the <code>LivingEntity</code> that holds it, returning the <code>float</code> value for the property. Some examples are the <code><nowiki>pulling</nowiki></code> and <code><nowiki>pull</nowiki></code> properties for <code>Items#BOW</code>, and the several default ones in <code>ItemModelProperties</code>. For modded item properties, it is recommended that the modid of the mod is used as the namespace (e.g. <code><nowiki>examplemod:property</nowiki></code> and not just <code>property</code>, as that really means <code><nowiki>minecraft:property</nowiki></code>).
+
<code><nowiki>ItemProperties::register</nowiki></code> is used to add a property to a specific item. The <code>ResourceLocation</code> parameter is the name given to the property (e.g. <code><nowiki>new ResourceLocation("pull")</nowiki></code>). The <code>ItemPropertyFunction</code> is a function that takes the <code>ItemStack</code>, the <code>ClientLevel</code> it’s in, the <code>LivingEntity</code> that holds it, and the <code>int</code> containing the id of the holding entity or '''0''', returning the <code>float</code> value for the property. Some examples are the <code><nowiki>pulling</nowiki></code> and <code><nowiki>pull</nowiki></code> properties for <code>Items#BOW</code>, and the several default ones in <code>ItemProperties</code>. For modded item properties, it is recommended that the modid of the mod is used as the namespace (e.g. <code><nowiki>examplemod:property</nowiki></code> and not just <code>property</code>, as that really means <code><nowiki>minecraft:property</nowiki></code>). There's also another private method <code>ItemProperties::registerGeneric</code> that is used to add properties to all items, and it does not take <code>Item</code> as its parameter since all items will apply this property.
+
+
{{Tip/Important|Use <code>FMLClientSetupEvent#enqueueWork</code> to proceed with the tasks, since the data structures in <code>ItemProperties</code> are not thread-safe.}}
+
+
{{Tip|<code>ItemPropertyFunction</code> is deprecated by Mojang in favor of using the subinterface <code>ClampedItemPropertyFunction</code> which clamps the result between '''0''' and '''1'''.}}
== Using Overrides ==
== Using Overrides ==
A good example can be found in <code><nowiki>model/item/bow.json</nowiki></code>. For reference, here is a hypothetical example of an item with an <code><nowiki>examplemod:power</nowiki></code> property. If the values have no match, the default is the current model.
A good example can be found in <code><nowiki>model/item/bow.json</nowiki></code>. For reference, here is a hypothetical example of an item with an <code><nowiki>examplemod:power</nowiki></code> property. If the values have no match, the default is the current model.
−
<block important>A predicate applies to all values greater than or equal to the given value.</block>
+
+
{{Tip/Important|A predicate applies to all values greater than or equal to the given value.}}
+
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
Line 14:
Line 20:
"textures": {
"textures": {
"__comment": "Default",
"__comment": "Default",
−
"layer0": "examplemod:items/examplePartial"
+
"layer0": "examplemod:items/example_partial"
},
},
"overrides": [
"overrides": [
Line 22:
Line 28:
"examplemod:power": 0.75
"examplemod:power": 0.75
},
},
−
"model": "examplemod:item/examplePowered"
+
"model": "examplemod:item/example_powered"
}
}
]
]
}
}
</syntaxhighlight>
</syntaxhighlight>
−
And here’s a hypothetical snippet from the supporting code. (This does not have to be client-only; it will work on a server too. In vanilla, properties are registered in the item’s constructor.)
+
+
And here’s a hypothetical snippet from the supporting code. Unlike the older versions (lower than 1.16.x), this needs to be done on client side only because <code>ItemProperties</code> does not exist on server.
+
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
public void clientSetup(final FMLCLientSetupEvent event) {
public void clientSetup(final FMLCLientSetupEvent event) {
−
ItemModelProperties.registerProperty(item, new ResourceLocation("examplemod:power"), new IItemPropertyGetter() {
+
event.enqueueWork(() ->
−
@Override
+
{
−
public float call(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity entity) {
+
ItemProperties.register(ExampleItems.APPLE,
−
return (float)getPowerLevel(stack) / (float)getMaxPower(stack); // Some external methods
+
new ResourceLocation(ExampleMod.MODID, "pulling"), (stack, level, living, id) -> {
−
}
+
return living != null && living.isUsingItem() && living.getUseItem() == stack ? 1.0F : 0.0F;
−
}
+
});
+
});
}
}
</syntaxhighlight>
</syntaxhighlight>