made progress for builder robot, for #1920
This commit is contained in:
parent
23d46e2bce
commit
b71fe3cce8
8 changed files with 73 additions and 3 deletions
|
@ -11,5 +11,7 @@ package buildcraft.api.blueprints;
|
||||||
import net.minecraft.inventory.IInventory;
|
import net.minecraft.inventory.IInventory;
|
||||||
|
|
||||||
public interface ITileBuilder extends IInventory {
|
public interface ITileBuilder extends IInventory {
|
||||||
|
|
||||||
boolean isBuildingMaterialSlot(int i);
|
boolean isBuildingMaterialSlot(int i);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,9 @@ import buildcraft.api.core.Position;
|
||||||
import buildcraft.core.blueprints.BuildingSlot;
|
import buildcraft.core.blueprints.BuildingSlot;
|
||||||
import buildcraft.core.blueprints.BuildingSlotBlock;
|
import buildcraft.core.blueprints.BuildingSlotBlock;
|
||||||
import buildcraft.core.blueprints.BuildingSlotEntity;
|
import buildcraft.core.blueprints.BuildingSlotEntity;
|
||||||
import buildcraft.core.blueprints.IBuilder;
|
import buildcraft.core.blueprints.IBuilingItem;
|
||||||
|
|
||||||
public class BuildingItem implements IBuilder {
|
public class BuildingItem implements IBuilingItem {
|
||||||
|
|
||||||
private static int ITEMS_SPACE = 2;
|
private static int ITEMS_SPACE = 2;
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ import buildcraft.core.TileBuildCraft;
|
||||||
import buildcraft.core.blueprints.Blueprint;
|
import buildcraft.core.blueprints.Blueprint;
|
||||||
import buildcraft.core.blueprints.BptBuilderBase;
|
import buildcraft.core.blueprints.BptBuilderBase;
|
||||||
import buildcraft.core.blueprints.BptBuilderBlueprint;
|
import buildcraft.core.blueprints.BptBuilderBlueprint;
|
||||||
|
import buildcraft.core.blueprints.BptContext;
|
||||||
|
|
||||||
public class TileConstructionMarker extends TileBuildCraft implements IBuildingItemsProvider {
|
public class TileConstructionMarker extends TileBuildCraft implements IBuildingItemsProvider {
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ public class TileConstructionMarker extends TileBuildCraft implements IBuildingI
|
||||||
public ItemStack itemBlueprint;
|
public ItemStack itemBlueprint;
|
||||||
|
|
||||||
public BptBuilderBase bluePrintBuilder;
|
public BptBuilderBase bluePrintBuilder;
|
||||||
|
public BptContext bptContext;
|
||||||
|
|
||||||
private ArrayList<BuildingItem> buildersInAction = new ArrayList<BuildingItem>();
|
private ArrayList<BuildingItem> buildersInAction = new ArrayList<BuildingItem>();
|
||||||
private NBTTagCompound initNBT;
|
private NBTTagCompound initNBT;
|
||||||
|
@ -52,6 +54,7 @@ public class TileConstructionMarker extends TileBuildCraft implements IBuildingI
|
||||||
if (itemBlueprint != null && bluePrintBuilder == null) {
|
if (itemBlueprint != null && bluePrintBuilder == null) {
|
||||||
bluePrintBuilder = new BptBuilderBlueprint((Blueprint) ItemBlueprint.loadBlueprint(itemBlueprint),
|
bluePrintBuilder = new BptBuilderBlueprint((Blueprint) ItemBlueprint.loadBlueprint(itemBlueprint),
|
||||||
worldObj, xCoord, yCoord, zCoord);
|
worldObj, xCoord, yCoord, zCoord);
|
||||||
|
bptContext = bluePrintBuilder.getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (laser == null && direction != ForgeDirection.UNKNOWN) {
|
if (laser == null && direction != ForgeDirection.UNKNOWN) {
|
||||||
|
@ -137,4 +140,8 @@ public class TileConstructionMarker extends TileBuildCraft implements IBuildingI
|
||||||
public boolean needsToBuild() {
|
public boolean needsToBuild() {
|
||||||
return bluePrintBuilder != null && !bluePrintBuilder.isDone(this);
|
return bluePrintBuilder != null && !bluePrintBuilder.isDone(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BptContext getContext () {
|
||||||
|
return bptContext;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,4 +64,5 @@ public abstract class BuildingSlot {
|
||||||
public abstract void readFromNBT(NBTTagCompound nbt, MappingRegistry registry) throws MappingNotFoundException;
|
public abstract void readFromNBT(NBTTagCompound nbt, MappingRegistry registry) throws MappingNotFoundException;
|
||||||
|
|
||||||
public abstract double getEnergyRequirement();
|
public abstract double getEnergyRequirement();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,4 +173,5 @@ public class BuildingSlotBlock extends BuildingSlot {
|
||||||
public double getEnergyRequirement() {
|
public double getEnergyRequirement() {
|
||||||
return schematic.getEnergyRequirement(stackConsumed);
|
return schematic.getEnergyRequirement(stackConsumed);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,6 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.core.blueprints;
|
package buildcraft.core.blueprints;
|
||||||
|
|
||||||
public interface IBuilder {
|
public interface IBuilingItem {
|
||||||
boolean isDone();
|
boolean isDone();
|
||||||
}
|
}
|
|
@ -35,6 +35,7 @@ import buildcraft.api.boards.RedstoneBoardRobot;
|
||||||
import buildcraft.api.boards.RedstoneBoardRobotNBT;
|
import buildcraft.api.boards.RedstoneBoardRobotNBT;
|
||||||
import buildcraft.api.core.IBox;
|
import buildcraft.api.core.IBox;
|
||||||
import buildcraft.api.core.SafeTimeTracker;
|
import buildcraft.api.core.SafeTimeTracker;
|
||||||
|
import buildcraft.api.mj.MjBattery;
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
import buildcraft.api.robots.IDockingStation;
|
import buildcraft.api.robots.IDockingStation;
|
||||||
|
@ -88,6 +89,7 @@ public class EntityRobot extends EntityRobotBase implements
|
||||||
private IDockingStation currentDockingStation;
|
private IDockingStation currentDockingStation;
|
||||||
private WeakHashMap<Entity, Boolean> unreachableEntities = new WeakHashMap<Entity, Boolean>();
|
private WeakHashMap<Entity, Boolean> unreachableEntities = new WeakHashMap<Entity, Boolean>();
|
||||||
|
|
||||||
|
@MjBattery
|
||||||
private double mjStored;
|
private double mjStored;
|
||||||
|
|
||||||
public EntityRobot(World world, NBTTagCompound boardNBT) {
|
public EntityRobot(World world, NBTTagCompound boardNBT) {
|
||||||
|
|
|
@ -8,18 +8,27 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.core.robots.boards;
|
package buildcraft.core.robots.boards;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import buildcraft.api.boards.RedstoneBoardRobot;
|
import buildcraft.api.boards.RedstoneBoardRobot;
|
||||||
import buildcraft.api.boards.RedstoneBoardRobotNBT;
|
import buildcraft.api.boards.RedstoneBoardRobotNBT;
|
||||||
import buildcraft.api.robots.AIRobot;
|
import buildcraft.api.robots.AIRobot;
|
||||||
import buildcraft.api.robots.EntityRobotBase;
|
import buildcraft.api.robots.EntityRobotBase;
|
||||||
import buildcraft.builders.TileConstructionMarker;
|
import buildcraft.builders.TileConstructionMarker;
|
||||||
import buildcraft.core.blueprints.BuildingSlot;
|
import buildcraft.core.blueprints.BuildingSlot;
|
||||||
|
import buildcraft.core.inventory.filters.ArrayStackFilter;
|
||||||
|
import buildcraft.core.robots.AIRobotGotoBlock;
|
||||||
import buildcraft.core.robots.AIRobotGotoSleep;
|
import buildcraft.core.robots.AIRobotGotoSleep;
|
||||||
|
import buildcraft.core.robots.AIRobotGotoStationToLoad;
|
||||||
|
import buildcraft.core.robots.AIRobotLoad;
|
||||||
|
|
||||||
public class BoardRobotBuilder extends RedstoneBoardRobot {
|
public class BoardRobotBuilder extends RedstoneBoardRobot {
|
||||||
|
|
||||||
private TileConstructionMarker markerToBuild;
|
private TileConstructionMarker markerToBuild;
|
||||||
private BuildingSlot currentBuildingSlot;
|
private BuildingSlot currentBuildingSlot;
|
||||||
|
private LinkedList<ItemStack> requirementsToLookFor;
|
||||||
|
|
||||||
public BoardRobotBuilder(EntityRobotBase iRobot) {
|
public BoardRobotBuilder(EntityRobotBase iRobot) {
|
||||||
super(iRobot);
|
super(iRobot);
|
||||||
|
@ -63,6 +72,54 @@ public class BoardRobotBuilder extends RedstoneBoardRobot {
|
||||||
|
|
||||||
if (currentBuildingSlot == null) {
|
if (currentBuildingSlot == null) {
|
||||||
currentBuildingSlot = markerToBuild.bluePrintBuilder.reserveNextSlot(robot.worldObj);
|
currentBuildingSlot = markerToBuild.bluePrintBuilder.reserveNextSlot(robot.worldObj);
|
||||||
|
|
||||||
|
if (currentBuildingSlot != null) {
|
||||||
|
requirementsToLookFor = currentBuildingSlot.getRequirements(markerToBuild.getContext());
|
||||||
|
} else {
|
||||||
|
startDelegateAI(new AIRobotGotoSleep(robot));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: what if there's more requirements that this robot can
|
||||||
|
// handle e.g. not enough free spots?
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requirementsToLookFor != null && requirementsToLookFor.size() > 0) {
|
||||||
|
startDelegateAI(new AIRobotGotoStationToLoad(robot,
|
||||||
|
new ArrayStackFilter(requirementsToLookFor.getFirst()),
|
||||||
|
robot.getAreaToWork()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentBuildingSlot != null && requirementsToLookFor != null && requirementsToLookFor.size() == 0) {
|
||||||
|
// TODO: It's probably OK to get at least X units away from
|
||||||
|
// destination. something to handle at the path-finding level (e.g.
|
||||||
|
// end computation) to be brought up to here as a parameter.
|
||||||
|
startDelegateAI(new AIRobotGotoBlock(robot,
|
||||||
|
(int) currentBuildingSlot.getDestination().x,
|
||||||
|
(int) currentBuildingSlot.getDestination().y,
|
||||||
|
(int) currentBuildingSlot.getDestination().z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delegateAIEnded(AIRobot ai) {
|
||||||
|
if (ai instanceof AIRobotGotoStationToLoad) {
|
||||||
|
if (((AIRobotGotoStationToLoad) ai).found) {
|
||||||
|
// TODO: How to load only the required amount of items there?
|
||||||
|
startDelegateAI(new AIRobotLoad(robot, new ArrayStackFilter(requirementsToLookFor.getFirst())));
|
||||||
|
} else {
|
||||||
|
startDelegateAI(new AIRobotGotoSleep(robot));
|
||||||
|
}
|
||||||
|
} else if (ai instanceof AIRobotLoad) {
|
||||||
|
// TODO: check that we get the proper items in
|
||||||
|
requirementsToLookFor.removeFirst();
|
||||||
|
} else if (ai instanceof AIRobotGotoBlock) {
|
||||||
|
// TODO: here we want to start the animation, and to update the
|
||||||
|
// builder state (remove slot from list, add to post processing,
|
||||||
|
// etc);
|
||||||
|
currentBuildingSlot.writeToWorld(markerToBuild.getContext());
|
||||||
|
currentBuildingSlot = null;
|
||||||
|
requirementsToLookFor = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue