Skip to content

Commit

Permalink
Factorised station scan code.
Browse files Browse the repository at this point in the history
Fixed world property analysis.
  • Loading branch information
SpaceToad committed Jun 16, 2014
1 parent 6f8466a commit afbfe26
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 81 deletions.
1 change: 0 additions & 1 deletion api/buildcraft/api/robots/AIRobot.java
Expand Up @@ -69,7 +69,6 @@ public final void startDelegateAI(AIRobot ai) {
public final void abortDelegateAI() {
if (delegateAI != null) {
delegateAI.terminate();
delegateAI = null;
}
}
}
71 changes: 71 additions & 0 deletions common/buildcraft/core/robots/AIRobotLookForStation.java
@@ -0,0 +1,71 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* 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.core.robots;

import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.DockingStationRegistry;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.robots.IDockingStation;

public class AIRobotLookForStation extends AIRobot {

private DockingStation axeDocking = null;
private IStationFilter filter;

public AIRobotLookForStation(EntityRobotBase iRobot, IStationFilter iFilter) {
super(iRobot);

filter = iFilter;
}

@Override
public void start() {
if (robot.getDockingStation() != null
&& filter.matches((DockingStation) robot.getDockingStation())) {
terminate();
return;
}

// TODO: replace FetchItemStack and Recharge with this implementation

double potentialStationDistance = Float.MAX_VALUE;
DockingStation potentialStation = null;

for (IDockingStation d : DockingStationRegistry.getStations()) {
DockingStation station = (DockingStation) d;

if (station.reserved() != null) {
continue;
}

if (filter.matches(station)) {
double dx = robot.posX - d.x();
double dy = robot.posY - d.y();
double dz = robot.posZ - d.z();
double distance = dx * dx + dy + dy + dz * dz;

if (potentialStation == null || distance < potentialStationDistance) {
potentialStation = station;
potentialStationDistance = distance;
}
}
}

if (potentialStation != null) {
startDelegateAI(new AIRobotGoToDock(robot, potentialStation));
} else {
terminate();
}
}

@Override
public void delegateAIEnded(AIRobot ai) {
terminate();
}
}
47 changes: 23 additions & 24 deletions common/buildcraft/core/robots/AIRobotRecharge.java
Expand Up @@ -9,9 +9,7 @@
package buildcraft.core.robots;

import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.DockingStationRegistry;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.robots.IDockingStation;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.transport.PipeTransportPower;

Expand All @@ -24,32 +22,33 @@ public AIRobotRecharge(EntityRobotBase iRobot) {
}

@Override
public void update() {
if (robot.getDockingStation() == null
|| ((DockingStation) robot.getDockingStation()).pipe.getPipeType() != PipeType.POWER) {
public void start() {
startDelegateAI(new AIRobotLookForStation(robot, new IStationFilter() {
@Override
public boolean matches(DockingStation station) {
return station.pipe.getPipeType() == PipeType.POWER;
}
}));
}

for (IDockingStation d : DockingStationRegistry.getStations()) {
DockingStation station = (DockingStation) d;
@Override
public void update() {
PipeTransportPower powerProvider = (PipeTransportPower) ((DockingStation) robot.getDockingStation()).pipe.pipe.transport;

if (station.reserved() != null) {
continue;
}
powerProvider.requestEnergy(robot.getDockingStation().side(), 100);
robot.setEnergy(robot.getEnergy()
+ powerProvider.consumePower(robot.getDockingStation().side(), 100));

if (station.pipe.getPipeType() == PipeType.POWER) {
startDelegateAI(new AIRobotGoToDock(robot, station));
break;
}
}
} else {
PipeTransportPower powerProvider = (PipeTransportPower) ((DockingStation) robot.getDockingStation()).pipe.pipe.transport;

powerProvider.requestEnergy(robot.getDockingStation().side(), 100);
robot.setEnergy(robot.getEnergy()
+ powerProvider.consumePower(robot.getDockingStation().side(), 100));
if (robot.getEnergy() >= EntityRobotBase.MAX_ENERGY) {
terminate();
}
}

if (robot.getEnergy() >= EntityRobotBase.MAX_ENERGY) {
terminate();
}
@Override
public void delegateAIEnded(AIRobot ai) {
if (robot.getDockingStation() == null
|| !(((DockingStation) robot.getDockingStation()).pipe.pipe.transport instanceof PipeTransportPower)) {
terminate ();
}
}
}
14 changes: 14 additions & 0 deletions common/buildcraft/core/robots/IStationFilter.java
@@ -0,0 +1,14 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* 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.core.robots;

public interface IStationFilter {

boolean matches(DockingStation station);
}
53 changes: 27 additions & 26 deletions common/buildcraft/core/robots/boards/AIRobotFetchItemStack.java
Expand Up @@ -15,14 +15,13 @@
import net.minecraftforge.common.util.ForgeDirection;

import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.DockingStationRegistry;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.robots.IDockingStation;
import buildcraft.core.inventory.ITransactor;
import buildcraft.core.inventory.Transactor;
import buildcraft.core.inventory.filters.IStackFilter;
import buildcraft.core.robots.AIRobotGoToDock;
import buildcraft.core.robots.AIRobotLookForStation;
import buildcraft.core.robots.DockingStation;
import buildcraft.core.robots.IStationFilter;

public class AIRobotFetchItemStack extends AIRobot {

Expand All @@ -37,29 +36,7 @@ public AIRobotFetchItemStack(EntityRobotBase iRobot, IStackFilter iFilter) {

@Override
public void update() {
for (IDockingStation d : DockingStationRegistry.getStations()) {
DockingStation station = (DockingStation) d;

if (station.reserved() != null) {
continue;
}

for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
TileEntity nearbyTile = robot.worldObj.getTileEntity(d.x() + dir.offsetX, d.y()
+ dir.offsetY, d.z()
+ dir.offsetZ);

if (nearbyTile != null && nearbyTile instanceof IInventory) {
ITransactor trans = Transactor.getTransactorFor(nearbyTile);

if (trans.remove(filter, dir.getOpposite(), false) != null) {
stationToDock = station;
startDelegateAI(new AIRobotGoToDock(robot, stationToDock));
return;
}
}
}
}
startDelegateAI(new AIRobotLookForStation(robot, new StationFilter()));
}

@Override
Expand Down Expand Up @@ -87,4 +64,28 @@ public void delegateAIEnded(AIRobot ai) {
terminate();
}
}

private class StationFilter implements IStationFilter {

@Override
public boolean matches(DockingStation station) {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
TileEntity nearbyTile = robot.worldObj.getTileEntity(station.x() + dir.offsetX, station.y()
+ dir.offsetY, station.z()
+ dir.offsetZ);

if (nearbyTile != null && nearbyTile instanceof IInventory) {
ITransactor trans = Transactor.getTransactorFor(nearbyTile);

if (trans.remove(filter, dir.getOpposite(), false) != null) {
stationToDock = station;
return true;
}
}
}

return false;
}

}
}
76 changes: 52 additions & 24 deletions common/buildcraft/core/robots/boards/BoardRobotPicker.java
Expand Up @@ -11,8 +11,12 @@
import java.util.HashSet;
import java.util.Set;

import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;

import net.minecraftforge.common.util.ForgeDirection;

import buildcraft.api.boards.IBoardParameter;
import buildcraft.api.boards.IBoardParameterStack;
Expand All @@ -23,13 +27,13 @@
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.core.inventory.ITransactor;
import buildcraft.core.inventory.Transactor;
import buildcraft.core.inventory.filters.ArrayStackFilter;
import buildcraft.core.inventory.filters.IStackFilter;
import buildcraft.core.robots.AIRobotGoToDock;
import buildcraft.core.robots.AIRobotLookForStation;
import buildcraft.core.robots.DockingStation;
import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TileGenericPipe;
import buildcraft.transport.TravelingItem;
import buildcraft.core.robots.IStationFilter;

public class BoardRobotPicker extends RedstoneBoardRobot {

Expand Down Expand Up @@ -81,39 +85,36 @@ public void delegateAIEnded(AIRobot ai) {
// if we could get an item, let's try to get another one
startDelegateAI(new AIRobotFetchItem(robot, range, stackFilter));
} else {
// otherwise, let's return to base
startDelegateAI(new AIRobotGoToDock(robot, (DockingStation) robot.getLinkedStation()));
// otherwise, let's deliver items
startDelegateAI(new AIRobotLookForStation(robot, new StationInventory()));
}
} else if (ai instanceof AIRobotGoToDock) {
emptyContainerInStation();
} else if (ai instanceof AIRobotLookForStation) {
emptyContainerInInventory();
}
}

private void emptyContainerInStation() {
private void emptyContainerInInventory() {
DockingStation station = (DockingStation) robot.getDockingStation();

if (station == null) {
return;
}

TileGenericPipe pipe = (TileGenericPipe) robot.worldObj
.getTileEntity(station.pipe.xCoord, station.pipe.yCoord, station.pipe.zCoord);

if (pipe != null && pipe.pipe.transport instanceof PipeTransportItems) {
for (int i = 0; i < robot.getSizeInventory(); ++i) {
if (robot.getStackInSlot(i) != null) {
float cx = station.pipe.xCoord + 0.5F + 0.2F * station.side.offsetX;
float cy = station.pipe.yCoord + 0.5F + 0.2F * station.side.offsetY;
float cz = station.pipe.zCoord + 0.5F + 0.2F * station.side.offsetZ;
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
TileEntity nearbyTile = robot.worldObj.getTileEntity(station.x() + dir.offsetX, station.y()
+ dir.offsetY, station.z()
+ dir.offsetZ);

TravelingItem item = TravelingItem.make(cx, cy,
cz, robot.getStackInSlot(i));
if (nearbyTile != null && nearbyTile instanceof IInventory) {
ITransactor trans = Transactor.getTransactorFor(nearbyTile);

((PipeTransportItems) pipe.pipe.transport).injectItem(item, station.side.getOpposite());
for (int i = 0; i < robot.getSizeInventory(); ++i) {
ItemStack stackToAdd = robot.getStackInSlot(i);

robot.setInventorySlotContents(i, null);

break;
if (stackToAdd != null) {
ItemStack added = trans.add(stackToAdd, dir, true);
robot.decrStackSize(i, added.stackSize);
}
}
}
}
Expand All @@ -123,4 +124,31 @@ private void emptyContainerInStation() {
public RedstoneBoardRobotNBT getNBTHandler() {
return BoardRobotPickerNBT.instance;
}

private class StationInventory implements IStationFilter {
@Override
public boolean matches(DockingStation station) {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
TileEntity nearbyTile = robot.worldObj.getTileEntity(station.x() + dir.offsetX, station.y()
+ dir.offsetY, station.z()
+ dir.offsetZ);

if (nearbyTile != null && nearbyTile instanceof IInventory) {
ITransactor trans = Transactor.getTransactorFor(nearbyTile);

for (int i = 0; i < robot.getSizeInventory(); ++i) {
ItemStack stackToAdd = robot.getStackInSlot(i);

if (stackToAdd != null && trans.add(stackToAdd, dir, false) != null) {
return true;
}
}
}
}

return false;
}


}
}
17 changes: 15 additions & 2 deletions common/buildcraft/core/utils/WorldPropertyIsLeave.java
Expand Up @@ -24,7 +24,20 @@ public WorldPropertyIsLeave() {

@Override
public boolean get(IBlockAccess blockAccess, Block block, int meta, int x, int y, int z) {
return block != null
&& OreDictionary.getOreID(new ItemStack(block, 1, OreDictionary.WILDCARD_VALUE)) == leavesId;
if (block == null) {
return false;
} else {
ItemStack stack = new ItemStack(block);

if (stack.getItem() != null) {
for (int id : OreDictionary.getOreIDs(stack)) {
if (id == leavesId) {
return true;
}
}
}
}

return false;
}
}

0 comments on commit afbfe26

Please sign in to comment.