diff --git a/src/main/java/resonantinduction/archaic/crate/TileCrate.java b/src/main/java/resonantinduction/archaic/crate/TileCrate.java index 34e9407f..9bcb5e76 100644 --- a/src/main/java/resonantinduction/archaic/crate/TileCrate.java +++ b/src/main/java/resonantinduction/archaic/crate/TileCrate.java @@ -17,7 +17,9 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; /** - * Basic single stack inventory + * Basic single stack inventory. + * + * TODO: Add filter-locking feature. Put filter in, locks the crate to only use that item. * * @author DarkGuardsman */ diff --git a/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java b/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java index 0c61bc8c..970708ca 100644 --- a/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java +++ b/src/main/java/resonantinduction/archaic/engineering/TileEngineeringTable.java @@ -23,7 +23,7 @@ import resonantinduction.api.IArmbot; import resonantinduction.api.IArmbotUseable; import resonantinduction.archaic.imprint.ItemBlockImprint; import resonantinduction.core.ResonantInduction; -import resonantinduction.core.prefab.ContainerFake; +import resonantinduction.core.prefab.ContainerDummy; import resonantinduction.electrical.encoder.coding.args.ArgumentData; import universalelectricity.api.vector.Vector3; import calclavia.lib.network.IPacketReceiver; @@ -284,7 +284,7 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive */ public InventoryCrafting getCraftingMatrix() { - InventoryCrafting inventoryCrafting = new InventoryCrafting(new ContainerFake(this), 3, 3); + InventoryCrafting inventoryCrafting = new InventoryCrafting(new ContainerDummy(this), 3, 3); for (int i = 0; i < this.craftingMatrix.length; i++) { diff --git a/src/main/java/resonantinduction/core/ResonantInduction.java b/src/main/java/resonantinduction/core/ResonantInduction.java index e0da7742..ba276628 100644 --- a/src/main/java/resonantinduction/core/ResonantInduction.java +++ b/src/main/java/resonantinduction/core/ResonantInduction.java @@ -17,8 +17,8 @@ import resonantinduction.core.resource.ResourceGenerator; import resonantinduction.core.resource.fluid.BlockFluidMixture; import resonantinduction.core.resource.fluid.TileFluidMixture; import resonantinduction.core.resource.item.ItemOreResource; -import calclavia.lib.multiblock.link.BlockMulti; -import calclavia.lib.multiblock.link.TileMultiBlockPart; +import calclavia.lib.multiblock.fake.BlockMultiFake; +import calclavia.lib.multiblock.fake.TileMultiBlockPart; import calclavia.lib.network.PacketHandler; import calclavia.lib.network.PacketTile; import calclavia.lib.utility.LanguageUtility; diff --git a/src/main/java/resonantinduction/core/debug/TileEntityInfFluid.java b/src/main/java/resonantinduction/core/debug/TileEntityInfFluid.java index a06de764..458cb704 100644 --- a/src/main/java/resonantinduction/core/debug/TileEntityInfFluid.java +++ b/src/main/java/resonantinduction/core/debug/TileEntityInfFluid.java @@ -14,7 +14,7 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import universalelectricity.api.vector.Vector3; -import calclavia.lib.multiblock.link.IBlockActivate; +import calclavia.lib.multiblock.fake.IBlockActivate; import calclavia.lib.utility.FluidUtility; import com.builtbroken.common.lang.TextHelper.TextColor; diff --git a/src/main/java/resonantinduction/core/prefab/ContainerDummy.java b/src/main/java/resonantinduction/core/prefab/ContainerDummy.java new file mode 100644 index 00000000..6f7354c4 --- /dev/null +++ b/src/main/java/resonantinduction/core/prefab/ContainerDummy.java @@ -0,0 +1,54 @@ +package resonantinduction.core.prefab; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import calclavia.lib.prefab.tile.IPlayerUsing; + +/** + * Allows the use of a tile inventory without the need for a container class. + * + * @author DarkGuardsman + */ +public class ContainerDummy extends Container +{ + protected TileEntity tile; + + public ContainerDummy(TileEntity tile) + { + this.tile = tile; + } + + public ContainerDummy(EntityPlayer player, TileEntity tile) + { + this(tile); + + if (tile instanceof IPlayerUsing) + { + ((IPlayerUsing) tile).getPlayersUsing().add(player); + } + } + + public void onContainerClosed(EntityPlayer player) + { + if (tile instanceof IPlayerUsing) + { + ((IPlayerUsing) tile).getPlayersUsing().remove(player); + } + + super.onContainerClosed(player); + } + + @Override + public boolean canInteractWith(EntityPlayer par1EntityPlayer) + { + if (tile instanceof IInventory) + { + return ((IInventory) this.tile).isUseableByPlayer(par1EntityPlayer); + } + + return true; + } + +} diff --git a/src/main/java/resonantinduction/core/prefab/ContainerFake.java b/src/main/java/resonantinduction/core/prefab/ContainerFake.java deleted file mode 100644 index 349d2af4..00000000 --- a/src/main/java/resonantinduction/core/prefab/ContainerFake.java +++ /dev/null @@ -1,32 +0,0 @@ -package resonantinduction.core.prefab; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.tileentity.TileEntity; - -/** - * Allows the use of a tile inv without the need for a container class - * - * @author DarkGuardsman - */ -public class ContainerFake extends Container -{ - TileEntity entity = null; - - public ContainerFake(TileEntity entity) - { - this.entity = entity; - } - - @Override - public boolean canInteractWith(EntityPlayer par1EntityPlayer) - { - if (entity instanceof IInventory) - { - return ((IInventory) this.entity).isUseableByPlayer(par1EntityPlayer); - } - return true; - } - -} diff --git a/src/main/java/resonantinduction/electrical/armbot/BlockArmbot.java b/src/main/java/resonantinduction/electrical/armbot/BlockArmbot.java index 4d328d61..d19216d7 100644 --- a/src/main/java/resonantinduction/electrical/armbot/BlockArmbot.java +++ b/src/main/java/resonantinduction/electrical/armbot/BlockArmbot.java @@ -16,8 +16,8 @@ import resonantinduction.core.prefab.block.BlockRI; import resonantinduction.core.render.RIBlockRenderingHandler; import calclavia.components.CalclaviaLoader; import calclavia.lib.content.IExtraInfo.IExtraBlockInfo; -import calclavia.lib.multiblock.link.IBlockActivate; -import calclavia.lib.multiblock.link.IMultiBlock; +import calclavia.lib.multiblock.fake.IBlockActivate; +import calclavia.lib.multiblock.fake.IMultiBlock; import com.builtbroken.common.Pair; diff --git a/src/main/java/resonantinduction/electrical/armbot/TileArmbot.java b/src/main/java/resonantinduction/electrical/armbot/TileArmbot.java index aca5ca62..8c8af252 100644 --- a/src/main/java/resonantinduction/electrical/armbot/TileArmbot.java +++ b/src/main/java/resonantinduction/electrical/armbot/TileArmbot.java @@ -23,8 +23,8 @@ import resonantinduction.electrical.encoder.coding.IProgram; import resonantinduction.electrical.encoder.coding.ProgramHelper; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.lib.multiblock.link.IBlockActivate; -import calclavia.lib.multiblock.link.IMultiBlock; +import calclavia.lib.multiblock.fake.IBlockActivate; +import calclavia.lib.multiblock.fake.IMultiBlock; import calclavia.lib.network.PacketHandler; import calclavia.lib.utility.LanguageUtility; import calclavia.lib.utility.MathUtility; diff --git a/src/main/java/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java b/src/main/java/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java index 0cbaf9f9..f5df710d 100644 --- a/src/main/java/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java +++ b/src/main/java/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java @@ -2,7 +2,7 @@ package resonantinduction.electrical.encoder.gui; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; -import resonantinduction.core.prefab.ContainerFake; +import resonantinduction.core.prefab.ContainerDummy; import resonantinduction.electrical.encoder.TileEncoder; import calclavia.lib.gui.GuiContainerBase; @@ -20,7 +20,7 @@ public class GuiEncoderBase extends GuiContainerBase public GuiEncoderBase(InventoryPlayer player, TileEncoder tileEntity) { - this(player, tileEntity, new ContainerFake(tileEntity)); + this(player, tileEntity, new ContainerDummy(tileEntity)); } public int getGuiLeft() diff --git a/src/main/java/resonantinduction/electrical/tesla/BlockTesla.java b/src/main/java/resonantinduction/electrical/tesla/BlockTesla.java index 9f5956d5..e870d46b 100644 --- a/src/main/java/resonantinduction/electrical/tesla/BlockTesla.java +++ b/src/main/java/resonantinduction/electrical/tesla/BlockTesla.java @@ -41,7 +41,7 @@ public class BlockTesla extends BlockIOBase implements ITileEntityProvider public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ) { TileEntity t = world.getBlockTileEntity(x, y, z); - TileTesla tileEntity = ((TileTesla) t).getControllingTelsa(); + TileTesla tileEntity = ((TileTesla) t).getMultiBlock().get(); if (entityPlayer.getCurrentEquippedItem() != null) { diff --git a/src/main/java/resonantinduction/electrical/tesla/TileTesla.java b/src/main/java/resonantinduction/electrical/tesla/TileTesla.java index 7dd3ef95..43267490 100644 --- a/src/main/java/resonantinduction/electrical/tesla/TileTesla.java +++ b/src/main/java/resonantinduction/electrical/tesla/TileTesla.java @@ -28,6 +28,8 @@ import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorWorld; import calclavia.lib.CustomDamageSource; +import calclavia.lib.multiblock.reference.IMultiBlockStructure; +import calclavia.lib.multiblock.reference.MultiBlockHandler; import calclavia.lib.network.IPacketReceiver; import calclavia.lib.network.IPacketSender; import calclavia.lib.prefab.tile.TileElectrical; @@ -46,7 +48,7 @@ import cpw.mods.fml.common.network.PacketDispatcher; * @author Calclavia * */ -public class TileTesla extends TileElectrical implements ITesla, IPacketSender, IPacketReceiver, ILinkable +public class TileTesla extends TileElectrical implements IMultiBlockStructure, ITesla, IPacketSender, IPacketReceiver, ILinkable { public final static int DEFAULT_COLOR = 12; public final long TRANSFER_CAP = 10000; @@ -62,12 +64,6 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, private final Set outputBlacklist = new HashSet(); private final Set connectedTeslas = new HashSet(); - /** - * Caching - */ - private TileTesla topCache = null; - private TileTesla controlCache = null; - /** * Quantum Tesla */ @@ -81,6 +77,8 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, private boolean isLinkedClient; private boolean isTransfering; + private TileTesla topCache; + public TileTesla() { this.energy = new EnergyStorageHandler(TRANSFER_CAP); @@ -104,7 +102,7 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, /** * Only transfer if it is the bottom controlling Tesla tower. */ - if (this.isController()) + if (this.getMultiBlock().isPrimary()) { // this.produce(); @@ -162,7 +160,7 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, continue; } - tesla = ((TileTesla) tesla).getControllingTelsa(); + tesla = getMultiBlock().get(); } transferTeslaCoils.add(tesla); @@ -215,7 +213,7 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, if (tesla instanceof TileTesla) { - ((TileTesla) tesla).getControllingTelsa().outputBlacklist.add(this); + getMultiBlock().get().outputBlacklist.add(this); targetVector = new Vector3(((TileTesla) tesla).getTopTelsa()); } @@ -264,7 +262,7 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, } } - this.clearCache(); + this.topCache = null; } private void transfer(ITesla tesla, long transferEnergy) @@ -285,7 +283,7 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, @Override public boolean canConnect(ForgeDirection direction) { - return super.canConnect(direction) && this.isController(); + return super.canConnect(direction) && this.getMultiBlock().isPrimary(); } public void sendPacket(int type) @@ -356,21 +354,10 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, } } - private boolean isController() - { - return this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) == 0; - } - - private void clearCache() - { - this.topCache = null; - this.controlCache = null; - } - @Override public long teslaTransfer(long transferEnergy, boolean doTransfer) { - if (isController() || this.getControllingTelsa() == this) + if (getMultiBlock().isPrimary()) { if (doTransfer) { @@ -392,7 +379,7 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, this.energy.setEnergy(0); } - return this.getControllingTelsa().teslaTransfer(transferEnergy, doTransfer); + return getMultiBlock().get().teslaTransfer(transferEnergy, doTransfer); } } @@ -403,6 +390,14 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, public void updatePositionStatus() { + Vector3[] vecs = getMultiBlockVectors(); + + if (vecs.length > 0) + { + ((TileTesla) vecs[vecs.length - 1].getTileEntity(worldObj)).getMultiBlock().deconstruct(); + ((TileTesla) vecs[vecs.length - 1].getTileEntity(worldObj)).getMultiBlock().construct(); + } + boolean isTop = new Vector3(this).translate(new Vector3(0, 1, 0)).getTileEntity(this.worldObj) instanceof TileTesla; boolean isBottom = new Vector3(this).translate(new Vector3(0, -1, 0)).getTileEntity(this.worldObj) instanceof TileTesla; @@ -457,41 +452,6 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, return returnTile; } - /** - * For non-controlling Tesla to use. - * - * @return - */ - public TileTesla getControllingTelsa() - { - if (this.controlCache != null) - { - return this.controlCache; - } - - Vector3 checkPosition = new Vector3(this); - TileTesla returnTile = this; - - while (true) - { - TileEntity t = checkPosition.getTileEntity(this.worldObj); - - if (t instanceof TileTesla) - { - returnTile = (TileTesla) t; - } - else - { - break; - } - - checkPosition.y--; - } - - this.controlCache = returnTile; - return returnTile; - } - /** * Called only on bottom. * @@ -651,4 +611,62 @@ public class TileTesla extends TileElectrical implements ITesla, IPacketSender, return false; } + + /** + * Multiblock Methods. + */ + private MultiBlockHandler multiBlock; + + @Override + public void onMultiBlockChanged() + { + + } + + @Override + public Vector3[] getMultiBlockVectors() + { + List vectors = new ArrayList(); + + Vector3 checkPosition = new Vector3(this); + + while (true) + { + TileEntity t = checkPosition.getTileEntity(this.worldObj); + + if (t instanceof TileTesla) + { + checkPosition.add(new Vector3((TileTesla) t).subtract(getPosition())); + } + else + { + break; + } + + checkPosition.y--; + } + + return vectors.toArray(new Vector3[0]); + } + + @Override + public World getWorld() + { + return worldObj; + } + + @Override + public Vector3 getPosition() + { + return new Vector3(this); + } + + @Override + public MultiBlockHandler getMultiBlock() + { + if (multiBlock == null) + multiBlock = new MultiBlockHandler(this); + + return multiBlock; + } }