Comment on page
How to create an Animated Item
This page will not cover how to code an Item from the ground up, only how to add the required Azurelib code for the animations and model to work.
Instantiate a new
AnimatableInstanceCache
via AzureLibUtil.createInstanceCache(this)
at the top of your entity class and return it in getAnimatableInstanceCache
private final AnimatableInstanceCache cache = AzureLibUtil.createInstanceCache(this);
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return cache;
}
@Override
public void registerControllers(ControllerRegistrar controllers) {
controllers.add(new AnimationController<>(this, "controllerName",
event -> PlayState.CONTINUE));
}
public class ExampleItemModel extends GeoModel<ExampleItem> {
// Models must be stored in assets/<modid>/geo with subfolders supported inside the geo folder
private static final ResourceLocation model = new ResourceLocation("yournamespace", "geo/yourmodel.geo.json");
// Textures must be stored in assets/<modid>/textures with subfolders supported inside the textures folder
private static final ResourceLocation texture = new ResourceLocation("yournamespace", "textures/<modeltype>/yourtexture.png");
// Animations must be stored in assets/<modid>/animations with subfolders supported inside the animations folder
private static final ResourceLocation animation = new ResourceLocation("yournamespace", "animations/youranimation.animation.json");
@Override
public ResourceLocation getModelResource(ExampleItem object) {
return this.model;
}
@Override
public ResourceLocation getTextureResource(ExampleItem object) {
return this.texture;
}
@Override
public ResourceLocation getAnimationResource(ExampleItem object) {
return this.animation;
}
}
public class ExampleItemRenderer extends GeoItemRenderer<ExampleItem > {
public ExampleItemRenderer() {
super(new ExampleItemModel());
}
}
In your Item class, add:
private final Supplier<Object> renderProvider = GeoItem.makeRenderer(this);
// Creates the render
@Override
public void createRenderer(Consumer<Object> consumer) {
consumer.accept(new RenderProvider() {
// Your render made above
private ExampleItemRenderer renderer;
@Override
public BlockEntityWithoutLevelRenderer getCustomRenderer() {
if (renderer == null)
return new ExampleItemRenderer();
return this.renderer;
}
});
}
@Override
public Supplier<Object> getRenderProvider() {
return renderProvider;
}
In your Item class, add:
@Override
public void initializeClient(Consumer<IClientItemExtensions> consumer) {
consumer.accept(new IClientItemExtensions() {
private ExampleItemRenderer renderer;
@Override
public BlockEntityWithoutLevelRenderer getCustomRenderer() {
if (renderer == null)
return new ExampleItemRenderer();
return this.renderer;
}
});
}