001package net.minecraft.entity.ai; 002 003import java.util.Iterator; 004import java.util.List; 005import net.minecraft.entity.EntityLiving; 006import net.minecraft.entity.passive.EntityVillager; 007import net.minecraft.util.Vec3; 008 009public class EntityAIPlay extends EntityAIBase 010{ 011 private EntityVillager villagerObj; 012 private EntityLiving targetVillager; 013 private float field_75261_c; 014 private int playTime; 015 016 public EntityAIPlay(EntityVillager par1EntityVillager, float par2) 017 { 018 this.villagerObj = par1EntityVillager; 019 this.field_75261_c = par2; 020 this.setMutexBits(1); 021 } 022 023 /** 024 * Returns whether the EntityAIBase should begin execution. 025 */ 026 public boolean shouldExecute() 027 { 028 if (this.villagerObj.getGrowingAge() >= 0) 029 { 030 return false; 031 } 032 else if (this.villagerObj.getRNG().nextInt(400) != 0) 033 { 034 return false; 035 } 036 else 037 { 038 List list = this.villagerObj.worldObj.getEntitiesWithinAABB(EntityVillager.class, this.villagerObj.boundingBox.expand(6.0D, 3.0D, 6.0D)); 039 double d0 = Double.MAX_VALUE; 040 Iterator iterator = list.iterator(); 041 042 while (iterator.hasNext()) 043 { 044 EntityVillager entityvillager = (EntityVillager)iterator.next(); 045 046 if (entityvillager != this.villagerObj && !entityvillager.isPlaying() && entityvillager.getGrowingAge() < 0) 047 { 048 double d1 = entityvillager.getDistanceSqToEntity(this.villagerObj); 049 050 if (d1 <= d0) 051 { 052 d0 = d1; 053 this.targetVillager = entityvillager; 054 } 055 } 056 } 057 058 if (this.targetVillager == null) 059 { 060 Vec3 vec3 = RandomPositionGenerator.findRandomTarget(this.villagerObj, 16, 3); 061 062 if (vec3 == null) 063 { 064 return false; 065 } 066 } 067 068 return true; 069 } 070 } 071 072 /** 073 * Returns whether an in-progress EntityAIBase should continue executing 074 */ 075 public boolean continueExecuting() 076 { 077 return this.playTime > 0; 078 } 079 080 /** 081 * Execute a one shot task or start executing a continuous task 082 */ 083 public void startExecuting() 084 { 085 if (this.targetVillager != null) 086 { 087 this.villagerObj.setPlaying(true); 088 } 089 090 this.playTime = 1000; 091 } 092 093 /** 094 * Resets the task 095 */ 096 public void resetTask() 097 { 098 this.villagerObj.setPlaying(false); 099 this.targetVillager = null; 100 } 101 102 /** 103 * Updates the task 104 */ 105 public void updateTask() 106 { 107 --this.playTime; 108 109 if (this.targetVillager != null) 110 { 111 if (this.villagerObj.getDistanceSqToEntity(this.targetVillager) > 4.0D) 112 { 113 this.villagerObj.getNavigator().tryMoveToEntityLiving(this.targetVillager, this.field_75261_c); 114 } 115 } 116 else if (this.villagerObj.getNavigator().noPath()) 117 { 118 Vec3 vec3 = RandomPositionGenerator.findRandomTarget(this.villagerObj, 16, 3); 119 120 if (vec3 == null) 121 { 122 return; 123 } 124 125 this.villagerObj.getNavigator().tryMoveToXYZ(vec3.xCoord, vec3.yCoord, vec3.zCoord, this.field_75261_c); 126 } 127 } 128}