Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.zanckor.entities.bear;
- import net.minecraft.core.BlockPos;
- import net.minecraft.nbt.CompoundTag;
- import net.minecraft.network.syncher.EntityDataAccessor;
- import net.minecraft.network.syncher.EntityDataSerializers;
- import net.minecraft.network.syncher.SynchedEntityData;
- import net.minecraft.world.entity.EntityType;
- import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
- import net.minecraft.world.entity.ai.attributes.Attributes;
- import net.minecraft.world.entity.ai.goal.*;
- import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;
- import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
- import net.minecraft.world.entity.animal.Animal;
- import net.minecraft.world.entity.monster.Monster;
- import net.minecraft.world.entity.player.Player;
- import net.minecraft.world.level.Level;
- import software.bernie.geckolib3.core.IAnimatable;
- 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 javax.annotation.ParametersAreNonnullByDefault;
- import java.util.EnumSet;
- import java.util.Optional;
- public class BearEntity extends Monster implements IAnimatable {
- private static final EntityDataAccessor<Boolean> DATA_HAS_TARGET = SynchedEntityData.defineId(BearEntity.class, EntityDataSerializers.BOOLEAN);
- private static final EntityDataAccessor<Boolean> IS_SLEEPING = SynchedEntityData.defineId(BearEntity.class, EntityDataSerializers.BOOLEAN);
- private static final EntityDataAccessor<Boolean> IS_RETURNING_HOME = SynchedEntityData.defineId(BearEntity.class, EntityDataSerializers.BOOLEAN);
- private final AnimationFactory factory = new AnimationFactory(this);
- public BearEntity(EntityType<? extends Monster> entityType, Level level) {
- super(entityType, level);
- }
- protected void registerGoals() {
- this.goalSelector.addGoal(1, new FloatGoal(this));
- this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false));
- this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F));
- this.goalSelector.addGoal(4, new RandomLookAroundGoal(this));
- this.goalSelector.addGoal(5, new JumpGoal() {
- @Override
- public boolean canUse() {
- return true;
- }
- });
- this.goalSelector.addGoal(6, new RandomSwimmingGoal(this, 10, 7));
- this.goalSelector.addGoal(7, new returnHome(this, this.getOnPos()));
- this.goalSelector.addGoal(8, new SleepGoal(this));
- this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, BearEntity.class)));
- this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Animal.class, true));
- }
- public static AttributeSupplier setAttributes() {
- return Animal.createMobAttributes()
- .add(Attributes.MAX_HEALTH, 100.0D)
- .add(Attributes.ATTACK_DAMAGE, 25.0f)
- .add(Attributes.ATTACK_KNOCKBACK, 2.0f)
- .add(Attributes.ATTACK_SPEED, 2.0f)
- .add(Attributes.MOVEMENT_SPEED, 0.3f)
- .add(Attributes.FOLLOW_RANGE, 24.0f).build();
- }
- @ParametersAreNonnullByDefault
- @Override
- public void readAdditionalSaveData(CompoundTag nbt) {
- super.readAdditionalSaveData(nbt);
- entityCheckTarget(nbt.getBoolean("hasTarget"));
- entityCheckTarget(nbt.getBoolean("isSleeping"));
- entityCheckTarget(nbt.getBoolean("isReturningHome"));
- }
- @ParametersAreNonnullByDefault
- @Override
- public void addAdditionalSaveData(CompoundTag nbt) {
- super.addAdditionalSaveData(nbt);
- nbt.putBoolean("hasTarget", this.entityHasTarget());
- nbt.putBoolean("isSleeping", this.entityIsSleeping());
- nbt.putBoolean("isReturningHome", this.entityIsReturningHome());
- }
- @Override
- protected void defineSynchedData() {
- super.defineSynchedData();
- this.entityData.define(DATA_HAS_TARGET, false);
- this.entityData.define(IS_SLEEPING, false);
- this.entityData.define(IS_RETURNING_HOME, false);
- }
- @Override
- public void updateControlFlags() {
- if (this.getTarget() != null) {
- this.entityCheckTarget(true);
- this.setSprinting(true);
- } else {
- this.entityCheckTarget(false);
- this.setSprinting(false);
- }
- }
- public void entityCheckTarget(boolean hasTarget) {
- this.entityData.set(DATA_HAS_TARGET, hasTarget);
- }
- public void entitySetSleeping(boolean isSleeping) {
- this.entityData.set(IS_SLEEPING, isSleeping);
- }
- public void entitySetReturningHome(boolean isReturningHome) {
- this.entityData.set(IS_SLEEPING, isReturningHome);
- }
- public boolean entityHasTarget() {
- return this.entityData.get(DATA_HAS_TARGET);
- }
- public boolean entityIsSleeping() {
- return this.entityData.get(IS_SLEEPING);
- }
- public boolean entityIsReturningHome() {
- return this.entityData.get(IS_RETURNING_HOME);
- }
- private <E extends IAnimatable> PlayState predicate(AnimationEvent<E> e) {
- /*
- if (this.entityHasTarget() && e.isMoving()) {
- e.getController().setAnimation(new AnimationBuilder().addAnimation("bear.run", true));
- e.getController().setAnimationSpeed(5D);
- return PlayState.CONTINUE;
- } else {
- e.getController().setAnimationSpeed(1D);
- }
- */
- if (this.entityIsSleeping()) {
- System.out.println("Is Sleeping");
- }
- if (this.entityIsReturningHome()) {
- System.out.println("Is Returning Home");
- }
- if (e.isMoving()) {
- e.getController().setAnimation(new AnimationBuilder().addAnimation("bear.walk", true));
- return PlayState.CONTINUE;
- }
- e.getController().setAnimation(new AnimationBuilder().addAnimation("bear.idle", true));
- return PlayState.CONTINUE;
- }
- @Override
- public void registerControllers(AnimationData data) {
- data.addAnimationController(new AnimationController(this, "controller", 0, this::predicate));
- }
- @Override
- public AnimationFactory getFactory() {
- return this.factory;
- }
- }
- class returnHome extends Goal {
- private final BearEntity bear;
- private Optional<BlockPos> home;
- private int xHome, yHome, zHome;
- returnHome(BearEntity bear, BlockPos home) {
- this.bear = bear;
- this.home = bear.getSleepingPos();
- xHome = home.getX();
- zHome = home.getZ();
- yHome = home.getY();
- }
- @Override
- public boolean canUse() {
- if (!bear.level.isDay() && bear.entityIsReturningHome()) {
- start();
- return home != null;
- }
- stop();
- return false;
- }
- @Override
- public void start() {
- bear.getMoveControl().setWantedPosition(xHome, zHome, yHome, 1);
- bear.entitySetReturningHome(true);
- }
- @Override
- public void stop() {
- bear.entitySetReturningHome(false);
- }
- }
- class SleepGoal extends Goal {
- private BearEntity bear;
- public SleepGoal(BearEntity bear) {
- this.bear = bear;
- this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK, Goal.Flag.JUMP));
- }
- @Override
- public boolean canUse() {
- if (!bear.level.isDay() /*&& !bear.entityIsReturningHome()*/) {
- System.out.println("STARTED");
- start();
- return true;
- }
- System.out.println("STOPPED");
- stop();
- return false;
- }
- @Override
- public boolean canContinueToUse() {
- return this.canSleep();
- }
- private boolean canSleep() {
- if (!bear.level.isDay()) {
- return true;
- }
- return false;
- }
- @Override
- public void stop() {
- if (bear.level.isDay()) {
- bear.entitySetSleeping(false);
- }
- }
- @Override
- public void start() {
- System.out.println("HAD EVEN STARTED?");
- bear.entitySetSleeping(true);
- bear.setJumping(false);
- bear.getNavigation().stop();
- bear.getMoveControl().setWantedPosition(bear.getX(), bear.getY(), bear.getZ(), 0.0D);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement