You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			170 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Java
		
	
			
		
		
	
	
			170 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Java
		
	
package net.minecraft.entity.ai;
 | 
						|
 | 
						|
import net.minecraft.entity.EntityCreature;
 | 
						|
import net.minecraft.entity.EntityLivingBase;
 | 
						|
import net.minecraft.pathfinding.PathEntity;
 | 
						|
import net.minecraft.pathfinding.PathPoint;
 | 
						|
import net.minecraft.util.MathHelper;
 | 
						|
import net.minecraft.world.World;
 | 
						|
 | 
						|
public class EntityAIAttackOnCollide extends EntityAIBase
 | 
						|
{
 | 
						|
    World worldObj;
 | 
						|
    EntityCreature attacker;
 | 
						|
    /** An amount of decrementing ticks that allows the entity to attack once the tick reaches 0. */
 | 
						|
    int attackTick;
 | 
						|
    /** The speed with which the mob will approach the target */
 | 
						|
    double speedTowardsTarget;
 | 
						|
    /** When true, the mob will continue chasing its target, even if it can't find a path to them right now. */
 | 
						|
    boolean longMemory;
 | 
						|
    /** The PathEntity of our entity. */
 | 
						|
    PathEntity entityPathEntity;
 | 
						|
    Class classTarget;
 | 
						|
    private int field_75445_i;
 | 
						|
    private double field_151497_i;
 | 
						|
    private double field_151495_j;
 | 
						|
    private double field_151496_k;
 | 
						|
    private static final String __OBFID = "CL_00001595";
 | 
						|
 | 
						|
    private int failedPathFindingPenalty;
 | 
						|
 | 
						|
    public EntityAIAttackOnCollide(EntityCreature p_i1635_1_, Class p_i1635_2_, double p_i1635_3_, boolean p_i1635_5_)
 | 
						|
    {
 | 
						|
        this(p_i1635_1_, p_i1635_3_, p_i1635_5_);
 | 
						|
        this.classTarget = p_i1635_2_;
 | 
						|
    }
 | 
						|
 | 
						|
    public EntityAIAttackOnCollide(EntityCreature p_i1636_1_, double p_i1636_2_, boolean p_i1636_4_)
 | 
						|
    {
 | 
						|
        this.attacker = p_i1636_1_;
 | 
						|
        this.worldObj = p_i1636_1_.worldObj;
 | 
						|
        this.speedTowardsTarget = p_i1636_2_;
 | 
						|
        this.longMemory = p_i1636_4_;
 | 
						|
        this.setMutexBits(3);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns whether the EntityAIBase should begin execution.
 | 
						|
     */
 | 
						|
    public boolean shouldExecute()
 | 
						|
    {
 | 
						|
        EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
 | 
						|
 | 
						|
        if (entitylivingbase == null)
 | 
						|
        {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        else if (!entitylivingbase.isEntityAlive())
 | 
						|
        {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        else if (this.classTarget != null && !this.classTarget.isAssignableFrom(entitylivingbase.getClass()))
 | 
						|
        {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            if (-- this.field_75445_i <= 0)
 | 
						|
            {
 | 
						|
                this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(entitylivingbase);
 | 
						|
               this.field_75445_i = 4 + this.attacker.getRNG().nextInt(7);
 | 
						|
                return this.entityPathEntity != null;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns whether an in-progress EntityAIBase should continue executing
 | 
						|
     */
 | 
						|
    public boolean continueExecuting()
 | 
						|
    {
 | 
						|
        EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
 | 
						|
        return entitylivingbase == null ? false : (!entitylivingbase.isEntityAlive() ? false : (!this.longMemory ? !this.attacker.getNavigator().noPath() : this.attacker.isWithinHomeDistance(MathHelper.floor_double(entitylivingbase.posX), MathHelper.floor_double(entitylivingbase.posY), MathHelper.floor_double(entitylivingbase.posZ))));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Execute a one shot task or start executing a continuous task
 | 
						|
     */
 | 
						|
    public void startExecuting()
 | 
						|
    {
 | 
						|
        this.attacker.getNavigator().setPath(this.entityPathEntity, this.speedTowardsTarget);
 | 
						|
        this.field_75445_i = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Resets the task
 | 
						|
     */
 | 
						|
    public void resetTask()
 | 
						|
    {
 | 
						|
        this.attacker.getNavigator().clearPathEntity();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Updates the task
 | 
						|
     */
 | 
						|
    public void updateTask()
 | 
						|
    {
 | 
						|
        EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
 | 
						|
        this.attacker.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F);
 | 
						|
        double d0 = this.attacker.getDistanceSq(entitylivingbase.posX, entitylivingbase.boundingBox.minY, entitylivingbase.posZ);
 | 
						|
        double d1 = (double)(this.attacker.width * 2.0F * this.attacker.width * 2.0F + entitylivingbase.width);
 | 
						|
        --this.field_75445_i;
 | 
						|
 | 
						|
        if ((this.longMemory || this.attacker.getEntitySenses().canSee(entitylivingbase)) && this.field_75445_i <= 0 && (this.field_151497_i == 0.0D && this.field_151495_j == 0.0D && this.field_151496_k == 0.0D || entitylivingbase.getDistanceSq(this.field_151497_i, this.field_151495_j, this.field_151496_k) >= 1.0D || this.attacker.getRNG().nextFloat() < 0.05F))
 | 
						|
        {
 | 
						|
            this.field_151497_i = entitylivingbase.posX;
 | 
						|
            this.field_151495_j = entitylivingbase.boundingBox.minY;
 | 
						|
            this.field_151496_k = entitylivingbase.posZ;
 | 
						|
            this.field_75445_i = failedPathFindingPenalty + 4 + this.attacker.getRNG().nextInt(7);
 | 
						|
 | 
						|
            if (this.attacker.getNavigator().getPath() != null)
 | 
						|
            {
 | 
						|
                PathPoint finalPathPoint = this.attacker.getNavigator().getPath().getFinalPathPoint();
 | 
						|
                if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.xCoord, finalPathPoint.yCoord, finalPathPoint.zCoord) < 1)
 | 
						|
                {
 | 
						|
                    failedPathFindingPenalty = 0;
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    failedPathFindingPenalty += 10;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                failedPathFindingPenalty += 10;
 | 
						|
            }
 | 
						|
 | 
						|
            if (d0 > 1024.0D)
 | 
						|
            {
 | 
						|
                this.field_75445_i += 10;
 | 
						|
            }
 | 
						|
            else if (d0 > 256.0D)
 | 
						|
            {
 | 
						|
                this.field_75445_i += 5;
 | 
						|
            }
 | 
						|
 | 
						|
            if (!this.attacker.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget))
 | 
						|
            {
 | 
						|
                this.field_75445_i += 15;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        this.attackTick = Math.max(this.attackTick - 1, 0);
 | 
						|
 | 
						|
        if (d0 <= d1 && this.attackTick <= 20)
 | 
						|
        {
 | 
						|
            this.attackTick = 20;
 | 
						|
 | 
						|
            if (this.attacker.getHeldItem() != null)
 | 
						|
            {
 | 
						|
                this.attacker.swingItem();
 | 
						|
            }
 | 
						|
 | 
						|
            this.attacker.attackEntityAsMob(entitylivingbase);
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |