Applying the Renderer
Once you've made your item class and its associated armor renderer, you need to apply it to your item class.
Adjusting Your Item Class
To apply the GeoItemRenderer to your item, you'll need to add in a small section to your item class.
Green highlights show added or modified lines of code for each step.
First, we override createGeoRenderer in our item class:
public class ExampleArmorItem extends Item implements GeoItem {
// ...
@Override
public void createGeoRenderer(Consumer<GeoRenderProvider> consumer) {
}
}
Then we provide the Consumer with a new GeoRenderProvider instance:
public class ExampleArmorItem extends Item implements GeoItem {
// ...
@Override
public void createGeoRenderer(Consumer<GeoRenderProvider> consumer) {
consumer.accept(new GeoRenderProvider() {
});
}
}
Next, we create a cached supplier of your renderer, so that you're not creating a new one every render pass:
public class ExampleArmorItem extends Item implements GeoItem {
// ...
@Override
public void createGeoRenderer(Consumer<GeoRenderProvider> consumer) {
consumer.accept(new GeoRenderProvider() {
private final Supplier<GeoArmorRenderer<ExampleArmorItem>> renderer = Suppliers.memoize(() -> new GeoArmorRenderer<>(ExampleArmorItem.this));
});
}
}
And finally, we override getGeoArmorRenderer and return our renderer:
public class ExampleArmorItem extends Item implements GeoItem {
// ...
@Override
public void createGeoRenderer(Consumer<GeoRenderProvider> consumer) {
consumer.accept(new GeoRenderProvider() {
private final Supplier<GeoArmorRenderer<ExampleArmorItem>> renderer = Suppliers.memoize(() -> new GeoArmorRenderer<>(ExampleArmorItem.this));
@Override
public @Nullable GeoArmorRenderer<?, ?> getGeoArmorRenderer(ItemStack itemStack, EquipmentSlot equipmentSlot) {
return this.renderer.get();
}
});
}
}
Split Sources
If you have client-server split sources, you'll need to do a few additional steps to make your renderer work, since your IDE won't be able to find the renderer class while working in your item.
Item Class
Green highlights show added or modified lines of code for each step.
First, we'll need to put a MutableObject in your item class so it can hold the GeoRenderProvider:
public class ExampleArmorItem extends Item implements GeoItem {
public final MutableObject<GeoRenderProvider> geoRenderProvider = new MutableObject<>();
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
public ExampleArmorItem(ArmorMaterial material, ArmorType type, Properties properties) {
super(properties.humanoidArmor(material, type));
}
// ...
}
Then, we'll need to provide that to the GeoRenderProvider consumer, instead of directly passing it:
public class ExampleArmorItem extends Item implements GeoItem {
public final MutableObject<GeoRenderProvider> geoRenderProvider = new MutableObject<>();
// ...
@Override
public void createGeoRenderer(Consumer<GeoRenderProvider> consumer) {
consumer.accept(this.geoRenderProvider.getValue());
}
// ...
}
Client Setup Class
Lastly, in your mod's client setup, you'll need to set the geoRenderProvider in your item's instance.
See the Adjusting Your Item Class section to see how to build the GeoRenderProvider instance.
- Fabric
- Forge
- NeoForge
@Override
public void onInitializeClient() {
ItemRegistry.EXAMPLE_ARMOR_ITEM.geoRenderProvider.setValue(new GeoRenderProvider() {
private final Supplier<GeoArmorRenderer<ExampleItem>> renderer = Suppliers.memoize(() -> new GeoArmorRenderer<>(ItemRegistry.EXAMPLE_ARMOR_ITEM));
@Override
public @Nullable GeoArmorRenderer<?, ?> getGeoArmorRenderer(ItemStack itemStack, EquipmentSlot equipmentSlot) {
return this.renderer.get();
}
});
}
@SubscribeEvent
public static void registerRenderers(final EntityRenderersEvent.RegisterRenderers event) {
ItemRegistry.EXAMPLE_ARMOR_ITEM.geoRenderProvider.setValue(new GeoRenderProvider() {
private final Supplier<GeoArmorRenderer<ExampleItem>> renderer = Suppliers.memoize(() -> new GeoArmorRenderer<>(ItemRegistry.EXAMPLE_ARMOR_ITEM.get()));
@Override
public @Nullable GeoArmorRenderer<?, ?> getGeoArmorRenderer(ItemStack itemStack, EquipmentSlot equipmentSlot) {
return this.renderer.get();
}
});
}
@SubscribeEvent
public static void registerRenderers(final EntityRenderersEvent.RegisterRenderers event) {
ItemRegistry.EXAMPLE_ARMOR_ITEM.geoRenderProvider.setValue(new GeoRenderProvider() {
private final Supplier<GeoArmorRenderer<ExampleItem>> renderer = Suppliers.memoize(() -> new GeoArmorRenderer<>(ItemRegistry.EXAMPLE_ARMOR_ITEM.get()));
@Override
public @Nullable GeoArmorRenderer<?, ?> getGeoArmorRenderer(ItemStack itemStack, EquipmentSlot equipmentSlot) {
return this.renderer.get();
}
});
}