2012-11-05 20:29:04 +01:00
|
|
|
package mekanism.common;
|
2012-10-28 23:18:23 +01:00
|
|
|
|
2012-11-02 02:30:40 +01:00
|
|
|
import buildcraft.api.power.PowerFramework;
|
2012-10-28 23:18:23 +01:00
|
|
|
import universalelectricity.prefab.TileEntityDisableable;
|
|
|
|
import ic2.api.EnergyNet;
|
|
|
|
import ic2.api.IWrenchable;
|
2012-11-05 20:29:04 +01:00
|
|
|
import mekanism.api.ITileNetwork;
|
2012-10-28 23:18:23 +01:00
|
|
|
import net.minecraft.src.*;
|
|
|
|
import net.minecraftforge.common.ForgeDirection;
|
|
|
|
import net.minecraftforge.common.ISidedInventory;
|
|
|
|
|
|
|
|
public abstract class TileEntityElectricBlock extends TileEntityDisableable implements IWrenchable, ISidedInventory, IInventory, ITileNetwork
|
|
|
|
{
|
|
|
|
/** The inventory slot itemstacks used by this block. */
|
|
|
|
public ItemStack[] inventory;
|
|
|
|
|
|
|
|
/** How much energy is stored in this block. */
|
|
|
|
public int energyStored;
|
|
|
|
|
|
|
|
/** The direction this block is facing. */
|
|
|
|
public int facing;
|
|
|
|
|
|
|
|
/** Maximum amount of energy this machine can hold. */
|
|
|
|
public int MAX_ENERGY;
|
|
|
|
|
|
|
|
/** The full name of this machine. */
|
|
|
|
public String fullName;
|
|
|
|
|
|
|
|
/** Whether or not this machine has initialized and registered with other mods. */
|
|
|
|
public boolean initialized;
|
|
|
|
|
|
|
|
/** The amount of players using this block */
|
|
|
|
public int playersUsing = 0;
|
|
|
|
|
|
|
|
/** A timer used to send packets to clients. */
|
|
|
|
public int packetTick;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The base of all blocks that deal with electricity. It has a facing state, initialized state,
|
|
|
|
* and a current amount of stored energy.
|
|
|
|
* @param name - full name of this block
|
|
|
|
* @param maxEnergy - how much energy this block can store
|
|
|
|
*/
|
|
|
|
public TileEntityElectricBlock(String name, int maxEnergy)
|
|
|
|
{
|
|
|
|
fullName = name;
|
|
|
|
MAX_ENERGY = maxEnergy;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public void updateEntity()
|
|
|
|
{
|
2012-11-06 16:44:14 +01:00
|
|
|
super.updateEntity();
|
|
|
|
|
2012-10-28 23:18:23 +01:00
|
|
|
if(!initialized && worldObj != null)
|
|
|
|
{
|
2012-11-05 20:29:04 +01:00
|
|
|
if(Mekanism.hooks.IC2Loaded)
|
2012-10-28 23:18:23 +01:00
|
|
|
{
|
|
|
|
EnergyNet.getForWorld(worldObj).addTileEntity(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
initialized = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
onUpdate();
|
|
|
|
|
|
|
|
if(!worldObj.isRemote)
|
|
|
|
{
|
|
|
|
if(playersUsing > 0)
|
|
|
|
{
|
2012-11-06 16:44:14 +01:00
|
|
|
if(packetTick % 3 == 0)
|
|
|
|
{
|
|
|
|
sendPacketWithRange();
|
|
|
|
}
|
2012-10-28 23:18:23 +01:00
|
|
|
}
|
|
|
|
else {
|
2012-10-30 05:14:25 +01:00
|
|
|
if(packetTick % 20 == 0)
|
2012-10-28 23:18:23 +01:00
|
|
|
{
|
|
|
|
sendPacketWithRange();
|
|
|
|
}
|
|
|
|
}
|
2012-10-30 05:14:25 +01:00
|
|
|
packetTick++;
|
2012-10-28 23:18:23 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update call for machines. Use instead of updateEntity -- it's called every tick.
|
|
|
|
*/
|
|
|
|
public abstract void onUpdate();
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public int getStartInventorySide(ForgeDirection side)
|
|
|
|
{
|
|
|
|
if (side == ForgeDirection.DOWN) return 1;
|
|
|
|
if (side == ForgeDirection.UP) return 0;
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public int getSizeInventorySide(ForgeDirection side)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public int getSizeInventory()
|
|
|
|
{
|
|
|
|
return inventory.length;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public ItemStack getStackInSlot(int par1)
|
|
|
|
{
|
|
|
|
return inventory[par1];
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public ItemStack decrStackSize(int par1, int par2)
|
|
|
|
{
|
|
|
|
if (inventory[par1] != null)
|
|
|
|
{
|
|
|
|
ItemStack var3;
|
|
|
|
|
|
|
|
if (inventory[par1].stackSize <= par2)
|
|
|
|
{
|
|
|
|
var3 = inventory[par1];
|
|
|
|
inventory[par1] = null;
|
|
|
|
return var3;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
var3 = inventory[par1].splitStack(par2);
|
|
|
|
|
|
|
|
if (inventory[par1].stackSize == 0)
|
|
|
|
{
|
|
|
|
inventory[par1] = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return var3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public ItemStack getStackInSlotOnClosing(int par1)
|
|
|
|
{
|
|
|
|
if (inventory[par1] != null)
|
|
|
|
{
|
|
|
|
ItemStack var2 = inventory[par1];
|
|
|
|
inventory[par1] = null;
|
|
|
|
return var2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
|
|
|
|
{
|
|
|
|
inventory[par1] = par2ItemStack;
|
|
|
|
|
|
|
|
if (par2ItemStack != null && par2ItemStack.stackSize > getInventoryStackLimit())
|
|
|
|
{
|
|
|
|
par2ItemStack.stackSize = getInventoryStackLimit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-11-02 02:30:40 +01:00
|
|
|
public void readFromNBT(NBTTagCompound nbtTags)
|
|
|
|
{
|
|
|
|
super.readFromNBT(nbtTags);
|
|
|
|
|
|
|
|
NBTTagList tagList = nbtTags.getTagList("Items");
|
|
|
|
inventory = new ItemStack[getSizeInventory()];
|
|
|
|
|
|
|
|
for (int slots = 0; slots < tagList.tagCount(); ++slots)
|
|
|
|
{
|
|
|
|
NBTTagCompound tagCompound = (NBTTagCompound)tagList.tagAt(slots);
|
|
|
|
byte slotID = tagCompound.getByte("Slot");
|
|
|
|
|
|
|
|
if (slotID >= 0 && slotID < inventory.length)
|
|
|
|
{
|
|
|
|
inventory[slotID] = ItemStack.loadItemStackFromNBT(tagCompound);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
energyStored = nbtTags.getInteger("energyStored");
|
|
|
|
facing = nbtTags.getInteger("facing");
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-11-02 02:30:40 +01:00
|
|
|
public void writeToNBT(NBTTagCompound nbtTags)
|
|
|
|
{
|
|
|
|
super.writeToNBT(nbtTags);
|
|
|
|
|
|
|
|
nbtTags.setInteger("energyStored", energyStored);
|
|
|
|
nbtTags.setInteger("facing", facing);
|
|
|
|
NBTTagList tagList = new NBTTagList();
|
|
|
|
|
|
|
|
for (int slots = 0; slots < inventory.length; ++slots)
|
|
|
|
{
|
|
|
|
if (inventory[slots] != null)
|
|
|
|
{
|
|
|
|
NBTTagCompound tagCompound = new NBTTagCompound();
|
|
|
|
tagCompound.setByte("Slot", (byte)slots);
|
|
|
|
inventory[slots].writeToNBT(tagCompound);
|
|
|
|
tagList.appendTag(tagCompound);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nbtTags.setTag("Items", tagList);
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public boolean isUseableByPlayer(EntityPlayer entityplayer)
|
|
|
|
{
|
|
|
|
return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) != this ? false : entityplayer.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64.0D;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public short getFacing()
|
|
|
|
{
|
|
|
|
return (short)facing;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public void setFacing(short direction)
|
|
|
|
{
|
|
|
|
if(initialized)
|
|
|
|
{
|
2012-11-05 20:29:04 +01:00
|
|
|
if(Mekanism.hooks.IC2Loaded)
|
2012-10-28 23:18:23 +01:00
|
|
|
{
|
|
|
|
EnergyNet.getForWorld(worldObj).removeTileEntity(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
initialized = false;
|
|
|
|
facing = direction;
|
|
|
|
sendPacket();
|
2012-11-05 20:29:04 +01:00
|
|
|
if(Mekanism.hooks.IC2Loaded)
|
2012-10-28 23:18:23 +01:00
|
|
|
{
|
|
|
|
EnergyNet.getForWorld(worldObj).addTileEntity(this);
|
|
|
|
}
|
|
|
|
initialized = true;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public boolean wrenchCanRemove(EntityPlayer entityPlayer)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public float getWrenchDropRate()
|
|
|
|
{
|
|
|
|
return 1.0F;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isAddedToEnergyNet()
|
|
|
|
{
|
|
|
|
return initialized;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public String getInvName()
|
|
|
|
{
|
|
|
|
return fullName;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public int getInventoryStackLimit()
|
|
|
|
{
|
|
|
|
return 64;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public void openChest()
|
|
|
|
{
|
|
|
|
playersUsing++;
|
|
|
|
}
|
|
|
|
|
2012-11-06 16:44:14 +01:00
|
|
|
@Override
|
2012-10-28 23:18:23 +01:00
|
|
|
public void closeChest()
|
|
|
|
{
|
|
|
|
playersUsing--;
|
|
|
|
}
|
|
|
|
}
|