Анимация GeckoLib 4 на Block Entity

Версия Minecraft
1.20.1
API
Fabric
1
0
Приветствую неравнодушных, буду благодарен за любую помощь!
Не воспроизводится анимация на блоке. Портировал json'ы из BlockBench'а. Если просто регистрирую анимацию через setAnimation, она воспроизводится при постановке блока. Если же через triggerableAnim, то анимация не воспроизводится вовсе. Ставил брейкпоинты на метод tryTriggerAnimation, все сработали, то есть вроде как анимация должна проигрываться, но почему то все равно этого не происходит. Классы и json прикрепляю.


Block Entity класс:
package net.hisoka.hisokasfurniture.block.entity;

import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
import net.hisoka.hisokasfurniture.screen.OakCupboardScreenHandler;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventories;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.screen.PropertyDelegate;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.animatable.GeoBlockEntity;
import software.bernie.geckolib.core.animatable.GeoAnimatable;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animatable.instance.SingletonAnimatableInstanceCache;
import software.bernie.geckolib.core.animation.*;
import software.bernie.geckolib.core.object.PlayState;
import software.bernie.geckolib.util.RenderUtils;

public class OakCupboardEntity extends BlockEntity implements GeoBlockEntity, ExtendedScreenHandlerFactory,
        ImplementedInventory {
    private final DefaultedList<ItemStack> inventory = DefaultedList.ofSize(9, ItemStack.EMPTY);
    protected final PropertyDelegate propertyDelegate;

    private final AnimatableInstanceCache cache = new SingletonAnimatableInstanceCache(this);

    public OakCupboardEntity(BlockPos pos, BlockState state) {
        super(ModBlocksEntities.OAK_CUPBOARD_ENTITY, pos, state);
        this.propertyDelegate = new PropertyDelegate() {
            @Override
            public int get(int index) {
                return 0;
            }

            @Override
            public void set(int index, int value) {

            }

            @Override
            public int size() {
                return 9;
            }
        };
    }

    @Override
    public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
        controllers.add(new AnimationController<>(this, "oak_cupboard",0, state -> PlayState.CONTINUE)
                .triggerableAnim("oak_cupboard",RawAnimation.begin().thenLoop("oak_cupboard")));
    }

    @Override
    public AnimatableInstanceCache getAnimatableInstanceCache() {
        return this.cache;
    }

    @Override
    public void writeScreenOpeningData(ServerPlayerEntity player, PacketByteBuf buf) {
        buf.writeBlockPos(this.pos);
    }

    @Override
    public DefaultedList<ItemStack> getItems() {
        return inventory;
    }

    @Override
    public Text getDisplayName() {
        return Text.literal("Oak Cupboard");
    }

    @Nullable
    @Override
    public ScreenHandler createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) {
        return new OakCupboardScreenHandler(syncId, playerInventory, this, this.propertyDelegate);
    }

    @Override
    protected void writeNbt(NbtCompound nbt) {
        super.writeNbt(nbt);
        Inventories.writeNbt(nbt, inventory);
    }

    @Override
    public void readNbt(NbtCompound nbt) {
        super.readNbt(nbt);
        Inventories.readNbt(nbt, inventory);
    }
}



Block класс:
package net.hisoka.hisokasfurniture.block.custom;

import net.hisoka.hisokasfurniture.block.entity.ModBlocksEntities;
import net.hisoka.hisokasfurniture.block.entity.OakCupboardEntity;
import net.minecraft.block.*;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityTicker;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.screen.NamedScreenHandlerFactory;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.DirectionProperty;
import net.minecraft.util.*;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;

public class OakCupboard extends BlockWithEntity{
    public static final DirectionProperty FACING = HorizontalFacingBlock.FACING;

    public OakCupboard(Settings settings) {
        super(settings);
        this.setDefaultState(this.stateManager.getDefaultState().with(FACING, Direction.NORTH));
    }

    @Nullable
    @Override
    public BlockState getPlacementState(ItemPlacementContext ctx) {
        return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite());
    }

    @Override
    public BlockState rotate(BlockState state, BlockRotation rotation) {
        return state.with(FACING, rotation.rotate(state.get(FACING)));
    }

    @Override
    public BlockState mirror(BlockState state, BlockMirror mirror) {
        return state.rotate(mirror.getRotation(state.get(FACING)));
    }

    @Nullable
    @Override
    public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
        return new OakCupboardEntity(pos, state);
    }

    @Override
    protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
        builder.add(FACING);
    }

    @Override
    public BlockRenderType getRenderType(BlockState state) {
        return BlockRenderType.ENTITYBLOCK_ANIMATED;
    }

    @Override
    public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) {
        if (state.getBlock() != newState.getBlock()) {
            BlockEntity blockEntity = world.getBlockEntity(pos);
            if (blockEntity instanceof OakCupboardEntity) {
                ItemScatterer.spawn(world, pos, (OakCupboardEntity)blockEntity);
                world.updateComparators(pos, this);
            }
            super.onStateReplaced(state, world, pos, newState, moved);
        }
    }

    @Override
    public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
        if (!world.isClient) {
            NamedScreenHandlerFactory screenHandlerFactory = ((OakCupboardEntity) world.getBlockEntity(pos));

            if (screenHandlerFactory != null) {
                player.openHandledScreen(screenHandlerFactory);
            }

            if (hand == Hand.MAIN_HAND){
                OakCupboardEntity oakCupboard = (OakCupboardEntity) world.getBlockEntity(pos);
                oakCupboard.triggerAnim("oak_cupboard", "oak_cupboard");
            }
        }
        return ActionResult.SUCCESS;
    }
}



Анимация json:
{
    "format_version": "1.8.0",
    "animations": {
        "oak_cupboard": {
            "animation_length": 1,
            "bones": {
                "door": {
                    "rotation": {
                        "0.0": {
                            "vector": [0, 0, 0]
                        },
                        "0.5": {
                            "vector": [0, -90, 0],
                            "easing": "linear"
                        },
                        "1.0": {
                            "vector": [0, 0, 0]
                        }
                    }
                }
            }
        }
    },
    "geckolib_format_version": 2
}
 
Сверху