Jump to content

LoveAi

Members
  • Posts

    2
  • Joined

  • Last visited

Everything posted by LoveAi

  1. After looking through a ton of functions, I found the issue was that my entity was extending MonsterEntity, which extends MobEntity, which creates a GroundPathNavigator, which has a rules for canUpdatePath that include "this.mob.isOnGround()". My entity is a flying entity. Whoops. Solution was to simply override the createNavigation function, where I simply "return new FlyingPathNavigator(this, world);". Everything works fine now.
  2. I'm trying to write an AI Goal for an entity to move towards its target on each tick (with quite a few restrictions on when, which is why I need a new goal). It seemed to be working when I also added a WaterAvoidingRandomWalkingGoal, but I don't want the entity to move around randomly anymore, so I removed that. My code overrides the canUse function to determine whether or not it should start moving towards the target, and that ends with creating a path to the target, which always returns NULL, so nothing happens. Here's the relevant functions: public FloatingEyesGoal(EntityFloatingEyes e, double speed) { this.entity = e; this.random = e.getRandom(); this.speed = speed; this.setFlags(EnumSet.of(Flag.LOOK, Flag.MOVE, Flag.TARGET)); this.entity.getNavigation().setCanFloat(true); } @Override public boolean canUse() { LivingEntity target = this.entity.getTarget(); if (target == null || !target.isAlive() || !isFacingTargetBack()) return false; setTargetPos(target); this.path = this.entity.getNavigation().createPath(target, 0); // Logging this.path == null prints "true", and this.entity.getNavigation() == null prints "false" return this.path != null || isInRange(target); } @Override public boolean canContinueToUse() { LivingEntity target = this.entity.getTarget(); if (target == null || !target.isAlive() || !isFacingTargetBack()) return false; return !this.entity.getNavigation().isDone(); } @Override public void start() { this.entity.getNavigation().moveTo(this.path, this.speed); this.entity.setAggressive(true); this.ticksToMove = 0; } @Override public void stop() { LivingEntity target = this.entity.getTarget(); if (!EntityPredicates.NO_CREATIVE_OR_SPECTATOR.test(target)) { this.entity.setTarget(null); } this.entity.setAggressive(false); this.entity.getNavigation().stop(); this.targetPosX = 0.0D; this.targetPosY = 0.0D; this.targetPosZ = 0.0D; } @Override public void tick() { // Look at target LivingEntity target = this.entity.getTarget(); this.entity.getLookControl().setLookAt(target, 32.0F, 32.0F); setTargetPos(target); final double distance = this.entity.distanceToSqr(this.targetPosX, this.targetPosY, this.targetPosZ); this.ticksToMove--; LilSpooks.LOGGER.info(this.ticksToMove); if (this.ticksToMove <= 0 && this.entity.getSensing().canSee(target) && target.distanceToSqr(this.targetPosX, this.targetPosY, this.targetPosZ) >= 1.0D) { this.ticksToMove = 5 + this.random.nextInt(8); // Add extra time if eyes can't move to hopefully wait enough to try again (1 second). this.path = this.entity.getNavigation().createPath(new BlockPos(this.targetPosX, this.targetPosY, this.targetPosZ), 0); // Logging this.path == null returns "true" here as well if (!this.entity.getNavigation().moveTo(this.path, this.speed)) { this.ticksToMove += 20; } } this.attackTick = Math.max(this.attackTick - 1, 0); this.attemptAttack(target, distance); } protected void setTargetPos(LivingEntity target) { this.targetPosX = target.getX(); this.targetPosY = target.getBoundingBox().minY; this.targetPosZ = target.getZ(); } I have tried multiple ways of invoking createPath, I tried setting the moveControl of the entity with the goal to a new FlyingMovementController, and I've looked at how the createPath function works (though I can't figure out how to do a live debugging session, so I couldn't set a breakpoint at that code which would tell me exactly what causes it to be null). I tried my best to work through this for a few hours but I can't seem to figure it out. Any help is appreciated.
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.