Tesla now uses new multiblock library

This commit is contained in:
Calclavia 2014-01-19 02:13:17 +08:00
parent ba212e9d29
commit 1b17e38217
11 changed files with 147 additions and 105 deletions

View file

@ -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
*/

View file

@ -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++)
{

View file

@ -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;

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;

View file

@ -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()

View file

@ -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)
{

View file

@ -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<TileTesla>, 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<TileTesla> outputBlacklist = new HashSet<TileTesla>();
private final Set<TileTesla> connectedTeslas = new HashSet<TileTesla>();
/**
* 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<TileTesla> multiBlock;
@Override
public void onMultiBlockChanged()
{
}
@Override
public Vector3[] getMultiBlockVectors()
{
List<Vector3> vectors = new ArrayList<Vector3>();
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<TileTesla> getMultiBlock()
{
if (multiBlock == null)
multiBlock = new MultiBlockHandler<TileTesla>(this);
return multiBlock;
}
}