From 2c69299172998b1c1a5752cf405c4d253a0b0a20 Mon Sep 17 00:00:00 2001 From: SpaceToad Date: Sat, 16 Aug 2014 18:03:20 +0200 Subject: [PATCH] finish first implementation of fluid transporter, #1985 --- .../api/robots/EntityRobotBase.java | 4 +- .../assets/buildcraft/lang/en_US.lang | 1 + common/buildcraft/BuildCraftSilicon.java | 5 + .../AIRobotGotoStationAndLoadFluids.java | 51 ++++++++ .../AIRobotGotoStationAndUnloadFluids.java | 51 ++++++++ .../core/robots/AIRobotGotoStationToLoad.java | 2 +- .../AIRobotGotoStationToLoadFluids.java | 105 +++++++++++++++ .../AIRobotGotoStationToUnloadFluids.java | 106 +++++++++++++++ .../core/robots/AIRobotLoadFluids.java | 114 +++++++++++++++++ .../core/robots/AIRobotUnloadFluids.java | 121 ++++++++++++++++++ .../buildcraft/core/robots/EntityRobot.java | 111 +++++++++++++++- .../robots/boards/BoardRobotFluidCarrier.java | 45 +++++++ .../boards/BoardRobotFluidCarrierNBT.java | 64 +++++++++ 13 files changed, 776 insertions(+), 4 deletions(-) create mode 100755 common/buildcraft/core/robots/AIRobotGotoStationAndLoadFluids.java create mode 100755 common/buildcraft/core/robots/AIRobotGotoStationAndUnloadFluids.java create mode 100755 common/buildcraft/core/robots/AIRobotGotoStationToLoadFluids.java create mode 100755 common/buildcraft/core/robots/AIRobotGotoStationToUnloadFluids.java create mode 100755 common/buildcraft/core/robots/AIRobotLoadFluids.java create mode 100755 common/buildcraft/core/robots/AIRobotUnloadFluids.java create mode 100755 common/buildcraft/core/robots/boards/BoardRobotFluidCarrier.java create mode 100755 common/buildcraft/core/robots/boards/BoardRobotFluidCarrierNBT.java diff --git a/api/buildcraft/api/robots/EntityRobotBase.java b/api/buildcraft/api/robots/EntityRobotBase.java index f9a12972..bfbd228d 100755 --- a/api/buildcraft/api/robots/EntityRobotBase.java +++ b/api/buildcraft/api/robots/EntityRobotBase.java @@ -14,10 +14,12 @@ import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import net.minecraftforge.fluids.IFluidHandler; + import buildcraft.api.boards.RedstoneBoardRobot; import buildcraft.api.core.IZone; -public abstract class EntityRobotBase extends EntityLiving implements IInventory { +public abstract class EntityRobotBase extends EntityLiving implements IInventory, IFluidHandler { public static final double MAX_ENERGY = 10000; public static final double SAFETY_ENERGY = MAX_ENERGY / 4; diff --git a/buildcraft_resources/assets/buildcraft/lang/en_US.lang b/buildcraft_resources/assets/buildcraft/lang/en_US.lang index e035349e..de02b70f 100755 --- a/buildcraft_resources/assets/buildcraft/lang/en_US.lang +++ b/buildcraft_resources/assets/buildcraft/lang/en_US.lang @@ -5,6 +5,7 @@ buildcraft.boardRobotLumberjack=Lumberjack buildcraft.boardRobotPlanter=Planter buildcraft.boardRobotLeaveCutter=Leave Cutter buildcraft.boardRobotCarrier=Carrier +buildcraft.boardRobotFluidCarrier=Tank buildcraft.boardRobotBomber=Bomber buildcraft.boardRobotKnight=Knight buildcraft.boardRobotMiner=Miner diff --git a/common/buildcraft/BuildCraftSilicon.java b/common/buildcraft/BuildCraftSilicon.java index 8d0a8a28..889fc4fa 100644 --- a/common/buildcraft/BuildCraftSilicon.java +++ b/common/buildcraft/BuildCraftSilicon.java @@ -54,6 +54,7 @@ import buildcraft.core.robots.boards.BoardRobotCarrierNBT; import buildcraft.core.robots.boards.BoardRobotCrafterNBT; import buildcraft.core.robots.boards.BoardRobotDeliveryNBT; import buildcraft.core.robots.boards.BoardRobotFarmerNBT; +import buildcraft.core.robots.boards.BoardRobotFluidCarrierNBT; import buildcraft.core.robots.boards.BoardRobotHarvesterNBT; import buildcraft.core.robots.boards.BoardRobotKnightNBT; import buildcraft.core.robots.boards.BoardRobotLeaveCutterNBT; @@ -216,6 +217,8 @@ public class BuildCraftSilicon extends BuildCraftMod { RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotLumberjackNBT.instance, 10); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotHarvesterNBT.instance, 10); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotMinerNBT.instance, 10); + + RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotFluidCarrierNBT.instance, 5); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotPlanterNBT.instance, 5); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotFarmerNBT.instance, 5); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotLeaveCutterNBT.instance, 5); @@ -223,8 +226,10 @@ public class BuildCraftSilicon extends BuildCraftMod { RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotShovelmanNBT.instance, 5); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotCrafterNBT.instance, 5); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotDeliveryNBT.instance, 5); + RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotKnightNBT.instance, 1); RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotBomberNBT.instance, 1); + RedstoneBoardRegistry.instance.registerBoardClass(BoardRobotBuilderNBT.instance, 0.5F); StatementManager.registerActionProvider(new RobotsActionProvider()); diff --git a/common/buildcraft/core/robots/AIRobotGotoStationAndLoadFluids.java b/common/buildcraft/core/robots/AIRobotGotoStationAndLoadFluids.java new file mode 100755 index 00000000..8a9d96c8 --- /dev/null +++ b/common/buildcraft/core/robots/AIRobotGotoStationAndLoadFluids.java @@ -0,0 +1,51 @@ +/** + * 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.core.IZone; +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; + +public class AIRobotGotoStationAndLoadFluids extends AIRobot { + + private boolean found = false; + private IZone zone; + + public AIRobotGotoStationAndLoadFluids(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotGotoStationAndLoadFluids(EntityRobotBase iRobot, IZone iZone) { + super(iRobot); + + zone = iZone; + } + + @Override + public void start() { + startDelegateAI(new AIRobotGotoStationToLoadFluids(robot, zone)); + } + + @Override + public void delegateAIEnded(AIRobot ai) { + if (ai instanceof AIRobotGotoStationToLoadFluids) { + if (ai.success()) { + found = true; + startDelegateAI(new AIRobotLoadFluids(robot)); + } else { + terminate(); + } + } + } + + @Override + public boolean success() { + return found; + } +} diff --git a/common/buildcraft/core/robots/AIRobotGotoStationAndUnloadFluids.java b/common/buildcraft/core/robots/AIRobotGotoStationAndUnloadFluids.java new file mode 100755 index 00000000..a89ddedd --- /dev/null +++ b/common/buildcraft/core/robots/AIRobotGotoStationAndUnloadFluids.java @@ -0,0 +1,51 @@ +/** + * 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.core.IZone; +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; + +public class AIRobotGotoStationAndUnloadFluids extends AIRobot { + + private boolean found = false; + private IZone zone; + + public AIRobotGotoStationAndUnloadFluids(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotGotoStationAndUnloadFluids(EntityRobotBase iRobot, IZone iZone) { + super(iRobot); + + zone = iZone; + } + + @Override + public void start() { + startDelegateAI(new AIRobotGotoStationToUnloadFluids(robot, zone)); + } + + @Override + public void delegateAIEnded(AIRobot ai) { + if (ai instanceof AIRobotGotoStationToUnloadFluids) { + if (ai.success()) { + found = true; + startDelegateAI(new AIRobotUnloadFluids(robot)); + } else { + terminate(); + } + } + } + + @Override + public boolean success() { + return found; + } +} diff --git a/common/buildcraft/core/robots/AIRobotGotoStationToLoad.java b/common/buildcraft/core/robots/AIRobotGotoStationToLoad.java index 1ed60f3e..0abc2216 100755 --- a/common/buildcraft/core/robots/AIRobotGotoStationToLoad.java +++ b/common/buildcraft/core/robots/AIRobotGotoStationToLoad.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team +drainable * 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 diff --git a/common/buildcraft/core/robots/AIRobotGotoStationToLoadFluids.java b/common/buildcraft/core/robots/AIRobotGotoStationToLoadFluids.java new file mode 100755 index 00000000..c9c126a7 --- /dev/null +++ b/common/buildcraft/core/robots/AIRobotGotoStationToLoadFluids.java @@ -0,0 +1,105 @@ +/** + * 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 net.minecraft.tileentity.TileEntity; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import buildcraft.api.core.IZone; +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.inventory.filters.StatementParameterStackFilter; +import buildcraft.silicon.statements.ActionStationProvideFluids; +import buildcraft.transport.Pipe; +import buildcraft.transport.gates.ActionIterator; +import buildcraft.transport.gates.ActionSlot; + +public class AIRobotGotoStationToLoadFluids extends AIRobot { + + private boolean found = false; + private IZone zone; + + public AIRobotGotoStationToLoadFluids(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotGotoStationToLoadFluids(EntityRobotBase iRobot, IZone iZone) { + super(iRobot); + + zone = iZone; + } + + @Override + public void update() { + startDelegateAI(new AIRobotSearchAndGotoStation(robot, new StationFilter(), zone)); + } + + @Override + public void delegateAIEnded(AIRobot ai) { + if (ai instanceof AIRobotSearchAndGotoStation) { + found = ai.success(); + + terminate(); + } + } + + @Override + public boolean success() { + return found; + } + + private class StationFilter implements IStationFilter { + + @Override + public boolean matches(DockingStation station) { + boolean actionFound = false; + + Pipe pipe = station.getPipe().pipe; + + for (ActionSlot s : new ActionIterator(pipe)) { + if (s.action instanceof ActionStationProvideFluids) { + StatementParameterStackFilter param = new StatementParameterStackFilter(s.parameters); + + /* + * if (!param.hasFilter() || param.matches(filter)) { + * actionFound = true; break; } + */ + + actionFound = true; + break; + } + } + + if (!actionFound) { + return false; + } + + 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 IFluidHandler) { + IFluidHandler handler = (IFluidHandler) nearbyTile; + FluidStack drainable = handler.drain(station.side, 1, false); + + if (robot.canFill(ForgeDirection.UNKNOWN, drainable.getFluid())) { + return true; + } + } + } + + return false; + } + + } +} diff --git a/common/buildcraft/core/robots/AIRobotGotoStationToUnloadFluids.java b/common/buildcraft/core/robots/AIRobotGotoStationToUnloadFluids.java new file mode 100755 index 00000000..841ab1cb --- /dev/null +++ b/common/buildcraft/core/robots/AIRobotGotoStationToUnloadFluids.java @@ -0,0 +1,106 @@ +/** + * 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 net.minecraft.tileentity.TileEntity; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import buildcraft.api.core.IZone; +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.inventory.filters.StatementParameterStackFilter; +import buildcraft.silicon.statements.ActionStationAcceptFluids; +import buildcraft.transport.Pipe; +import buildcraft.transport.gates.ActionIterator; +import buildcraft.transport.gates.ActionSlot; + +public class AIRobotGotoStationToUnloadFluids extends AIRobot { + + private boolean found = false; + private IZone zone; + + public AIRobotGotoStationToUnloadFluids(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotGotoStationToUnloadFluids(EntityRobotBase iRobot, IZone iZone) { + super(iRobot); + + zone = iZone; + } + + @Override + public void update() { + startDelegateAI(new AIRobotSearchAndGotoStation(robot, new StationFilter(), zone)); + } + + @Override + public void delegateAIEnded(AIRobot ai) { + if (ai instanceof AIRobotSearchAndGotoStation) { + found = ((AIRobotSearchAndGotoStation) ai).targetStation != null; + + terminate(); + } + } + + @Override + public boolean success() { + return found; + } + + private class StationFilter implements IStationFilter { + + @Override + public boolean matches(DockingStation station) { + boolean actionFound = false; + + Pipe pipe = station.getPipe().pipe; + + for (ActionSlot s : new ActionIterator(pipe)) { + if (s.action instanceof ActionStationAcceptFluids) { + StatementParameterStackFilter param = new StatementParameterStackFilter(s.parameters); + + /* + * if (!param.hasFilter() || param.matches(filter)) { + * actionFound = true; break; } + */ + + actionFound = true; + break; + } + } + + if (!actionFound) { + return false; + } + + 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 IFluidHandler) { + IFluidHandler handler = (IFluidHandler) nearbyTile; + + FluidStack drainable = robot.drain(ForgeDirection.UNKNOWN, 1, false); + + if (handler.canFill(station.side, drainable.getFluid())) { + return true; + } + } + } + + return false; + } + + } +} diff --git a/common/buildcraft/core/robots/AIRobotLoadFluids.java b/common/buildcraft/core/robots/AIRobotLoadFluids.java new file mode 100755 index 00000000..9bda5e57 --- /dev/null +++ b/common/buildcraft/core/robots/AIRobotLoadFluids.java @@ -0,0 +1,114 @@ +/** + * 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 net.minecraft.tileentity.TileEntity; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.inventory.filters.IStackFilter; +import buildcraft.core.inventory.filters.StatementParameterStackFilter; +import buildcraft.silicon.statements.ActionStationProvideFluids; +import buildcraft.transport.Pipe; +import buildcraft.transport.gates.ActionIterator; +import buildcraft.transport.gates.ActionSlot; + +public class AIRobotLoadFluids extends AIRobot { + + private int loaded = 0; + private int waitedCycles = 0; + + public AIRobotLoadFluids(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotLoadFluids(EntityRobotBase iRobot, IStackFilter iFilter) { + super(iRobot); + } + + @Override + public void update() { + waitedCycles++; + + if (waitedCycles > 40) { + int previousLoaded = loaded; + doLoad(); + + if (loaded == previousLoaded) { + terminate(); + } else { + waitedCycles = 0; + } + } + } + + private void doLoad() { + if (robot.getDockingStation() != null) { + boolean actionFound = false; + + DockingStation station = (DockingStation) robot.getDockingStation(); + + Pipe pipe = station.getPipe().pipe; + + for (ActionSlot s : new ActionIterator(pipe)) { + if (s.action instanceof ActionStationProvideFluids) { + StatementParameterStackFilter param = new StatementParameterStackFilter(s.parameters); + + /* + * if (!param.hasFilter() || param.matches(filter)) { + * actionFound = true; break; } + */ + + actionFound = true; + break; + } + } + + if (!actionFound) { + return; + } + + 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 IFluidHandler) { + IFluidHandler handler = (IFluidHandler) nearbyTile; + FluidStack drainable = handler.drain(station.side, FluidContainerRegistry.BUCKET_VOLUME, false) + .copy(); + + int filled = robot.fill(ForgeDirection.UNKNOWN, drainable, true); + + if (filled > 0) { + drainable.amount = filled; + handler.drain(station.side, drainable, true); + loaded += filled; + return; + } + } + } + } + } + + @Override + public double getEnergyCost() { + return 2; + } + + @Override + public boolean success() { + return loaded > 0; + } +} diff --git a/common/buildcraft/core/robots/AIRobotUnloadFluids.java b/common/buildcraft/core/robots/AIRobotUnloadFluids.java new file mode 100755 index 00000000..4503a460 --- /dev/null +++ b/common/buildcraft/core/robots/AIRobotUnloadFluids.java @@ -0,0 +1,121 @@ +/** + * 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 net.minecraft.tileentity.TileEntity; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; + +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.inventory.filters.IStackFilter; +import buildcraft.core.inventory.filters.StatementParameterStackFilter; +import buildcraft.silicon.statements.ActionStationAcceptFluids; +import buildcraft.transport.Pipe; +import buildcraft.transport.gates.ActionIterator; +import buildcraft.transport.gates.ActionSlot; + +public class AIRobotUnloadFluids extends AIRobot { + + private int unloaded = 0; + private int waitedCycles = 0; + + public AIRobotUnloadFluids(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotUnloadFluids(EntityRobotBase iRobot, IStackFilter iFilter) { + super(iRobot); + } + + @Override + public void update() { + waitedCycles++; + + if (waitedCycles > 40) { + int previousUnloaded = unloaded; + doLoad(); + + if (unloaded == previousUnloaded) { + terminate(); + } else { + waitedCycles = 0; + } + } + } + + private void doLoad() { + if (robot.getDockingStation() != null) { + boolean actionFound = false; + + DockingStation station = (DockingStation) robot.getDockingStation(); + + Pipe pipe = station.getPipe().pipe; + + for (ActionSlot s : new ActionIterator(pipe)) { + if (s.action instanceof ActionStationAcceptFluids) { + StatementParameterStackFilter param = new StatementParameterStackFilter(s.parameters); + + /* + * if (!param.hasFilter() || param.matches(filter)) { + * actionFound = true; break; } + */ + + actionFound = true; + break; + } + } + + if (!actionFound) { + return; + } + + 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 IFluidHandler) { + IFluidHandler handler = (IFluidHandler) nearbyTile; + + FluidStack drainable = robot.drain(ForgeDirection.UNKNOWN, FluidContainerRegistry.BUCKET_VOLUME, + false); + + if (drainable == null) { + return; + } + + drainable = drainable.copy(); + + int filled = handler.fill(station.side, drainable, true); + + if (filled > 0) { + drainable.amount = filled; + robot.drain(ForgeDirection.UNKNOWN, drainable, true); + unloaded += filled; + return; + } + } + } + } + } + + @Override + public double getEnergyCost() { + return 2; + } + + @Override + public boolean success() { + return unloaded > 0; + } +} diff --git a/common/buildcraft/core/robots/EntityRobot.java b/common/buildcraft/core/robots/EntityRobot.java index 6eddc176..7b3c8ac9 100755 --- a/common/buildcraft/core/robots/EntityRobot.java +++ b/common/buildcraft/core/robots/EntityRobot.java @@ -34,6 +34,11 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; import buildcraft.BuildCraftSilicon; import buildcraft.api.boards.RedstoneBoardNBT; @@ -59,7 +64,7 @@ import buildcraft.transport.gates.ActionIterator; import buildcraft.transport.gates.ActionSlot; public class EntityRobot extends EntityRobotBase implements - IEntityAdditionalSpawnData, IInventory { + IEntityAdditionalSpawnData, IInventory, IFluidHandler { public static final ResourceLocation ROBOT_BASE = new ResourceLocation("buildcraft", DefaultProps.TEXTURE_PATH_ENTITIES + "/robot_base.png"); @@ -99,6 +104,8 @@ public class EntityRobot extends EntityRobotBase implements private boolean needsUpdate = false; private ItemStack[] inv = new ItemStack[4]; + private FluidStack tank; + private int maxFluid = FluidContainerRegistry.BUCKET_VOLUME * 4; private String boardID; private ResourceLocation texture; @@ -258,7 +265,7 @@ public class EntityRobot extends EntityRobotBase implements worldObj, posX + steamDx * 0.25, posY + steamDy * 0.25, posZ + steamDz * 0.25, steamDx * 0.05, steamDy * 0.05, steamDz * 0.05, - energySpendPerCycle < 1 ? 1 : energySpendPerCycle)); + energySpendPerCycle * 0.75F < 1 ? 1 : energySpendPerCycle * 0.75F)); } } @@ -468,6 +475,14 @@ public class EntityRobot extends EntityRobotBase implements } nbt.setLong("robotId", robotId); + + if (tank != null) { + NBTTagCompound tankNBT = new NBTTagCompound(); + + tank.writeToNBT(tankNBT); + + nbt.setTag("tank", tankNBT); + } } @Override @@ -516,6 +531,12 @@ public class EntityRobot extends EntityRobotBase implements if (nbt.hasKey("robotId")) { robotId = nbt.getLong("robotId"); } + + if (nbt.hasKey("tank")) { + tank = FluidStack.loadFluidStackFromNBT(nbt.getCompoundTag("tank")); + } else { + tank = null; + } } @Override @@ -927,4 +948,90 @@ public class EntityRobot extends EntityRobotBase implements return stack; } } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + int result = 0; + + if (tank == null) { + tank = new FluidStack(resource.getFluid(), 0); + } + + if (tank.amount + resource.amount <= maxFluid) { + result = resource.amount; + + if (doFill) { + tank.amount += resource.amount; + } + } else { + result = maxFluid - tank.amount; + + if (doFill) { + tank.amount = maxFluid; + } + } + + if (tank != null && tank.amount == 0) { + tank = null; + } + + return result; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + if (tank != null && tank.fluidID == resource.fluidID) { + return drain(from, resource.amount, doDrain); + } else { + return null; + } + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + FluidStack result = null; + + if (tank == null) { + result = null; + } else if (tank.amount <= maxDrain) { + result = tank.copy(); + + if (doDrain) { + tank = null; + } + } else { + result = tank.copy(); + result.amount = maxDrain; + + if (doDrain) { + tank.amount -= maxDrain; + } + } + + if (tank != null && tank.amount == 0) { + tank = null; + } + + return result; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return tank == null + || tank.amount == 0 + || (tank.amount < maxFluid + && tank.fluidID == fluid.getID()); + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return tank != null + && tank.amount != 0 + && tank.fluidID == fluid.getID(); + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] {new FluidTankInfo(tank, maxFluid)}; + } } diff --git a/common/buildcraft/core/robots/boards/BoardRobotFluidCarrier.java b/common/buildcraft/core/robots/boards/BoardRobotFluidCarrier.java new file mode 100755 index 00000000..f74f21c9 --- /dev/null +++ b/common/buildcraft/core/robots/boards/BoardRobotFluidCarrier.java @@ -0,0 +1,45 @@ +/** + * 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.boards; + +import buildcraft.api.boards.RedstoneBoardRobot; +import buildcraft.api.boards.RedstoneBoardRobotNBT; +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.robots.AIRobotGotoSleep; +import buildcraft.core.robots.AIRobotGotoStationAndLoadFluids; +import buildcraft.core.robots.AIRobotGotoStationAndUnloadFluids; + +public class BoardRobotFluidCarrier extends RedstoneBoardRobot { + + public BoardRobotFluidCarrier(EntityRobotBase iRobot) { + super(iRobot); + } + + @Override + public RedstoneBoardRobotNBT getNBTHandler() { + return BoardRobotFluidCarrierNBT.instance; + } + + @Override + public void update() { + startDelegateAI(new AIRobotGotoStationAndLoadFluids(robot, robot.getZoneToWork())); + } + + @Override + public void delegateAIEnded(AIRobot ai) { + if (ai instanceof AIRobotGotoStationAndLoadFluids) { + startDelegateAI(new AIRobotGotoStationAndUnloadFluids(robot, robot.getZoneToWork())); + } else if (ai instanceof AIRobotGotoStationAndUnloadFluids) { + if (!ai.success()) { + startDelegateAI(new AIRobotGotoSleep(robot)); + } + } + } +} diff --git a/common/buildcraft/core/robots/boards/BoardRobotFluidCarrierNBT.java b/common/buildcraft/core/robots/boards/BoardRobotFluidCarrierNBT.java new file mode 100755 index 00000000..50acce92 --- /dev/null +++ b/common/buildcraft/core/robots/boards/BoardRobotFluidCarrierNBT.java @@ -0,0 +1,64 @@ +/** + * 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.boards; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; + +import buildcraft.api.boards.RedstoneBoardRobot; +import buildcraft.api.boards.RedstoneBoardRobotNBT; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.DefaultProps; +import buildcraft.core.utils.StringUtils; + +public final class BoardRobotFluidCarrierNBT extends RedstoneBoardRobotNBT { + + public static BoardRobotFluidCarrierNBT instance = new BoardRobotFluidCarrierNBT(); + + private static final ResourceLocation TEXTURE = new ResourceLocation("buildcraft", + DefaultProps.TEXTURE_PATH_ENTITIES + "/robot_fluid_carrier.png"); + + private IIcon icon; + + @Override + public RedstoneBoardRobot create(NBTTagCompound nbt, EntityRobotBase robot) { + return new BoardRobotFluidCarrier(robot); + } + + @Override + public ResourceLocation getRobotTexture() { + return TEXTURE; + } + + @Override + public String getID() { + return "buildcraft:boardRobotFluidCarrier"; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) { + list.add(StringUtils.localize("buildcraft.boardRobotFluidCarrier")); + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + icon = iconRegister.registerIcon("buildcraft:board_green"); + } + + @Override + public IIcon getIcon(NBTTagCompound nbt) { + return icon; + } +}