/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * BuildCraft is distributed under the terms of the Minecraft Mod Public * License 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.robotics.ai; import net.minecraft.entity.Entity; import buildcraft.api.blueprints.BuilderAPI; import buildcraft.api.robots.AIRobot; import buildcraft.api.robots.EntityRobotBase; import buildcraft.robotics.EntityRobot; public class AIRobotAttack extends AIRobot { private Entity target; private int delay = 10; public AIRobotAttack(EntityRobotBase iRobot) { super(iRobot); } public AIRobotAttack(EntityRobotBase iRobot, Entity iTarget) { this(iRobot); target = iTarget; } @Override public void preempt(AIRobot ai) { if (ai instanceof AIRobotGotoBlock) { // target may become null in the event of a load. In that case, just // go to the expected location. if (target != null && robot.getDistanceToEntity(target) <= 2.0) { abortDelegateAI(); robot.setItemActive(true); } } } @Override public void update() { if (target == null || target.isDead) { terminate(); return; } if (robot.getDistanceToEntity(target) > 2.0) { startDelegateAI(new AIRobotGotoBlock(robot, (int) Math.floor(target.posX), (int) Math.floor(target.posY), (int) Math.floor(target.posZ))); robot.setItemActive(false); return; } delay++; if (delay > 20) { delay = 0; ((EntityRobot) robot).attackTargetEntityWithCurrentItem(target); robot.aimItemAt((int) Math.floor(target.posX), (int) Math.floor(target.posY), (int) Math.floor(target.posZ)); } } @Override public void end() { robot.setItemActive(false); } @Override public void delegateAIEnded(AIRobot ai) { if (ai instanceof AIRobotGotoBlock) { if (!ai.success()) { robot.unreachableEntityDetected(target); } terminate(); } } @Override public int getEnergyCost() { return BuilderAPI.BREAK_ENERGY * 2 / 20; } }