- 1
- 0
Приветствую неравнодушных, буду благодарен за любую помощь!
Не воспроизводится анимация на блоке. Портировал json'ы из BlockBench'а. Если просто регистрирую анимацию через setAnimation, она воспроизводится при постановке блока. Если же через triggerableAnim, то анимация не воспроизводится вовсе. Ставил брейкпоинты на метод tryTriggerAnimation, все сработали, то есть вроде как анимация должна проигрываться, но почему то все равно этого не происходит. Классы и json прикрепляю.
Не воспроизводится анимация на блоке. Портировал 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
}