您好,我这里写了一个Minecraft 1.20.1 forge47.3.0 的模组,使用geckolib进行动画制作,参照了您发的一条有关动画物品的帖子,但是我使用了不同的方法,就是写了一个基类,可以快捷地添加物品攻击动画,但是我遇到了模型渲染不出来的问题,可以帮我看看么
package com.example.examplemod.items.client;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.item.Tier;
import net.minecraft.world.level.Level;
import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.common.MinecraftForge;
import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animatable.instance.InstancedAnimatableInstanceCache;
import software.bernie.geckolib.core.animation.*;
import software.bernie.geckolib.core.object.PlayState;
public abstract class AnimatedAttackItemBase extends SwordItem implements GeoItem {
private final AnimatableInstanceCache cache = new InstancedAnimatableInstanceCache(this);
private boolean isAttacking = false;
public AnimatedAttackItemBase(Tier tier, int attackDamage, float attackSpeed, Properties properties) {
super(tier, attackDamage, attackSpeed, properties);
MinecraftForge.EVENT_BUS.register(this);
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) {
controllerRegistrar.add(new AnimationController<>(this, "controller", 0, this::predicate));
}
private PlayState predicate(AnimationState<?> event) {
if (isAttacking) {
event.getController().setAnimation(RawAnimation.begin().then(getAttackAnimation(), Animation.LoopType.PLAY_ONCE));
isAttacking = false;
} else {
event.getController().setAnimation(RawAnimation.begin().then(getIdleAnimation(), Animation.LoopType.LOOP));
}
return PlayState.CONTINUE;
}
@SubscribeEvent
public void onAttackEntity(AttackEntityEvent event) {
if (event.getEntity().getMainHandItem().getItem() instanceof AnimatedAttackItemBase) {
isAttacking = true;
event.getEntity().sendSystemMessage(Component.translatable("111"));
}
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return cache;
}
protected abstract String getAttackAnimation();
protected abstract String getIdleAnimation();
}
我不知道是否是我导入问题还是什么,这是我的注册item的类↓
package com.example.examplemod.items;
import com.example.examplemod.ExampleMod;
import com.example.examplemod.items.client.AnimatedAttackItemBase;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Tiers;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import software.bernie.geckolib.core.animatable.GeoAnimatable;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animation.AnimatableManager;
public class ModItems extends Item implements GeoAnimatable {
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ExampleMod.MODID);
public ModItems(Properties p_41383_) {
super(p_41383_);
}
public static void init(IEventBus eventBus){ITEMS.register(eventBus);}
public static final RegistryObject<Item> FIRST_ITEM = ITEMS.register("custom_animated_item", () -> {
return new AnimatedAttackItemBase(Tiers.IRON, 3, -2.4f, new Item.Properties()) {
@Override
protected String getAttackAnimation() {
return "animation.model.attack"; // 修改这里
}
@Override
protected String getIdleAnimation() {
return null;
}
};
});
public static final RegistryObject<Item> ITEM_TWO = ITEMS.register("item_two",
() -> new Item(new Item.Properties()));
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) {
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return null;
}
@Override
public double getTick(Object o) {
return 0;
}
}
由于无法将橡木工程文件上传……这非常麻烦……

这就是我的问题,求解答