From f7b77f589c392d710eb3272021623ad5a6ae9716 Mon Sep 17 00:00:00 2001 From: gishicrafter Date: Thu, 29 Nov 2012 00:30:45 +0900 Subject: [PATCH] Use LiquidTank Revert RefineryRecipe --- .../api/recipes/RefineryRecipe.java | 100 +++---- common/buildcraft/energy/EngineIron.java | 185 ++++++------ .../energy/gui/GuiCombustionEngine.java | 8 +- common/buildcraft/factory/TilePump.java | 134 +++++++-- common/buildcraft/factory/TileRefinery.java | 267 ++++++++++-------- .../factory/render/RenderRefinery.java | 24 +- 6 files changed, 411 insertions(+), 307 deletions(-) diff --git a/common/buildcraft/api/recipes/RefineryRecipe.java b/common/buildcraft/api/recipes/RefineryRecipe.java index 86c6dbdd..3b9caa98 100644 --- a/common/buildcraft/api/recipes/RefineryRecipe.java +++ b/common/buildcraft/api/recipes/RefineryRecipe.java @@ -33,53 +33,6 @@ public class RefineryRecipe implements Comparable { return null; } - - /** - * Utility method which compares to only the types of source materials. - * We consider non-null < null in order that one-ingredient recipe is checked after - * the failure of matching two-ingredient recipes which include that liquid. - */ - private static int compareLiquids(LiquidStack liquid1, LiquidStack liquid2) { - if (liquid1 == null) { - if(liquid2 == null) { - return 0; - } else { - return 1; - } - } else if(liquid2 == null) { - return -1; - } else if(liquid1.itemID != liquid2.itemID) { - return liquid1.itemID - liquid2.itemID; - } else if(liquid1.itemMeta == -1) { - // liquid which meta is -1 has lower priority. - if(liquid2.itemMeta == -1){ - return 0; - }else{ - return 1; - } - } else { - if(liquid2.itemMeta == -1) { - return -1; - } else { - return liquid1.itemMeta - liquid2.itemMeta; - } - } - } - - private static boolean isLiquidEqual(LiquidStack ingredient, LiquidStack liquid) { - if(ingredient == null) - return liquid == null; - - if(liquid == null) - return false; - - // ignores meta matching if itemMeta == -1, as the same mannar as the vanilla recipes. - if(ingredient.itemMeta == -1) - return ingredient.itemID == liquid.itemID; - - return ingredient.isLiquidEqual(liquid); - } - public final LiquidStack ingredient1; public final LiquidStack ingredient2; @@ -95,7 +48,15 @@ public class RefineryRecipe implements Comparable { public RefineryRecipe(LiquidStack ingredient1, LiquidStack ingredient2, LiquidStack result, int energy, int delay) { // Sort starting materials. - if(compareLiquids(ingredient1, ingredient2) > 0) { + if(ingredient1 != null && ingredient2 != null) { + if( (ingredient1.itemID > ingredient2.itemID) || (ingredient1.itemID == ingredient2.itemID && ingredient1.itemMeta > ingredient2.itemMeta) ) { + this.ingredient1 = ingredient2; + this.ingredient2 = ingredient1; + } else { + this.ingredient1 = ingredient1; + this.ingredient2 = ingredient2; + } + } else if(ingredient2 != null) { this.ingredient1 = ingredient2; this.ingredient2 = ingredient1; } else { @@ -122,32 +83,53 @@ public class RefineryRecipe implements Comparable { if(ingredient1 != null) { if(ingredient2 == null) - return isLiquidEqual(ingredient1, liquid1) || isLiquidEqual(ingredient1, liquid2); + return ingredient1.isLiquidEqual(liquid1) || ingredient1.isLiquidEqual(liquid2); else - return (isLiquidEqual(ingredient1, liquid1) && isLiquidEqual(ingredient2, liquid2)) - || (isLiquidEqual(ingredient2, liquid1) && isLiquidEqual(ingredient1, liquid2)); + return (ingredient1.isLiquidEqual(liquid1) && ingredient2.isLiquidEqual(liquid2)) + || (ingredient2.isLiquidEqual(liquid1) && ingredient1.isLiquidEqual(liquid2)); } else if(ingredient2 != null) - return isLiquidEqual(ingredient2, liquid1) || isLiquidEqual(ingredient2, liquid2); + return ingredient2.isLiquidEqual(liquid1) || ingredient2.isLiquidEqual(liquid2); else return false; } - // Make instance of this class sortable. + // Compares to only the types of source materials. + // We consider non-null < null in order that one-ingredient recipe is checked after + // the failure of matching two-ingredient recipes which include that liquid. @Override public int compareTo(RefineryRecipe other) { - int result; - if(other == null) { return -1; + } else if (ingredient1 == null) { + if(other.ingredient1 == null) { + return 0; + } else { + return 1; + } + } else if(other.ingredient1 == null) { + return -1; + } else if(ingredient1.itemID != other.ingredient1.itemID) { + return ingredient1.itemID - other.ingredient1.itemID; + } else if(ingredient1.itemMeta != other.ingredient1.itemMeta) { + return ingredient1.itemMeta - other.ingredient1.itemMeta; + } else if(ingredient2 == null) { + if(other.ingredient2 == null) { + return 0; + } else { + return 1; + } + } else if(other.ingredient2 == null) { + return -1; + } else if(ingredient2.itemID != other.ingredient2.itemID) { + return ingredient2.itemID - other.ingredient2.itemID; + } else if(ingredient2.itemMeta != other.ingredient2.itemMeta) { + return ingredient2.itemMeta - other.ingredient2.itemMeta; } - result = compareLiquids(ingredient1, other.ingredient1); - if(result == 0) return compareLiquids(ingredient2, other.ingredient2); - - return result; + return 0; } diff --git a/common/buildcraft/energy/EngineIron.java b/common/buildcraft/energy/EngineIron.java index 244a3e63..c19aaa09 100644 --- a/common/buildcraft/energy/EngineIron.java +++ b/common/buildcraft/energy/EngineIron.java @@ -34,15 +34,9 @@ public class EngineIron extends Engine { private ItemStack itemInInventory; int burnTime = 0; - int liquidQty = 0; - public int liquidId = 0; - public int liquidMeta = 0; - - int coolantQty = 0; - public int coolantId = 0; - public int coolantMeta = 0; - int heat = 0; + private LiquidTank fuelTank; + private LiquidTank coolantTank; public int penaltyCooling = 0; @@ -53,6 +47,8 @@ public class EngineIron extends Engine { maxEnergy = 100000; maxEnergyExtracted = 500; + fuelTank = new LiquidTank(MAX_LIQUID); + coolantTank = new LiquidTank(MAX_LIQUID); } @Override @@ -88,13 +84,15 @@ public class EngineIron extends Engine { @Override public boolean isBurning() { - return liquidQty > 0 && penaltyCooling == 0 && tile.isRedstonePowered; + LiquidStack fuel = fuelTank.getLiquid(); + return fuel != null && fuel.amount > 0 && penaltyCooling == 0 && tile.isRedstonePowered; } @Override public void burn() { currentOutput = 0; - IronEngineFuel currentFuel = IronEngineFuel.getFuelForLiquid(new LiquidStack(liquidId, liquidQty, liquidMeta)); + LiquidStack fuel = this.fuelTank.getLiquid(); + IronEngineFuel currentFuel = IronEngineFuel.getFuelForLiquid(fuel); if (currentFuel == null) { return; @@ -104,11 +102,11 @@ public class EngineIron extends Engine { lastPowered = true; - if (burnTime > 0 || liquidQty > 0) { + if (burnTime > 0 || fuel.amount > 0) { if (burnTime > 0) { burnTime--; } else { - liquidQty--; + fuel.amount--; burnTime = currentFuel.totalBurningTime / LiquidContainerRegistry.BUCKET_VOLUME; } @@ -151,15 +149,16 @@ public class EngineIron extends Engine { if (heat > COOLANT_THRESHOLD) { int extraHeat = heat - COOLANT_THRESHOLD; - IronEngineCoolant currentCoolant = IronEngineCoolant.getCoolantForLiquid(new LiquidStack(coolantId, coolantQty, coolantMeta)); + LiquidStack coolant = this.coolantTank.getLiquid(); + IronEngineCoolant currentCoolant = IronEngineCoolant.getCoolantForLiquid(coolant); if (currentCoolant != null) { - if(coolantQty * currentCoolant.coolingPerUnit > extraHeat) { - coolantQty -= Math.round(extraHeat / currentCoolant.coolingPerUnit); + if(coolant.amount * currentCoolant.coolingPerUnit > extraHeat) { + coolant.amount -= Math.round(extraHeat / currentCoolant.coolingPerUnit); heat = COOLANT_THRESHOLD; } else { - heat -= coolantQty * currentCoolant.coolingPerUnit; - coolantQty = 0; + heat -= coolant.amount * currentCoolant.coolingPerUnit; + coolant.amount = 0; } } } @@ -193,18 +192,37 @@ public class EngineIron extends Engine { @Override public int getScaledBurnTime(int i) { - return (int) (((float) liquidQty / (float) (MAX_LIQUID)) * i); + return this.fuelTank.getLiquid() != null ? (int) (((float) this.fuelTank.getLiquid().amount / (float) (MAX_LIQUID)) * i) : 0; } @Override public void readFromNBT(NBTTagCompound nbttagcompound) { - liquidId = nbttagcompound.getInteger("liquidId"); - liquidQty = nbttagcompound.getInteger("liquidQty"); - liquidMeta = nbttagcompound.getInteger("liquidMeta"); + if(nbttagcompound.hasKey("liquidId")) { + fuelTank.setLiquid( + new LiquidStack( + nbttagcompound.getInteger("liquidId"), + nbttagcompound.getInteger("liquidQty"), + nbttagcompound.getInteger("liquidMeta"))); + } else if(nbttagcompound.hasKey("fuelTank")) { + fuelTank.setLiquid( + LiquidStack.loadLiquidStackFromNBT( + nbttagcompound.getCompoundTag("fuelTank"))); + } + burnTime = nbttagcompound.getInteger("burnTime"); - coolantId = nbttagcompound.getInteger("coolantId"); - coolantQty = nbttagcompound.getInteger("coolantQty"); - coolantMeta = nbttagcompound.getInteger("coolantMeta"); + + if(nbttagcompound.hasKey("coolantId")) { + coolantTank.setLiquid( + new LiquidStack( + nbttagcompound.getInteger("coolantId"), + nbttagcompound.getInteger("coolantQty"), + nbttagcompound.getInteger("coolantMeta"))); + } else if(nbttagcompound.hasKey("coolantTank")) { + coolantTank.setLiquid( + LiquidStack.loadLiquidStackFromNBT( + nbttagcompound.getCompoundTag("coolantTank"))); + } + heat = nbttagcompound.getInteger("heat"); penaltyCooling = nbttagcompound.getInteger("penaltyCooling"); @@ -217,13 +235,15 @@ public class EngineIron extends Engine { @Override public void writeToNBT(NBTTagCompound nbttagcompound) { - nbttagcompound.setInteger("liquidId", liquidId); - nbttagcompound.setInteger("liquidQty", liquidQty); - nbttagcompound.setInteger("liquidMeta", liquidMeta); + if(fuelTank.getLiquid() != null) { + nbttagcompound.setTag("fuelTank", fuelTank.getLiquid().writeToNBT(new NBTTagCompound())); + } + + if(coolantTank.getLiquid() != null) { + nbttagcompound.setTag("coolantTank", coolantTank.getLiquid().writeToNBT(new NBTTagCompound())); + } + nbttagcompound.setInteger("burnTime", burnTime); - nbttagcompound.setInteger("coolantId", coolantId); - nbttagcompound.setInteger("coolantQty", coolantQty); - nbttagcompound.setInteger("coolantMeta", coolantMeta); nbttagcompound.setInteger("heat", heat); nbttagcompound.setInteger("penaltyCooling", penaltyCooling); @@ -236,7 +256,7 @@ public class EngineIron extends Engine { } public int getScaledCoolant(int i) { - return (int) (((float) coolantQty / (float) (MAX_LIQUID)) * i); + return coolantTank.getLiquid() != null ? (int) (((float) coolantTank.getLiquid().amount / (float) (MAX_LIQUID)) * i) : 0; } @Override @@ -267,22 +287,28 @@ public class EngineIron extends Engine { heat = (heat & 0xff) | ((j & 0xff) << 8 ); break; case 5: - liquidQty = j; + if(fuelTank.getLiquid() == null) fuelTank.setLiquid(new LiquidStack(0, j)); + else fuelTank.getLiquid().amount = j; break; case 6: - liquidId = j; + if(fuelTank.getLiquid() == null) fuelTank.setLiquid(new LiquidStack(j, 0)); + else fuelTank.getLiquid().itemID = j; break; case 7: - coolantQty = j; + if(coolantTank.getLiquid() == null) coolantTank.setLiquid(new LiquidStack(0, j)); + else coolantTank.getLiquid().amount = j; break; case 8: - coolantId = j; + if(coolantTank.getLiquid() == null) coolantTank.setLiquid(new LiquidStack(j, 0)); + else coolantTank.getLiquid().itemID = j; break; case 9: - liquidMeta = j; + if(fuelTank.getLiquid() == null) fuelTank.setLiquid(new LiquidStack(0, 0, j)); + else fuelTank.getLiquid().itemMeta = j; break; case 10: - coolantMeta = j; + if(coolantTank.getLiquid() == null) coolantTank.setLiquid(new LiquidStack(0, 0, j)); + else coolantTank.getLiquid().itemMeta = j; } } @@ -293,12 +319,12 @@ public class EngineIron extends Engine { iCrafting.sendProgressBarUpdate(containerEngine, 2, Math.round(currentOutput * 10)); iCrafting.sendProgressBarUpdate(containerEngine, 3, heat & 0xff); iCrafting.sendProgressBarUpdate(containerEngine, 4, (heat & 0xff00) >> 8); - iCrafting.sendProgressBarUpdate(containerEngine, 5, liquidQty); - iCrafting.sendProgressBarUpdate(containerEngine, 6, liquidId); - iCrafting.sendProgressBarUpdate(containerEngine, 7, coolantQty); - iCrafting.sendProgressBarUpdate(containerEngine, 8, coolantId); - iCrafting.sendProgressBarUpdate(containerEngine, 9, liquidMeta); - iCrafting.sendProgressBarUpdate(containerEngine, 10, coolantMeta); + iCrafting.sendProgressBarUpdate(containerEngine, 5, fuelTank.getLiquid() != null ? fuelTank.getLiquid().amount : 0); + iCrafting.sendProgressBarUpdate(containerEngine, 6, fuelTank.getLiquid() != null ? fuelTank.getLiquid().itemID : 0); + iCrafting.sendProgressBarUpdate(containerEngine, 7, coolantTank.getLiquid() != null ? coolantTank.getLiquid().amount : 0); + iCrafting.sendProgressBarUpdate(containerEngine, 8, coolantTank.getLiquid() != null ? coolantTank.getLiquid().itemID : 0); + iCrafting.sendProgressBarUpdate(containerEngine, 9, fuelTank.getLiquid() != null ? fuelTank.getLiquid().itemMeta : 0); + iCrafting.sendProgressBarUpdate(containerEngine, 10, coolantTank.getLiquid() != null ? coolantTank.getLiquid().itemMeta : 0); } @Override @@ -318,63 +344,19 @@ public class EngineIron extends Engine { if (IronEngineCoolant.getCoolantForLiquid(resource) != null) return fillCoolant(from, resource, doFill); - int res = 0; + if (IronEngineFuel.getFuelForLiquid(resource) != null) + return fuelTank.fill(resource, doFill); - if (liquidQty > 0 && (liquidId != resource.itemID || liquidMeta != resource.itemMeta)) { - return 0; - } - - if (IronEngineFuel.getFuelForLiquid(resource) == null) - return 0; - - if (liquidQty + resource.amount <= MAX_LIQUID) { - if (doFill) { - liquidQty += resource.amount; - } - - res = resource.amount; - } else { - res = MAX_LIQUID - liquidQty; - - if (doFill) { - liquidQty = MAX_LIQUID; - } - } - - liquidId = resource.itemID; - liquidMeta = resource.itemMeta; - - return res; + return 0; } private int fillCoolant(ForgeDirection from, LiquidStack resource, boolean doFill) { - int res = 0; - - if (coolantQty > 0 && (coolantId != resource.itemID || coolantMeta != resource.itemMeta)) - return 0; - - if (coolantQty + resource.amount <= MAX_LIQUID) { - if (doFill) - coolantQty += resource.amount; - - res = resource.amount; - } else { - res = MAX_LIQUID - coolantQty; - - if (doFill) - coolantQty = MAX_LIQUID; - } - - coolantId = resource.itemID; - coolantMeta = resource.itemMeta; - - return res; + return coolantTank.fill(resource, doFill); } @Override public LiquidTank[] getLiquidSlots() { - return new LiquidTank[] { new LiquidTank(new LiquidStack(liquidId, liquidQty, liquidMeta), MAX_LIQUID), - new LiquidTank(new LiquidStack(coolantId, coolantQty, coolantMeta), MAX_LIQUID) }; + return new LiquidTank[] { fuelTank, coolantTank }; } @@ -412,12 +394,27 @@ public class EngineIron extends Engine { switch (direction) { case UP: - return new LiquidTank(new LiquidStack(liquidId, liquidQty, liquidMeta), MAX_LIQUID); + return fuelTank; case DOWN: - return new LiquidTank(new LiquidStack(coolantId, coolantQty, coolantMeta), MAX_LIQUID); + return coolantTank; default: return null; } } + public int getFuelId() { + return fuelTank.getLiquid() != null ? fuelTank.getLiquid().itemID : 0; + } + + public int getFuelMeta() { + return fuelTank.getLiquid() != null ? fuelTank.getLiquid().itemMeta : 0; + } + + public int getCoolantId() { + return coolantTank.getLiquid() != null ? coolantTank.getLiquid().itemID : 0; + } + + public int getCoolantMeta() { + return coolantTank.getLiquid() != null ? coolantTank.getLiquid().itemMeta : 0; + } } diff --git a/common/buildcraft/energy/gui/GuiCombustionEngine.java b/common/buildcraft/energy/gui/GuiCombustionEngine.java index c1bc45e3..5eee5fc5 100644 --- a/common/buildcraft/energy/gui/GuiCombustionEngine.java +++ b/common/buildcraft/energy/gui/GuiCombustionEngine.java @@ -49,16 +49,18 @@ public class GuiCombustionEngine extends GuiEngine { EngineIron engineIron = ((EngineIron) engine.engine); if (engine.getScaledBurnTime(58) > 0) - displayGauge(j, k, 19, 104, engine.getScaledBurnTime(58), engineIron.liquidId, engineIron.liquidMeta); + displayGauge(j, k, 19, 104, engine.getScaledBurnTime(58), engineIron.getFuelId(), engineIron.getFuelMeta()); if (engineIron.getScaledCoolant(58) > 0) - displayGauge(j, k, 19, 122, engineIron.getScaledCoolant(58), engineIron.coolantId, engineIron.coolantMeta); + displayGauge(j, k, 19, 122, engineIron.getScaledCoolant(58), engineIron.getCoolantId(), engineIron.getCoolantMeta()); } private void displayGauge(int j, int k, int line, int col, int squaled, int liquidId, int liquidMeta) { int liquidImgIndex = 0; - if (liquidId < Block.blocksList.length && Block.blocksList[liquidId] != null) { + if (liquidId <= 0) { + return; + } if (liquidId < Block.blocksList.length && Block.blocksList[liquidId] != null) { ForgeHooksClient.bindTexture(Block.blocksList[liquidId].getTextureFile(), 0); liquidImgIndex = Block.blocksList[liquidId].blockIndexInTexture; } else if (Item.itemsList[liquidId] != null) { diff --git a/common/buildcraft/factory/TilePump.java b/common/buildcraft/factory/TilePump.java index e3fcf22b..426d4a1c 100644 --- a/common/buildcraft/factory/TilePump.java +++ b/common/buildcraft/factory/TilePump.java @@ -15,9 +15,11 @@ import java.util.TreeSet; import buildcraft.BuildCraftCore; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.liquids.ILiquidTank; import net.minecraftforge.liquids.ITankContainer; import net.minecraftforge.liquids.LiquidContainerRegistry; import net.minecraftforge.liquids.LiquidStack; +import net.minecraftforge.liquids.LiquidTank; import buildcraft.api.core.Position; import buildcraft.api.power.IPowerProvider; import buildcraft.api.power.IPowerReceptor; @@ -25,6 +27,7 @@ import buildcraft.api.power.PowerFramework; import buildcraft.core.BlockIndex; import buildcraft.core.EntityBlock; import buildcraft.core.IMachine; +import buildcraft.core.network.PacketPayload; import buildcraft.core.network.PacketUpdate; import buildcraft.core.network.TileNetworkData; import buildcraft.core.proxy.CoreProxy; @@ -34,28 +37,24 @@ import net.minecraft.src.Block; import net.minecraft.src.NBTTagCompound; import net.minecraft.src.TileEntity; -public class TilePump extends TileMachine implements IMachine, IPowerReceptor { +public class TilePump extends TileMachine implements IMachine, IPowerReceptor, ITankContainer { + + public static int MAX_LIQUID = LiquidContainerRegistry.BUCKET_VOLUME; EntityBlock tube; private TreeMap> blocksToPump = new TreeMap>(); - public @TileNetworkData - int internalLiquid; - public @TileNetworkData + LiquidTank tank; double tubeY = Double.NaN; - public @TileNetworkData int aimY = 0; - public @TileNetworkData - int liquidId = 0; - public @TileNetworkData - int liquidMeta = 0; private IPowerProvider powerProvider; public TilePump() { powerProvider = PowerFramework.currentFramework.createPowerProvider(); powerProvider.configure(20, 1, 10, 10, 100); + tank = new LiquidTank(MAX_LIQUID); } // TODO, manage this by different levels (pump what's above first...) @@ -81,24 +80,22 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { return; } - if (internalLiquid <= 0) { + if (tank.getLiquid() == null || tank.getLiquid().amount <= 0) { BlockIndex index = getNextIndexToPump(false); if (isPumpableLiquid(index)) { LiquidStack liquidToPump = Utils.liquidFromBlockId(worldObj.getBlockId(index.i, index.j, index.k)); - if (internalLiquid == 0 || (liquidId == liquidToPump.itemID && liquidMeta == liquidToPump.itemMeta)) { - liquidId = liquidToPump.itemID; - liquidMeta = liquidToPump.itemMeta; + if (tank.fill(liquidToPump, false) == liquidToPump.amount) { if (powerProvider.useEnergy(10, 10, true) == 10) { index = getNextIndexToPump(true); - if (liquidId != Block.waterStill.blockID || BuildCraftCore.consumeWaterSources) { + if (liquidToPump.itemID != Block.waterStill.blockID || BuildCraftCore.consumeWaterSources) { worldObj.setBlockWithNotify(index.i, index.j, index.k, 0); } - internalLiquid = internalLiquid += liquidToPump.amount; + tank.fill(liquidToPump, true); if (CoreProxy.proxy.isSimulating(worldObj)) { sendNetworkUpdate(); @@ -126,7 +123,8 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { } } - if (internalLiquid >= 0) { + LiquidStack liquid = tank.getLiquid(); + if (liquid != null && liquid.amount >= 0) { for (int i = 0; i < 6; ++i) { Position p = new Position(xCoord, yCoord, zCoord, ForgeDirection.values()[i]); p.moveForwards(1); @@ -134,9 +132,11 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { TileEntity tile = worldObj.getBlockTileEntity((int) p.x, (int) p.y, (int) p.z); if(tile instanceof ITankContainer) { - internalLiquid -= ((ITankContainer)tile).fill(p.orientation.getOpposite(), new LiquidStack(liquidId, internalLiquid), true); - if(internalLiquid <= 0) + int moved = ((ITankContainer)tile).fill(p.orientation.getOpposite(), liquid, true); + tank.drain(moved, true); + if(liquid.amount <= 0) { break; + } } } } @@ -274,11 +274,19 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { public void readFromNBT(NBTTagCompound nbttagcompound) { super.readFromNBT(nbttagcompound); - internalLiquid = nbttagcompound.getInteger("internalLiquid"); + if(nbttagcompound.hasKey("internalLiquid")) { + tank.setLiquid( + new LiquidStack( + nbttagcompound.getInteger("liquidId"), + nbttagcompound.getInteger("internalLiquid"))); + } else if(nbttagcompound.hasKey("tank")) { + tank.setLiquid( + LiquidStack.loadLiquidStackFromNBT( + nbttagcompound.getCompoundTag("tank"))); + } aimY = nbttagcompound.getInteger("aimY"); tubeY = nbttagcompound.getFloat("tubeY"); - liquidId = nbttagcompound.getInteger("liquidId"); PowerFramework.currentFramework.loadPowerProvider(this, nbttagcompound); powerProvider.configure(20, 1, 10, 10, 100); @@ -290,8 +298,11 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { super.writeToNBT(nbttagcompound); PowerFramework.currentFramework.savePowerProvider(this, nbttagcompound); + + if(tank.getLiquid() != null) { + nbttagcompound.setTag("tank", tank.getLiquid().writeToNBT(new NBTTagCompound())); + } - nbttagcompound.setInteger("internalLiquid", internalLiquid); nbttagcompound.setInteger("aimY", aimY); if (tube != null) { @@ -299,8 +310,6 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { } else { nbttagcompound.setFloat("tubeY", yCoord); } - - nbttagcompound.setInteger("liquidId", liquidId); } @Override @@ -322,15 +331,43 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { public void doWork() {} @Override - public void handleDescriptionPacket(PacketUpdate packet) { - super.handleDescriptionPacket(packet); + public PacketPayload getPacketPayload() + { + PacketPayload payload = new PacketPayload(4, 1, 0); + if(tank.getLiquid() != null) { + payload.intPayload[0] = tank.getLiquid().itemID; + payload.intPayload[1] = tank.getLiquid().itemMeta; + payload.intPayload[2] = tank.getLiquid().amount; + } else { + payload.intPayload[0] = 0; + payload.intPayload[1] = 0; + payload.intPayload[2] = 0; + } + payload.intPayload[3] = aimY; + payload.floatPayload[0] = (float) tubeY; + + return payload; + } - setTubePosition(); + @Override + public void handleDescriptionPacket(PacketUpdate packet) { + handleUpdatePacket(packet); } @Override public void handleUpdatePacket(PacketUpdate packet) { - super.handleDescriptionPacket(packet); + if(packet.payload.intPayload[0] > 0) { + tank.setLiquid( + new LiquidStack( + packet.payload.intPayload[0], + packet.payload.intPayload[2], + packet.payload.intPayload[1])); + } else { + tank.setLiquid(null); + } + + aimY = packet.payload.intPayload[3]; + tubeY = packet.payload.floatPayload[0]; setTubePosition(); } @@ -376,4 +413,47 @@ public class TilePump extends TileMachine implements IMachine, IPowerReceptor { public boolean allowActions() { return false; } + + // ITankContainer implementation. + + @Override + public int fill(ForgeDirection from, LiquidStack resource, boolean doFill) + { + // not acceptable + return 0; + } + + @Override + public int fill(int tankIndex, LiquidStack resource, boolean doFill) + { + // not acceptable + return 0; + } + + @Override + public LiquidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) + { + return drain(0, maxDrain, doDrain); + } + + @Override + public LiquidStack drain(int tankIndex, int maxDrain, boolean doDrain) + { + if(tankIndex == 0) + return tank.drain(maxDrain, doDrain); + + return null; + } + + @Override + public ILiquidTank[] getTanks(ForgeDirection direction) + { + return new ILiquidTank[]{ tank }; + } + + @Override + public ILiquidTank getTank(ForgeDirection direction, LiquidStack type) + { + return null; + } } diff --git a/common/buildcraft/factory/TileRefinery.java b/common/buildcraft/factory/TileRefinery.java index 68e244e9..260a96c8 100644 --- a/common/buildcraft/factory/TileRefinery.java +++ b/common/buildcraft/factory/TileRefinery.java @@ -22,6 +22,8 @@ import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerFramework; import buildcraft.api.recipes.RefineryRecipe; import buildcraft.core.IMachine; +import buildcraft.core.network.PacketPayload; +import buildcraft.core.network.PacketUpdate; import buildcraft.core.network.TileNetworkData; import buildcraft.core.proxy.CoreProxy; import net.minecraft.src.Container; @@ -38,68 +40,11 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR public static int LIQUID_PER_SLOT = LiquidContainerRegistry.BUCKET_VOLUME * 4; - public static class Slot { - @TileNetworkData - public int liquidId = 0; - @TileNetworkData - public int quantity = 0; - @TileNetworkData - public int liquidMeta = 0; - public int fill(ForgeDirection from, int amount, int id, boolean doFill) { - return fill(from, new LiquidStack(id, amount, 0), doFill); - } - - public int fill(ForgeDirection from, LiquidStack liquid, boolean doFill) { - if (quantity != 0 && (liquidId != liquid.itemID || liquidMeta != liquid.itemMeta)) { - return 0; - } else if (quantity + liquid.amount <= LIQUID_PER_SLOT) { - if (doFill) { - quantity = quantity + liquid.amount; - } - - liquidId = liquid.itemID; - liquidMeta = liquid.itemMeta; - return liquid.amount; - } else { - int used = LIQUID_PER_SLOT - quantity; - - if (doFill) { - quantity = LIQUID_PER_SLOT; - } - - liquidId = liquid.itemID; - liquidMeta = liquid.itemMeta; - return used; - } - } - - public void writeFromNBT(NBTTagCompound nbttagcompound) { - nbttagcompound.setInteger("liquidId", liquidId); - nbttagcompound.setInteger("quantity", quantity); - nbttagcompound.setInteger("liquidMeta", liquidMeta); - } - - public void readFromNBT(NBTTagCompound nbttagcompound) { - liquidId = nbttagcompound.getInteger("liquidId"); - - if (liquidId != 0) { - quantity = nbttagcompound.getInteger("quantity"); - liquidMeta = nbttagcompound.getInteger("liquidMeta"); - } else { - quantity = 0; - } - } - } - - @TileNetworkData - public Slot slot1 = new Slot(); - @TileNetworkData - public Slot slot2 = new Slot(); - @TileNetworkData - public Slot result = new Slot(); - @TileNetworkData + public LiquidTank ingredient1 = new LiquidTank(LIQUID_PER_SLOT); + public LiquidTank ingredient2 = new LiquidTank(LIQUID_PER_SLOT); + public LiquidTank result = new LiquidTank(LIQUID_PER_SLOT); public float animationSpeed = 1; private int animationStage = 0; @@ -190,19 +135,19 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR RefineryRecipe currentRecipe = null; - currentRecipe = RefineryRecipe.findRefineryRecipe(new LiquidStack(slot1.liquidId, slot1.quantity, slot1.liquidMeta), new LiquidStack(slot2.liquidId, slot2.quantity, slot2.liquidMeta)); + currentRecipe = RefineryRecipe.findRefineryRecipe(ingredient1.getLiquid(), ingredient2.getLiquid()); if (currentRecipe == null) { decreaseAnimation(); return; } - if (result.quantity != 0 && (result.liquidId != currentRecipe.result.itemID || result.liquidMeta != currentRecipe.result.itemMeta)) { + if (result.getLiquid() != null && result.getLiquid().amount != 0 && !result.getLiquid().isLiquidEqual(currentRecipe.result)) { decreaseAnimation(); return; } - if (result.quantity + currentRecipe.result.amount > LIQUID_PER_SLOT) { + if (result.fill(currentRecipe.result, false) != currentRecipe.result.amount) { decreaseAnimation(); return; } @@ -228,9 +173,7 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR if (energyUsed != 0) { if (consumeInput(currentRecipe.ingredient1) && consumeInput(currentRecipe.ingredient2)) { - result.liquidId = currentRecipe.result.itemID; - result.liquidMeta = currentRecipe.result.itemMeta; - result.quantity += currentRecipe.result.amount; + result.fill(currentRecipe.result, true); } } } @@ -239,18 +182,19 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR if(liquid == null) return true; - return new LiquidStack(slot1.liquidId, slot1.quantity, slot1.liquidMeta).containsLiquid(liquid) || new LiquidStack(slot2.liquidId, slot2.quantity, slot2.liquidMeta).containsLiquid(liquid); + return (ingredient1.getLiquid() != null && ingredient1.getLiquid().containsLiquid(liquid)) + || (ingredient2.getLiquid() != null && ingredient2.getLiquid().containsLiquid(liquid)); } private boolean consumeInput(LiquidStack liquid) { if(liquid == null) return true; - if(new LiquidStack(slot1.liquidId, slot1.quantity, slot1.liquidMeta).containsLiquid(liquid)) { - slot1.quantity -= liquid.amount; + if(ingredient1.getLiquid() != null && ingredient1.getLiquid().containsLiquid(liquid)) { + ingredient1.drain(liquid.amount, true); return true; - } else if(new LiquidStack(slot2.liquidId, slot2.quantity, slot2.liquidMeta).containsLiquid(liquid)) { - slot2.quantity -= liquid.amount; + } else if(ingredient2.getLiquid() != null && ingredient2.getLiquid().containsLiquid(liquid)) { + ingredient2.drain(liquid.amount, true); return true; } @@ -271,15 +215,50 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR public boolean manageSolids() { return true; } + + // for compatibility + private LiquidStack readSlotNBT(NBTTagCompound nbttagcompound) + { + int liquidId = nbttagcompound.getInteger("liquidId"); + int quantity = 0; + int liquidMeta = 0; + + if (liquidId != 0) { + quantity = nbttagcompound.getInteger("quantity"); + liquidMeta = nbttagcompound.getInteger("liquidMeta"); + } else { + quantity = 0; + } + + if(quantity > 0) return new LiquidStack(liquidId, quantity, liquidMeta); + + return null; + } @Override public void readFromNBT(NBTTagCompound nbttagcompound) { super.readFromNBT(nbttagcompound); if (nbttagcompound.hasKey("slot1")) { - slot1.readFromNBT(nbttagcompound.getCompoundTag("slot1")); - slot2.readFromNBT(nbttagcompound.getCompoundTag("slot2")); - result.readFromNBT(nbttagcompound.getCompoundTag("result")); + ingredient1.setLiquid(readSlotNBT(nbttagcompound.getCompoundTag("slot1"))); + ingredient2.setLiquid(readSlotNBT(nbttagcompound.getCompoundTag("slot2"))); + result.setLiquid(readSlotNBT(nbttagcompound.getCompoundTag("result"))); + } else { + if(nbttagcompound.hasKey("ingredient1")) { + ingredient1.setLiquid( + LiquidStack.loadLiquidStackFromNBT( + nbttagcompound.getCompoundTag("ingredient1"))); + } + if(nbttagcompound.hasKey("ingredient2")) { + ingredient2.setLiquid( + LiquidStack.loadLiquidStackFromNBT( + nbttagcompound.getCompoundTag("ingredient2"))); + } + if(nbttagcompound.hasKey("result")) { + result.setLiquid( + LiquidStack.loadLiquidStackFromNBT( + nbttagcompound.getCompoundTag("result"))); + } } animationStage = nbttagcompound.getInteger("animationStage"); @@ -298,17 +277,23 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR public void writeToNBT(NBTTagCompound nbttagcompound) { super.writeToNBT(nbttagcompound); - NBTTagCompound NBTslot1 = new NBTTagCompound(); - NBTTagCompound NBTslot2 = new NBTTagCompound(); - NBTTagCompound NBTresult = new NBTTagCompound(); + if(ingredient1.getLiquid() != null) { + nbttagcompound.setTag("ingredient1", + ingredient1.getLiquid().writeToNBT( + new NBTTagCompound())); + } - slot1.writeFromNBT(NBTslot1); - slot2.writeFromNBT(NBTslot2); - result.writeFromNBT(NBTresult); + if(ingredient2.getLiquid() != null) { + nbttagcompound.setTag("ingredient2", + ingredient2.getLiquid().writeToNBT( + new NBTTagCompound())); + } - nbttagcompound.setTag("slot1", NBTslot1); - nbttagcompound.setTag("slot2", NBTslot2); - nbttagcompound.setTag("result", NBTresult); + if(result.getLiquid() != null) { + nbttagcompound.setTag("result", + result.getLiquid().writeToNBT( + new NBTTagCompound())); + } nbttagcompound.setInteger("animationStage", animationStage); nbttagcompound.setFloat("animationSpeed", animationSpeed); @@ -423,18 +408,18 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR if (filters[0] != 0 || filters[1] != 0) { if (filters[0] == resource.itemID && filtersMeta[0] == resource.itemMeta) { - used += slot1.fill(from, resourceUsing, doFill); + used += ingredient1.fill(resourceUsing, doFill); } resourceUsing.amount -= used; if (filters[1] == resource.itemID && filtersMeta[1] == resource.itemMeta) { - used += slot2.fill(from, resourceUsing, doFill); + used += ingredient2.fill(resourceUsing, doFill); } } else { - used += slot1.fill(from, resourceUsing, doFill); + used += ingredient1.fill(resourceUsing, doFill); resourceUsing.amount -= used; - used += slot2.fill(from, resourceUsing, doFill); + used += ingredient2.fill(resourceUsing, doFill); } if (doFill && used > 0) { @@ -447,7 +432,9 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR @Override public int fill(int tankIndex, LiquidStack resource, boolean doFill) { - /// FIXME: TileRefinery.Slot must die! + + if(tankIndex == 0 && resource.itemID == filters[0] && resource.itemMeta == filtersMeta[0]) return ingredient1.fill(resource, doFill); + if(tankIndex == 1 && resource.itemID == filters[1] && resource.itemMeta == filtersMeta[1]) return ingredient2.fill(resource, doFill); return 0; } @@ -458,37 +445,14 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR @Override public LiquidStack drain(int tankIndex, int maxEmpty, boolean doDrain) { - int res = 0; - - if (result.quantity >= maxEmpty) { - res = maxEmpty; - - if (doDrain) { - result.quantity -= maxEmpty; - } - } else { - res = result.quantity; - - if (doDrain) { - result.quantity = 0; - } - } - - if (doDrain && res > 0) { - updateNetworkTime.markTime(worldObj); - sendNetworkUpdate(); - } - - return new LiquidStack(result.liquidId, res, result.liquidMeta); + if(tankIndex == 2) return result.drain(maxEmpty, doDrain); + + return null; } @Override public ILiquidTank[] getTanks(ForgeDirection direction) { - return new ILiquidTank[] { - new LiquidTank(new LiquidStack(slot1.liquidId, slot1.quantity, slot1.liquidMeta), LIQUID_PER_SLOT), - new LiquidTank(new LiquidStack(slot2.liquidId, slot2.quantity, slot2.liquidMeta), LIQUID_PER_SLOT), - new LiquidTank(new LiquidStack(result.liquidId, result.quantity, result.liquidMeta), LIQUID_PER_SLOT), - }; + return new ILiquidTank[] {ingredient1, ingredient2, result}; } @Override @@ -497,4 +461,77 @@ public class TileRefinery extends TileMachine implements ITankContainer, IPowerR return null; } + + // Network + + @Override + public PacketPayload getPacketPayload() + { + PacketPayload payload = new PacketPayload(9, 1, 0); + if(ingredient1.getLiquid() != null) { + payload.intPayload[0] = ingredient1.getLiquid().itemID; + payload.intPayload[1] = ingredient1.getLiquid().itemMeta; + payload.intPayload[2] = ingredient1.getLiquid().amount; + } else { + payload.intPayload[0] = 0; + payload.intPayload[1] = 0; + payload.intPayload[2] = 0; + } + if(ingredient2.getLiquid() != null) { + payload.intPayload[3] = ingredient2.getLiquid().itemID; + payload.intPayload[4] = ingredient2.getLiquid().itemMeta; + payload.intPayload[5] = ingredient2.getLiquid().amount; + } else { + payload.intPayload[3] = 0; + payload.intPayload[4] = 0; + payload.intPayload[5] = 0; + } + if(result.getLiquid() != null) { + payload.intPayload[6] = result.getLiquid().itemID; + payload.intPayload[7] = result.getLiquid().itemMeta; + payload.intPayload[8] = result.getLiquid().amount; + } else { + payload.intPayload[6] = 0; + payload.intPayload[7] = 0; + payload.intPayload[8] = 0; + } + payload.floatPayload[0] = animationSpeed; + + return payload; + } + + @Override + public void handleUpdatePacket(PacketUpdate packet) { + if(packet.payload.intPayload[0] > 0) { + ingredient1.setLiquid( + new LiquidStack( + packet.payload.intPayload[0], + packet.payload.intPayload[2], + packet.payload.intPayload[1])); + } else { + ingredient1.setLiquid(null); + } + + if(packet.payload.intPayload[3] > 0) { + ingredient2.setLiquid( + new LiquidStack( + packet.payload.intPayload[3], + packet.payload.intPayload[5], + packet.payload.intPayload[4])); + } else { + ingredient2.setLiquid(null); + } + + if(packet.payload.intPayload[6] > 0) { + result.setLiquid( + new LiquidStack( + packet.payload.intPayload[6], + packet.payload.intPayload[8], + packet.payload.intPayload[7])); + } else { + result.setLiquid(null); + } + + animationSpeed = packet.payload.floatPayload[0]; + } } diff --git a/common/buildcraft/factory/render/RenderRefinery.java b/common/buildcraft/factory/render/RenderRefinery.java index 5d39e135..392e6f5a 100644 --- a/common/buildcraft/factory/render/RenderRefinery.java +++ b/common/buildcraft/factory/render/RenderRefinery.java @@ -136,17 +136,23 @@ public class RenderRefinery extends TileEntitySpecialRenderer implements IInvent ModelRenderer theMagnet = magnet[0]; if (tile != null) { - liquid1 = tile.slot1.liquidId; - liquidMeta1 = tile.slot1.liquidMeta; - qty1 = tile.slot1.quantity; + if(tile.ingredient1.getLiquid() != null) { + liquid1 = tile.ingredient1.getLiquid().itemID; + liquidMeta1 = tile.ingredient1.getLiquid().itemMeta; + qty1 = tile.ingredient1.getLiquid().amount; + } - liquid2 = tile.slot2.liquidId; - liquidMeta2 = tile.slot2.liquidMeta; - qty2 = tile.slot2.quantity; + if(tile.ingredient2.getLiquid() != null) { + liquid2 = tile.ingredient2.getLiquid().itemID; + liquidMeta2 = tile.ingredient2.getLiquid().itemMeta; + qty2 = tile.ingredient2.getLiquid().amount; + } - liquid3 = tile.result.liquidId; - liquidMeta3 = tile.result.liquidMeta; - qty3 = tile.result.quantity; + if(tile.result.getLiquid() != null) { + liquid3 = tile.result.getLiquid().itemID; + liquidMeta3 = tile.result.getLiquid().itemMeta; + qty3 = tile.result.getLiquid().amount; + } anim = tile.getAnimationStage();