diff --git a/src/main/java/mekanism/api/IAlloyInteraction.java b/src/main/java/mekanism/api/IAlloyInteraction.java new file mode 100644 index 000000000..b2a2198d8 --- /dev/null +++ b/src/main/java/mekanism/api/IAlloyInteraction.java @@ -0,0 +1,18 @@ +package mekanism.api; + +import net.minecraft.entity.player.EntityPlayer; + +/** + * Implement this class in your TileEntity if it can interact with Mekanism alloys. + * @author aidancbrady + * + */ +public interface IAlloyInteraction +{ + /** + * Called when a player right-clicks this block with an alloy. + * @param player - the player right-clicking the block + * @param tierOrdinal - the ordinal tier of the alloy (1 = advanced, 2 = elite, 3 = ultimate) + */ + public void onAlloyInteraction(EntityPlayer player, int tierOrdinal); +} diff --git a/src/main/java/mekanism/api/MekanismConfig.java b/src/main/java/mekanism/api/MekanismConfig.java index 2f9ea6875..7b97b1fe5 100644 --- a/src/main/java/mekanism/api/MekanismConfig.java +++ b/src/main/java/mekanism/api/MekanismConfig.java @@ -56,6 +56,9 @@ public class MekanismConfig public static int maxJetpackGas; public static int maxScubaGas; public static int maxFlamethrowerGas; + public static int maxPumpRange; + public static boolean pumpWaterSources; + public static int maxPlenisherNodes; } public static class client diff --git a/src/main/java/mekanism/api/gas/GasNetwork.java b/src/main/java/mekanism/api/gas/GasNetwork.java index ea81d1210..7258167c2 100644 --- a/src/main/java/mekanism/api/gas/GasNetwork.java +++ b/src/main/java/mekanism/api/gas/GasNetwork.java @@ -54,15 +54,15 @@ public class GasNetwork extends DynamicNetwork net.refGas = null; net.buffer = null; } - } else - { + } + else { if(net.buffer != null) { if(buffer == null) { buffer = net.buffer.copy(); - } else - { + } + else { if(buffer.isGasEqual(net.buffer)) { buffer.amount += net.buffer.amount; diff --git a/src/main/java/mekanism/client/gui/GuiFluidicPlenisher.java b/src/main/java/mekanism/client/gui/GuiFluidicPlenisher.java index 0e7186be5..35a3a5743 100644 --- a/src/main/java/mekanism/client/gui/GuiFluidicPlenisher.java +++ b/src/main/java/mekanism/client/gui/GuiFluidicPlenisher.java @@ -1,12 +1,13 @@ package mekanism.client.gui; import mekanism.client.gui.element.GuiFluidGauge; +import mekanism.client.gui.element.GuiFluidGauge.IFluidInfoHandler; import mekanism.client.gui.element.GuiGauge; import mekanism.client.gui.element.GuiPowerBar; import mekanism.client.gui.element.GuiSlot; -import mekanism.client.gui.element.GuiFluidGauge.IFluidInfoHandler; import mekanism.client.gui.element.GuiSlot.SlotOverlay; import mekanism.client.gui.element.GuiSlot.SlotType; +import mekanism.client.gui.element.GuiUpgradeTab; import mekanism.common.inventory.container.ContainerFluidicPlenisher; import mekanism.common.tile.TileEntityFluidicPlenisher; import mekanism.common.util.LangUtils; @@ -15,11 +16,12 @@ import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidTank; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + @SideOnly(Side.CLIENT) public class GuiFluidicPlenisher extends GuiMekanism { @@ -43,7 +45,7 @@ public class GuiFluidicPlenisher extends GuiMekanism return tileEntity.fluidTank; } }, GuiGauge.Type.STANDARD, this, guiLocation, 6, 13)); - + guiElements.add(new GuiUpgradeTab(this, tileEntity, guiLocation)); } @Override diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index 00da85dfe..87a8ed680 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -266,6 +266,9 @@ public class CommonProxy implements IGuiProvider general.maxJetpackGas = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "MaxJetpackGas", 24000).getInt(); general.maxScubaGas = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "MaxScubaGas", 24000).getInt(); general.maxFlamethrowerGas = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "MaxFlamethrowerGas", 24000).getInt(); + general.maxPumpRange = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "MaxPumpRange", 80).getInt(); + general.pumpWaterSources = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "PumpWaterSources", false).getBoolean(); + general.maxPlenisherNodes = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "MaxPlenisherNodes", 4000).getInt(); general.blacklistIC2 = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "BlacklistIC2Power", false).getBoolean(); general.blacklistRF = Mekanism.configuration.get(Configuration.CATEGORY_GENERAL, "BlacklistRFPower", false).getBoolean(); diff --git a/src/main/java/mekanism/common/MekanismItems.java b/src/main/java/mekanism/common/MekanismItems.java index 49726061d..a2c58a570 100644 --- a/src/main/java/mekanism/common/MekanismItems.java +++ b/src/main/java/mekanism/common/MekanismItems.java @@ -1,5 +1,6 @@ package mekanism.common; +import mekanism.common.item.ItemAlloy; import mekanism.common.item.ItemAtomicDisassembler; import mekanism.common.item.ItemBalloon; import mekanism.common.item.ItemClump; @@ -45,9 +46,9 @@ import cpw.mods.fml.common.registry.GameRegistry.ObjectHolder; @ObjectHolder("Mekanism") public class MekanismItems { - public static final Item EnrichedAlloy = new ItemMekanism().setUnlocalizedName("EnrichedAlloy"); - public static final Item ReinforcedAlloy = new ItemMekanism().setUnlocalizedName("ReinforcedAlloy"); - public static final Item AtomicAlloy = new ItemMekanism().setUnlocalizedName("AtomicAlloy"); + public static final Item EnrichedAlloy = new ItemAlloy().setUnlocalizedName("EnrichedAlloy"); + public static final Item ReinforcedAlloy = new ItemAlloy().setUnlocalizedName("ReinforcedAlloy"); + public static final Item AtomicAlloy = new ItemAlloy().setUnlocalizedName("AtomicAlloy"); public static final Item TeleportationCore = new ItemMekanism().setUnlocalizedName("TeleportationCore"); public static final Item ElectrolyticCore = new ItemMekanism().setUnlocalizedName("ElectrolyticCore"); public static final Item Substrate = new ItemMekanism().setUnlocalizedName("Substrate"); diff --git a/src/main/java/mekanism/common/item/ItemAlloy.java b/src/main/java/mekanism/common/item/ItemAlloy.java new file mode 100644 index 000000000..ca935aaca --- /dev/null +++ b/src/main/java/mekanism/common/item/ItemAlloy.java @@ -0,0 +1,35 @@ +package mekanism.common.item; + +import mekanism.api.IAlloyInteraction; +import mekanism.common.MekanismItems; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class ItemAlloy extends ItemMekanism +{ + public ItemAlloy() + { + super(); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile instanceof IAlloyInteraction) + { + if(!world.isRemote) + { + int ordinal = stack.getItem() == MekanismItems.EnrichedAlloy? 1 : (stack.getItem() == MekanismItems.ReinforcedAlloy ? 2 : 3); + ((IAlloyInteraction)tile).onAlloyInteraction(player, ordinal); + } + + return true; + } + + return false; + } +} diff --git a/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java b/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java index 21d6e9eec..9c6640398 100644 --- a/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java +++ b/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java @@ -64,14 +64,6 @@ public class ItemPartTransmitter extends JItemMultiPart networks.add(((ITransmitterTile)tile).getTransmitter().getTransmitterNetwork()); } } - - if(networks.size() > 0) - { - /*if(!networks.iterator().next().canMerge(networks)) - { - return null; - }*/ - } } return PartTransmitter.getPartType(TransmitterType.values()[getDamage(stack)]); diff --git a/src/main/java/mekanism/common/multipart/MultipartMekanism.java b/src/main/java/mekanism/common/multipart/MultipartMekanism.java index 0ce30db92..6171cfc34 100644 --- a/src/main/java/mekanism/common/multipart/MultipartMekanism.java +++ b/src/main/java/mekanism/common/multipart/MultipartMekanism.java @@ -44,6 +44,7 @@ public class MultipartMekanism implements IPartFactory MultipartGenerator.registerPassThroughInterface("mekanism.api.IHeatTransfer"); MultipartGenerator.registerPassThroughInterface("mekanism.api.transmitters.IBlockableConnection"); MultipartGenerator.registerPassThroughInterface("mekanism.api.transmitters.ITransmitterTile"); + MultipartGenerator.registerPassThroughInterface("mekanism.api.IAlloyInteraction"); MultipartGenerator.registerPassThroughInterface("mekanism.common.base.ITransporterTile"); MultipartGenerator.registerPassThroughInterface("mekanism.common.base.ILogisticalTransporter"); MultipartGenerator.registerPassThroughInterface("mekanism.common.base.ITileNetwork"); diff --git a/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java b/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java index b26e82183..603f225d7 100644 --- a/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java +++ b/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java @@ -13,6 +13,7 @@ import mekanism.client.render.RenderPartTransmitter; import mekanism.common.InventoryNetwork; import mekanism.common.Mekanism; import mekanism.common.Tier; +import mekanism.common.Tier.BaseTier; import mekanism.common.Tier.TransporterTier; import mekanism.common.base.ILogisticalTransporter; import mekanism.common.base.ITransporterTile; @@ -36,6 +37,8 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.ForgeDirection; +import codechicken.lib.data.MCDataInput; +import codechicken.lib.data.MCDataOutput; import codechicken.lib.vec.Vector3; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -448,4 +451,36 @@ public class PartLogisticalTransporter extends PartTransmitter implements IFluidHandler { @@ -307,4 +316,36 @@ public class PartMechanicalPipe extends PartTransmitter implements IGasHandler { @@ -315,4 +323,36 @@ public class PartPressurizedTube extends PartTransmitter> extends PartSidedPipe implements ITransmitterTile +public abstract class PartTransmitter> extends PartSidedPipe implements ITransmitterTile, IAlloyInteraction { public MultipartTransmitter transmitterDelegate; @@ -77,12 +84,6 @@ public abstract class PartTransmitter> extends super.preRemove(); } - @Override - public void onNeighborTileChanged(int side, boolean weak) - { - super.onNeighborTileChanged(side, weak); - } - @Override public void markDirtyTransmitters() { @@ -116,6 +117,71 @@ public abstract class PartTransmitter> extends return connectionMapContainsSide(currentAcceptorConnections, side) ? (A)cachedAcceptors[side.ordinal()] : null; } + + @Override + public void onAlloyInteraction(EntityPlayer player, int tierOrdinal) + { + if(getTransmitter().hasTransmitterNetwork()) + { + int upgraded = 0; + Object[] array = ((LinkedHashSet)getTransmitter().getTransmitterNetwork().transmitters.clone()).toArray(); + + Arrays.sort(array, new Comparator() { + @Override + public int compare(Object o1, Object o2) + { + if(o1 instanceof IGridTransmitter && o2 instanceof IGridTransmitter) + { + Coord4D thisCoord = Coord4D.get(tile()); + + Coord4D o1Coord = ((IGridTransmitter)o1).coord(); + Coord4D o2Coord = ((IGridTransmitter)o2).coord(); + + return o1Coord.distanceTo(thisCoord) > o2Coord.distanceTo(thisCoord) ? 1 : + (o1Coord.distanceTo(thisCoord) < o2Coord.distanceTo(thisCoord) ? -1 : 0); + } + + return 0; + } + }); + + for(Object iter : array) + { + if(iter instanceof MultipartTransmitter) + { + PartTransmitter t = ((MultipartTransmitter)iter).containingPart; + + if(t.upgrade(tierOrdinal)) + { + upgraded++; + + if(upgraded == 8) + { + break; + } + } + } + } + + if(upgraded > 0) + { + if(!player.capabilities.isCreativeMode) + { + player.getCurrentEquippedItem().stackSize--; + + if(player.getCurrentEquippedItem().stackSize == 0) + { + player.setCurrentItemOrArmor(0, null); + } + } + } + } + } + + public boolean upgrade(int tierOrdinal) + { + return false; + } public abstract int getCapacity(); diff --git a/src/main/java/mekanism/common/multipart/PartUniversalCable.java b/src/main/java/mekanism/common/multipart/PartUniversalCable.java index 648fa3118..09d8f893b 100644 --- a/src/main/java/mekanism/common/multipart/PartUniversalCable.java +++ b/src/main/java/mekanism/common/multipart/PartUniversalCable.java @@ -1,14 +1,10 @@ package mekanism.common.multipart; -import codechicken.lib.vec.Vector3; -import cofh.api.energy.IEnergyHandler; -import cofh.api.energy.IEnergyProvider; -import cpw.mods.fml.common.Optional.Interface; -import cpw.mods.fml.common.Optional.InterfaceList; -import cpw.mods.fml.common.Optional.Method; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import ic2.api.energy.tile.IEnergySource; + +import java.util.Collection; +import java.util.List; + import mekanism.api.MekanismConfig.client; import mekanism.api.MekanismConfig.general; import mekanism.api.energy.EnergyStack; @@ -19,6 +15,8 @@ import mekanism.api.transmitters.TransmissionType; import mekanism.client.render.RenderPartTransmitter; import mekanism.common.EnergyNetwork; import mekanism.common.Tier; +import mekanism.common.Tier.BaseTier; +import mekanism.common.Tier.CableTier; import mekanism.common.base.EnergyAcceptorWrapper; import mekanism.common.util.CableUtils; import mekanism.common.util.MekanismUtils; @@ -27,9 +25,16 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; - -import java.util.Collection; -import java.util.List; +import codechicken.lib.data.MCDataInput; +import codechicken.lib.data.MCDataOutput; +import codechicken.lib.vec.Vector3; +import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyProvider; +import cpw.mods.fml.common.Optional.Interface; +import cpw.mods.fml.common.Optional.InterfaceList; +import cpw.mods.fml.common.Optional.Method; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; @InterfaceList({ @Interface(iface = "cofh.api.energy.IEnergyHandler", modid = "CoFHCore"), @@ -184,7 +189,7 @@ public class PartUniversalCable extends PartTransmitter recurringNodes = new HashSet(); @@ -64,7 +81,6 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I super("ElectricPump", 10000); inventory = new ItemStack[4]; - upgradeComponent.clearSupportedTypes(); upgradeComponent.setSupported(Upgrade.FILTER); } @@ -135,27 +151,47 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I } } } - - if(!worldObj.isRemote && ticker % 20 == 0) + + if(!worldObj.isRemote) { - if(MekanismUtils.canFunction(this)) + if(MekanismUtils.canFunction(this) && getEnergy() >= energyPerTick) { - if(getEnergy() >= usage.electricPumpUsage && (fluidTank.getFluid() == null || fluidTank.getFluid().amount + FluidContainerRegistry.BUCKET_VOLUME <= fluidTank.getCapacity())) + if(suckedLastOperation) { - if(!suck(true)) + setEnergy(getEnergy() - energyPerTick); + } + + if((operatingTicks + 1) < ticksRequired) + { + operatingTicks++; + } + else { + if(fluidTank.getFluid() == null || fluidTank.getFluid().amount + FluidContainerRegistry.BUCKET_VOLUME <= fluidTank.getCapacity()) { - reset(); + if(!suck(true)) + { + suckedLastOperation = false; + reset(); + } + else { + suckedLastOperation = true; + } } + else { + suckedLastOperation = false; + } + + operatingTicks = 0; } } else { - ticker--; + suckedLastOperation = false; } } super.onUpdate(); - if(fluidTank.getFluid() != null) + if(!worldObj.isRemote && fluidTank.getFluid() != null) { for(ForgeDirection orientation : ForgeDirection.VALID_DIRECTIONS) { @@ -163,7 +199,7 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I if(tileEntity instanceof IFluidHandler) { - FluidStack toDrain = new FluidStack(fluidTank.getFluid(), Math.min(100, fluidTank.getFluidAmount())); + FluidStack toDrain = new FluidStack(fluidTank.getFluid(), Math.min(256*upgradeComponent.getUpgrades(Upgrade.SPEED), fluidTank.getFluidAmount())); fluidTank.drain(((IFluidHandler)tileEntity).fill(orientation.getOpposite(), toDrain, true), true); if(fluidTank.getFluid() == null || fluidTank.getFluid().amount <= 0) @@ -189,24 +225,23 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I for(ForgeDirection orientation : ForgeDirection.VALID_DIRECTIONS) { Coord4D wrapper = Coord4D.get(this).getFromSide(orientation); + FluidStack fluid = MekanismUtils.getFluid(worldObj, wrapper, hasFilter()); - if(MekanismUtils.isFluid(worldObj, wrapper)) + if(fluid != null && (activeType == null || fluid.getFluid() == activeType) && (fluidTank.getFluid() == null || fluidTank.getFluid().isFluidEqual(fluid))) { - FluidStack fluid = MekanismUtils.getFluid(worldObj, wrapper, hasFilter()); - - if((activeType == null || fluid.getFluid() == activeType) && (fluidTank.getFluid() == null || fluidTank.getFluid().isFluidEqual(fluid))) + if(take) { - if(take) + activeType = fluid.getFluid(); + recurringNodes.add(wrapper.clone()); + fluidTank.fill(fluid, true); + + if(shouldTake(fluid, wrapper)) { - setEnergy(getEnergy() - usage.electricPumpUsage); - activeType = fluid.getFluid(); - recurringNodes.add(wrapper.clone()); - fluidTank.fill(MekanismUtils.getFluid(worldObj, wrapper, hasFilter()), true); - worldObj.setBlockToAir(wrapper.xCoord, wrapper.yCoord, wrapper.zCoord); + worldObj.setBlock(wrapper.xCoord, wrapper.yCoord, wrapper.zCoord, Blocks.air, 0, 3); } - - return true; } + + return true; } } @@ -214,22 +249,22 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I //and then add the adjacent block to the recurring list for(Coord4D wrapper : tempPumpList) { - if(MekanismUtils.isFluid(worldObj, wrapper)) + FluidStack fluid = MekanismUtils.getFluid(worldObj, wrapper, hasFilter()); + + if(fluid != null && (activeType == null || fluid.getFluid() == activeType) && (fluidTank.getFluid() == null || fluidTank.getFluid().isFluidEqual(fluid))) { - FluidStack fluid = MekanismUtils.getFluid(worldObj, wrapper, hasFilter()); - - if((activeType == null || fluid.getFluid() == activeType) && (fluidTank.getFluid() == null || fluidTank.getFluid().isFluidEqual(fluid))) + if(take) { - if(take) + activeType = fluid.getFluid(); + fluidTank.fill(fluid, true); + + if(shouldTake(fluid, wrapper)) { - setEnergy(getEnergy() - usage.electricPumpUsage); - activeType = fluid.getFluid(); - fluidTank.fill(MekanismUtils.getFluid(worldObj, wrapper, hasFilter()), true); - worldObj.setBlockToAir(wrapper.xCoord, wrapper.yCoord, wrapper.zCoord); + worldObj.setBlock(wrapper.xCoord, wrapper.yCoord, wrapper.zCoord, Blocks.air, 0, 3); } - - return true; } + + return true; } //Add all the blocks surrounding this recurring node to the recurring node list @@ -237,25 +272,25 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I { Coord4D side = wrapper.getFromSide(orientation); - if(Coord4D.get(this).distanceTo(side) <= 80) + if(Coord4D.get(this).distanceTo(side) <= general.maxPumpRange) { - if(MekanismUtils.isFluid(worldObj, side)) + fluid = MekanismUtils.getFluid(worldObj, side, hasFilter()); + + if(fluid != null && (activeType == null || fluid.getFluid() == activeType) && (fluidTank.getFluid() == null || fluidTank.getFluid().isFluidEqual(fluid))) { - FluidStack fluid = MekanismUtils.getFluid(worldObj, side, hasFilter()); - - if((activeType == null || fluid.getFluid() == activeType) && (fluidTank.getFluid() == null || fluidTank.getFluid().isFluidEqual(fluid))) + if(take) { - if(take) + activeType = fluid.getFluid(); + recurringNodes.add(side); + fluidTank.fill(fluid, true); + + if(shouldTake(fluid, side)) { - setEnergy(getEnergy() - usage.electricPumpUsage); - activeType = fluid.getFluid(); - recurringNodes.add(side); - fluidTank.fill(MekanismUtils.getFluid(worldObj, side, hasFilter()), true); - worldObj.setBlockToAir(side.xCoord, side.yCoord, side.zCoord); + worldObj.setBlock(side.xCoord, side.yCoord, side.zCoord, Blocks.air, 0, 3); } - - return true; } + + return true; } } } @@ -271,6 +306,16 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I activeType = null; recurringNodes.clear(); } + + private boolean shouldTake(FluidStack fluid, Coord4D coord) + { + if(fluid.getFluid() == FluidRegistry.WATER) + { + return general.pumpWaterSources; + } + + return true; + } @Override public void handlePacketData(ByteBuf dataStream) @@ -320,6 +365,9 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I { super.writeToNBT(nbtTags); + nbtTags.setInteger("operatingTicks", operatingTicks); + nbtTags.setBoolean("suckedLastOperation", suckedLastOperation); + if(activeType != null) { nbtTags.setString("activeType", FluidRegistry.getFluidName(activeType)); @@ -352,6 +400,9 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I { super.readFromNBT(nbtTags); + operatingTicks = nbtTags.getInteger("operatingTicks"); + suckedLastOperation = nbtTags.getBoolean("suckedLastOperation"); + if(nbtTags.hasKey("activeType")) { activeType = FluidRegistry.getFluid(nbtTags.getString("activeType")); @@ -576,4 +627,21 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I throw new NoSuchMethodException(); } } + + @Override + public void recalculateUpgradables(Upgrade upgrade) + { + super.recalculateUpgradables(upgrade); + + switch(upgrade) + { + case SPEED: + ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); + case ENERGY: + energyPerTick = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_PER_TICK); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); + default: + break; + } + } } diff --git a/src/main/java/mekanism/common/tile/TileEntityFluidicPlenisher.java b/src/main/java/mekanism/common/tile/TileEntityFluidicPlenisher.java index 539ee9b52..325ce474b 100644 --- a/src/main/java/mekanism/common/tile/TileEntityFluidicPlenisher.java +++ b/src/main/java/mekanism/common/tile/TileEntityFluidicPlenisher.java @@ -1,14 +1,28 @@ package mekanism.common.tile; import io.netty.buffer.ByteBuf; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Set; + import mekanism.api.Coord4D; import mekanism.api.EnumColor; import mekanism.api.IConfigurable; +import mekanism.api.MekanismConfig.general; import mekanism.api.MekanismConfig.usage; +import mekanism.common.Upgrade; import mekanism.common.base.ISustainedTank; +import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.integration.IComputerIntegration; -import mekanism.common.util.*; +import mekanism.common.tile.component.TileComponentUpgrade; +import mekanism.common.util.ChargeUtils; +import mekanism.common.util.FluidContainerUtils; +import mekanism.common.util.LangUtils; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.PipeUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -16,14 +30,15 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ChatComponentText; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.Set; - -public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implements IComputerIntegration, IConfigurable, IFluidHandler, ISustainedTank +public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implements IComputerIntegration, IConfigurable, IFluidHandler, ISustainedTank, IUpgradeTile { public Set activeNodes = new HashSet(); public Set usedNodes = new HashSet(); @@ -32,13 +47,27 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen public FluidTank fluidTank = new FluidTank(10000); + /** How much energy this machine consumes per-tick. */ + public double BASE_ENERGY_PER_TICK = usage.fluidicPlenisherUsage; + + public double energyPerTick = BASE_ENERGY_PER_TICK; + + /** How many ticks it takes to run an operation. */ + public int BASE_TICKS_REQUIRED = 20; + + public int ticksRequired = BASE_TICKS_REQUIRED; + + /** How many ticks this machine has been operating for. */ + public int operatingTicks; + private static EnumSet dirs = EnumSet.complementOf(EnumSet.of(ForgeDirection.UP, ForgeDirection.UNKNOWN)); - private static int MAX_NODES = 4000; + + public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 3); public TileEntityFluidicPlenisher() { super("FluidicPlenisher", MachineType.FLUIDIC_PLENISHER.baseEnergy); - inventory = new ItemStack[3]; + inventory = new ItemStack[4]; } @Override @@ -120,10 +149,18 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen } } - if(getEnergy() >= usage.fluidicPlenisherUsage && worldObj.getWorldTime() % 10 == 0 && fluidTank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME) + if(MekanismUtils.canFunction(this) && getEnergy() >= energyPerTick && fluidTank.getFluid().getFluid().canBePlacedInWorld()) { - if(fluidTank.getFluid().getFluid().canBePlacedInWorld()) + if(!finishedCalc) { + setEnergy(getEnergy() - energyPerTick); + } + + if((operatingTicks + 1) < ticksRequired) + { + operatingTicks++; + } + else { if(!finishedCalc) { doPlenish(); @@ -131,17 +168,19 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen else { Coord4D below = Coord4D.get(this).getFromSide(ForgeDirection.DOWN); - if(canReplace(below, false, false) && getEnergy() >= usage.fluidicPlenisherUsage && fluidTank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME) + if(canReplace(below, false, false) && fluidTank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME) { if(fluidTank.getFluid().getFluid().canBePlacedInWorld()) { worldObj.setBlock(below.xCoord, below.yCoord, below.zCoord, MekanismUtils.getFlowingBlock(fluidTank.getFluid().getFluid()), 0, 3); - setEnergy(getEnergy() - usage.fluidicPlenisherUsage); + setEnergy(getEnergy() - energyPerTick); fluidTank.drain(FluidContainerRegistry.BUCKET_VOLUME, true); } } } + + operatingTicks = 0; } } } @@ -149,7 +188,7 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen private void doPlenish() { - if(usedNodes.size() >= MAX_NODES) + if(usedNodes.size() >= general.maxPlenisherNodes) { finishedCalc = true; return; @@ -185,9 +224,7 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen { worldObj.setBlock(coord.xCoord, coord.yCoord, coord.zCoord, MekanismUtils.getFlowingBlock(fluidTank.getFluid().getFluid()), 0, 3); - setEnergy(getEnergy() - usage.fluidicPlenisherUsage); fluidTank.drain(FluidContainerRegistry.BUCKET_VOLUME, true); - } for(ForgeDirection dir : dirs) @@ -215,11 +252,6 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen } } - public int getActiveY() - { - return yCoord-1; - } - public boolean canReplace(Coord4D coord, boolean checkNodes, boolean isPathfinding) { if(checkNodes && usedNodes.contains(coord)) @@ -283,6 +315,7 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen { super.writeToNBT(nbtTags); + nbtTags.setInteger("operatingTicks", operatingTicks); nbtTags.setBoolean("finishedCalc", finishedCalc); if(fluidTank.getFluid() != null) @@ -322,6 +355,7 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen { super.readFromNBT(nbtTags); + operatingTicks = nbtTags.getInteger("operatingTicks"); finishedCalc = nbtTags.getBoolean("finishedCalc"); if(nbtTags.hasKey("fluidTank")) @@ -522,4 +556,27 @@ public class TileEntityFluidicPlenisher extends TileEntityElectricBlock implemen throw new NoSuchMethodException(); } } + + @Override + public TileComponentUpgrade getComponent() + { + return upgradeComponent; + } + + @Override + public void recalculateUpgradables(Upgrade upgrade) + { + super.recalculateUpgradables(upgrade); + + switch(upgrade) + { + case SPEED: + ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); + case ENERGY: + energyPerTick = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_PER_TICK); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); + default: + break; + } + } }