Files
CustomNPC-Gecko-Addon/src/main/java/noppes/npcs/entity/EntityCustomModel.java
T

104 lines
4.0 KiB
Java
Raw Normal View History

2024-01-22 20:35:00 -05:00
package noppes.npcs.entity;
import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import software.bernie.geckolib3.core.AnimationState;
import software.bernie.geckolib3.core.IAnimatable;
import software.bernie.geckolib3.core.IAnimationTickable;
import software.bernie.geckolib3.core.PlayState;
import software.bernie.geckolib3.core.builder.AnimationBuilder;
import software.bernie.geckolib3.core.controller.AnimationController;
import software.bernie.geckolib3.core.event.predicate.AnimationEvent;
import software.bernie.geckolib3.core.manager.AnimationData;
import software.bernie.geckolib3.core.manager.AnimationFactory;
import java.util.Objects;
public class EntityCustomModel extends EntityCreature implements IAnimatable, IAnimationTickable {
private AnimationFactory factory = new AnimationFactory(this);
public ResourceLocation modelResLoc = new ResourceLocation("geckolib3", "geo/npc.geo.json");
public ResourceLocation animResLoc = new ResourceLocation("custom", "geo_npc.animation.json");
public ResourceLocation textureResLoc = new ResourceLocation("geckolib3", "textures/model/entity/geo_npc.png");
public String idleAnim = "";
public String walkAnim = "";
public String hurtAnim = "";
public String attackAnim = "";
public AnimationBuilder dialogAnim = null;
public AnimationBuilder manualAnim = null;
public ItemStack leftHeldItem;
private <E extends IAnimatable> PlayState predicateMovement(AnimationEvent<E> event) {
if (manualAnim != null) {
if (event.getController().getAnimationState() == AnimationState.Stopped) {
manualAnim = null;
} else {
if (event.getController().currentAnimationBuilder != manualAnim) {
event.getController().markNeedsReload();
}
event.getController().setAnimation(manualAnim);
return PlayState.CONTINUE;
}
}
if (dialogAnim != null) {
if (event.getController().getAnimationState() == AnimationState.Stopped) {
dialogAnim = null;
} else {
if (event.getController().currentAnimationBuilder != dialogAnim) {
event.getController().markNeedsReload();
}
event.getController().setAnimation(dialogAnim);
return PlayState.CONTINUE;
}
}
if (!event.isMoving() || walkAnim.isEmpty()) {
if (!idleAnim.isEmpty()) {
event.getController().setAnimation(new AnimationBuilder().loop(idleAnim));
} else {
return PlayState.STOP;
}
} else {
event.getController().setAnimation(new AnimationBuilder().loop(walkAnim));
}
return PlayState.CONTINUE;
}
private <E extends IAnimatable> PlayState predicateAttack(AnimationEvent<E> event) {
return PlayState.CONTINUE;
}
public void setDialogAnim(String name) {
dialogAnim = new AnimationBuilder().playOnce(name);
}
public EntityCustomModel(World worldIn) {
super(worldIn);
this.ignoreFrustumCheck = true;
this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
this.setSize(0.7F, 2F);
}
@Override
public void registerControllers(AnimationData data) {
data.addAnimationController(new AnimationController<>(this, "movement", 10, this::predicateMovement));
data.addAnimationController(new AnimationController<>(this, "attack", 10, this::predicateAttack));
}
@Override
public AnimationFactory getFactory() {
return this.factory;
}
@Override
public int tickTimer() {
return ticksExisted;
}
@Override
public void tick() {
super.onUpdate();
}
}