package crazypants.enderzoo.entity.navigate; import crazypants.enderzoo.entity.IFlyingMob; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityLookHelper; import net.minecraft.entity.ai.EntityMoveHelper; import net.minecraft.util.math.MathHelper; public class FlyingMoveHelper extends EntityMoveHelper { // private EntityOwl owl; private EntityLiving entity; private IFlyingMob mob; private double maxDescentSpeed = 0.1; public FlyingMoveHelper(IFlyingMob owl) { super(owl.asEntityCreature()); this.mob = owl; this.entity = owl.asEntityCreature(); } @Override public void onUpdateMoveHelper() { if (!entity.getNavigator().noPath()) { double xDelta = posX - entity.posX; double yDelta = posY - entity.posY; double zDelta = posZ - entity.posZ; float moveFactor = 1; float moveSpeed = (float) (speed * entity.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).getAttributeValue()); entity.setAIMoveSpeed(entity.getAIMoveSpeed() + (moveSpeed - entity.getAIMoveSpeed()) * moveFactor); double distSq = xDelta * xDelta + yDelta * yDelta + zDelta * zDelta; double dist = MathHelper.sqrt(distSq); yDelta = yDelta / dist; if (yDelta > 0) { // Ensure enough lift to get up to the target yDelta = Math.max(0.1, yDelta); } double yMove = entity.getAIMoveSpeed() * yDelta * mob.getMaxClimbRate(); entity.motionY += yMove; // Limit max downward speed if (!entity.isDead && !entity.onGround && entity.motionY < -maxDescentSpeed) { entity.motionY = -maxDescentSpeed; } // Limit crazy spinning when going straight down float tr = mob.getMaxTurnRate(); if (yMove < -0.12) { tr = 10; } float yawAngle = (float) (MathHelper.atan2(zDelta, xDelta) * 180.0D / Math.PI) - 90.0F; entity.rotationYaw = limitAngle(entity.rotationYaw, yawAngle, tr); entity.renderYawOffset = entity.rotationYaw; // Look double d7 = entity.posX + (xDelta / dist * 2.0D); double d8 = entity.getEyeHeight() + entity.posY + (yDelta / dist * 1.0D); double d9 = entity.posZ + (zDelta / dist * 2.0D); EntityLookHelper entitylookhelper = entity.getLookHelper(); double lookX = entitylookhelper.getLookPosX(); double lookY = entitylookhelper.getLookPosY(); double lookZ = entitylookhelper.getLookPosZ(); if (!entitylookhelper.getIsLooking()) { lookX = d7; lookY = d8; lookZ = d9; } entity.getLookHelper().setLookPosition(lookX + (d7 - lookX) * 0.125D, lookY + (d8 - lookY) * 0.125D, lookZ + (d9 - lookZ) * 0.125D, 10.0F, 40.0F); } else { entity.setAIMoveSpeed(0.0F); } } }