diff --git a/common/mekanism/common/EntityRobit.java b/common/mekanism/common/EntityRobit.java index 1befb90d6..0b9335059 100644 --- a/common/mekanism/common/EntityRobit.java +++ b/common/mekanism/common/EntityRobit.java @@ -56,11 +56,12 @@ public class EntityRobit extends EntityCreature implements IInventory, ISustaine setSize(0.5F, 0.5F); getNavigator().setAvoidsWater(true); - - tasks.addTask(1, new RobitAIFollow(this, 1.0F, 10.0F, 2.0F)); - tasks.addTask(2, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - tasks.addTask(2, new EntityAILookIdle(this)); - tasks.addTask(3, new EntityAISwimming(this)); + + tasks.addTask(1, new RobitAIPickup(this, 1.0F)); + tasks.addTask(2, new RobitAIFollow(this, 1.0F, 10.0F, 2.0F)); + tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + tasks.addTask(3, new EntityAILookIdle(this)); + tasks.addTask(4, new EntityAISwimming(this)); setAlwaysRenderNameTag(true); } diff --git a/common/mekanism/common/RobitAIPickup.java b/common/mekanism/common/RobitAIPickup.java new file mode 100644 index 000000000..fc040bdb5 --- /dev/null +++ b/common/mekanism/common/RobitAIPickup.java @@ -0,0 +1,157 @@ +package mekanism.common; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.pathfinding.PathNavigate; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +public class RobitAIPickup extends EntityAIBase +{ + + //Written by pixlepix (I'm in mekanism! Yay!) + //Boilerplate copied from RobitAIFollow + /** The robit entity. */ + private EntityRobit theRobit; + + + /** The world the robit is located in. */ + private World theWorld; + + /** How fast the robit can travel. */ + private float moveSpeed; + + /** The robit's pathfinder. */ + private PathNavigate thePathfinder; + + /** The ticker for updates. */ + private int ticker; + + + + /** Whether or not this robit avoids water. */ + private boolean avoidWater; + private EntityItem closest; + + public RobitAIPickup(EntityRobit entityRobit, float speed) + { + theRobit = entityRobit; + theWorld = entityRobit.worldObj; + moveSpeed = speed; + thePathfinder = entityRobit.getNavigator(); + setMutexBits(3); + } + + @Override + public boolean shouldExecute() + { + EntityPlayer player = theRobit.getOwner(); + + if(player == null) + { + return false; + } + if(!theRobit.getDropPickup()){ + return false; + } + else if(theRobit.worldObj.provider.dimensionId != player.worldObj.provider.dimensionId) + { + return false; + } + if(closest!=null&&closest.getDistanceSqToEntity(closest)>100&&this.thePathfinder.getPathToXYZ(closest.posX, closest.posY, closest.posZ)!=null){ + return true; + } + + List items=theRobit.worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(theRobit.posX-10, theRobit.posY-10, theRobit.posZ-10, theRobit.posX+10, theRobit.posY+10, theRobit.posZ+10)); + Iterator iter=items.iterator(); + //Cached for slight performance + double closestDistance=-1; + while(iter.hasNext()){ + + EntityItem entity=(EntityItem) iter.next(); + double distance=theRobit.getDistanceSqToEntity(entity); + if(distance<100){ + if(closestDistance==-1||distance (100) && theRobit.getFollowing() && theRobit.getEnergy() > 0 && closest.worldObj.provider.dimensionId == theRobit.worldObj.provider.dimensionId; + } + + @Override + public void startExecuting() + { + ticker = 0; + avoidWater = theRobit.getNavigator().getAvoidsWater(); + theRobit.getNavigator().setAvoidsWater(false); + } + + @Override + public void resetTask() + { + thePathfinder.clearPathEntity(); + theRobit.getNavigator().setAvoidsWater(avoidWater); + } + + @Override + public void updateTask() + { + + System.out.println(6); + theRobit.getLookHelper().setLookPositionWithEntity(closest, 6.0F, theRobit.getVerticalFaceSpeed()/10); + if(!theRobit.getDropPickup()){ + return; + } + + if(--ticker <= 0) + { + ticker = 10; + + if(!thePathfinder.tryMoveToEntityLiving(closest, moveSpeed)) + { + if(theRobit.getDistanceSqToEntity(closest) >= 144.0D) + { + int x = MathHelper.floor_double(closest.posX) - 2; + int y = MathHelper.floor_double(closest.posZ) - 2; + int z = MathHelper.floor_double(closest.boundingBox.minY); + + for(int l = 0; l <= 4; ++l) + { + for(int i1 = 0; i1 <= 4; ++i1) + { + if((l < 1 || i1 < 1 || l > 3 || i1 > 3) && theWorld.doesBlockHaveSolidTopSurface(x + l, z - 1, y + i1) && !theWorld.isBlockNormalCube(x + l, z, y + i1) && !theWorld.isBlockNormalCube(x + l, z + 1, y + i1)) + { + + System.out.println(7); + theRobit.setLocationAndAngles((x + l) + 0.5F, z, (y + i1) + 0.5F, theRobit.rotationYaw, theRobit.rotationPitch); + thePathfinder.clearPathEntity(); + return; + } + } + } + } + + } + } + } +} \ No newline at end of file