From afbfe26fa04e06c8ee55a81089ec48ea27e5d896 Mon Sep 17 00:00:00 2001 From: SpaceToad Date: Mon, 16 Jun 2014 02:59:43 +0200 Subject: [PATCH] Factorised station scan code. Fixed world property analysis. --- api/buildcraft/api/robots/AIRobot.java | 1 - .../core/robots/AIRobotLookForStation.java | 71 +++++++++++++++++ .../core/robots/AIRobotRecharge.java | 47 ++++++------ .../core/robots/IStationFilter.java | 14 ++++ .../robots/boards/AIRobotFetchItemStack.java | 53 ++++++------- .../core/robots/boards/BoardRobotPicker.java | 76 +++++++++++++------ .../core/utils/WorldPropertyIsLeave.java | 17 ++++- .../core/utils/WorldPropertyIsWood.java | 16 +++- .../transport/BlockGenericPipe.java | 6 +- 9 files changed, 220 insertions(+), 81 deletions(-) create mode 100755 common/buildcraft/core/robots/AIRobotLookForStation.java create mode 100755 common/buildcraft/core/robots/IStationFilter.java diff --git a/api/buildcraft/api/robots/AIRobot.java b/api/buildcraft/api/robots/AIRobot.java index f5c58f4e02..461f2bbc16 100755 --- a/api/buildcraft/api/robots/AIRobot.java +++ b/api/buildcraft/api/robots/AIRobot.java @@ -69,7 +69,6 @@ public final void startDelegateAI(AIRobot ai) { public final void abortDelegateAI() { if (delegateAI != null) { delegateAI.terminate(); - delegateAI = null; } } } diff --git a/common/buildcraft/core/robots/AIRobotLookForStation.java b/common/buildcraft/core/robots/AIRobotLookForStation.java new file mode 100755 index 0000000000..55961550c1 --- /dev/null +++ b/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(); + } +} diff --git a/common/buildcraft/core/robots/AIRobotRecharge.java b/common/buildcraft/core/robots/AIRobotRecharge.java index 1ffb16fd08..8e37e5b3a5 100755 --- a/common/buildcraft/core/robots/AIRobotRecharge.java +++ b/common/buildcraft/core/robots/AIRobotRecharge.java @@ -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; @@ -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 (); } } } diff --git a/common/buildcraft/core/robots/IStationFilter.java b/common/buildcraft/core/robots/IStationFilter.java new file mode 100755 index 0000000000..c0d970c362 --- /dev/null +++ b/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); +} diff --git a/common/buildcraft/core/robots/boards/AIRobotFetchItemStack.java b/common/buildcraft/core/robots/boards/AIRobotFetchItemStack.java index a24e0fe62e..4d0766ad47 100755 --- a/common/buildcraft/core/robots/boards/AIRobotFetchItemStack.java +++ b/common/buildcraft/core/robots/boards/AIRobotFetchItemStack.java @@ -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 { @@ -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 @@ -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; + } + + } } diff --git a/common/buildcraft/core/robots/boards/BoardRobotPicker.java b/common/buildcraft/core/robots/boards/BoardRobotPicker.java index 174e040882..bf6a7ac053 100755 --- a/common/buildcraft/core/robots/boards/BoardRobotPicker.java +++ b/common/buildcraft/core/robots/boards/BoardRobotPicker.java @@ -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; @@ -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 { @@ -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); + } } } } @@ -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; + } + + + } } diff --git a/common/buildcraft/core/utils/WorldPropertyIsLeave.java b/common/buildcraft/core/utils/WorldPropertyIsLeave.java index de00f9c2c6..def5c6487f 100755 --- a/common/buildcraft/core/utils/WorldPropertyIsLeave.java +++ b/common/buildcraft/core/utils/WorldPropertyIsLeave.java @@ -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; } } diff --git a/common/buildcraft/core/utils/WorldPropertyIsWood.java b/common/buildcraft/core/utils/WorldPropertyIsWood.java index 0b91b642f9..07cca9f05d 100755 --- a/common/buildcraft/core/utils/WorldPropertyIsWood.java +++ b/common/buildcraft/core/utils/WorldPropertyIsWood.java @@ -24,6 +24,20 @@ public WorldPropertyIsWood() { @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)) == woodId; + if (block == null) { + return false; + } else { + ItemStack stack = new ItemStack(block); + + if (stack.getItem() != null) { + for (int id : OreDictionary.getOreIDs(stack)) { + if (id == woodId) { + return true; + } + } + } + } + + return false; } } diff --git a/common/buildcraft/transport/BlockGenericPipe.java b/common/buildcraft/transport/BlockGenericPipe.java index ac4c31e49b..bfac179c55 100644 --- a/common/buildcraft/transport/BlockGenericPipe.java +++ b/common/buildcraft/transport/BlockGenericPipe.java @@ -1179,9 +1179,9 @@ public void registerBlockIcons(IIconRegister iconRegister) { skippedFirstIconRegister = true; return; } - + BuildCraftTransport.instance.wireIconProvider.registerIcons(iconRegister); - + for (Item i : pipes.keySet()) { Pipe dummyPipe = createPipe(i); if (dummyPipe != null) { @@ -1317,7 +1317,7 @@ public int colorMultiplier(IBlockAccess world, int x, int y, int z) { if (facadeRenderColor != -1) { return facadeRenderColor; } - + return super.colorMultiplier(world, x, y, z); }