package shedar.mods.ic2.nuclearcontrol.tileentities; import shedar.mods.ic2.nuclearcontrol.crossmod.EnergyStorageData; import ic2.api.energy.EnergyNet; import ic2.api.energy.event.EnergyTileLoadEvent; import ic2.api.energy.event.EnergyTileUnloadEvent; import ic2.api.energy.tile.IEnergyConductor; import ic2.api.item.IC2Items; import ic2.api.network.INetworkClientTileEntityEventListener; import ic2.api.network.INetworkDataProvider; import ic2.api.network.INetworkUpdateListener; import ic2.api.tile.IWrenchable; import ic2.core.IC2; import ic2.core.network.NetworkManager; import java.util.List; import java.util.Vector; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Facing; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.MinecraftForge; import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl; import shedar.mods.ic2.nuclearcontrol.ISlotItemFilter; import shedar.mods.ic2.nuclearcontrol.utils.BlockDamages; import cpw.mods.fml.common.FMLCommonHandler; public class TileEntityEnergyCounter extends TileEntity implements IEnergyConductor, IWrenchable, INetworkClientTileEntityEventListener, IInventory, ISlotItemFilter, INetworkDataProvider, INetworkUpdateListener { private static final int BASE_PACKET_SIZE = 32; private boolean init; private ItemStack inventory[]; protected int updateTicker; protected int tickRate; public double counter; private short prevFacing; public short facing; // check out shedar.mods.ic2.nuclearcontrol.crossmod.EnergyStorageData private byte prevPowerType; public byte powerType; public int packetSize; private boolean addedToEnergyNet; public TileEntityEnergyCounter() { super(); inventory = new ItemStack[1];// transformers upgrade addedToEnergyNet = false; packetSize = BASE_PACKET_SIZE; prevFacing = facing = 0; counter = 0.0; tickRate = IC2NuclearControl.instance.screenRefreshPeriod; updateTicker = tickRate; } protected void initData() { init = true; } public void setPowerType(byte p) { powerType = p; if (prevPowerType != p) IC2.network.get().updateTileEntityField(this, "powerType"); prevPowerType = p; } @Override public short getFacing() { return (short) Facing.oppositeSide[facing]; } @Override public void setFacing(short f) { if (addedToEnergyNet) { EnergyTileUnloadEvent event = new EnergyTileUnloadEvent(this); MinecraftForge.EVENT_BUS.post(event); } setSide((short) Facing.oppositeSide[f]); addedToEnergyNet = false; if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { EnergyTileLoadEvent event = new EnergyTileLoadEvent(this); MinecraftForge.EVENT_BUS.post(event); addedToEnergyNet = true; } } private void setSide(short f) { facing = f; if(init && prevFacing != f) ((NetworkManager)IC2.network.get()).updateTileEntityField(this, "facing"); prevFacing = f; } @Override public void updateEntity() { if (!init) { initData(); markDirty(); } if (!worldObj.isRemote) { if (!addedToEnergyNet) { EnergyTileLoadEvent event = new EnergyTileLoadEvent(this); MinecraftForge.EVENT_BUS.post(event); addedToEnergyNet = true; } if (updateTicker-- == 0) { updateTicker = tickRate - 1; counter += EnergyNet.instance.getTotalEnergyEmitted(this); //So sue me this.setPowerType((byte)EnergyStorageData.TARGET_TYPE_IC2); } } } @Override public void readFromNBT(NBTTagCompound nbttagcompound) { super.readFromNBT(nbttagcompound); facing = nbttagcompound.getShort("facing"); counter = nbttagcompound.getDouble("counter"); powerType = nbttagcompound.getByte("powerType"); NBTTagList nbttaglist = nbttagcompound.getTagList("Items", Constants.NBT.TAG_COMPOUND); inventory = new ItemStack[getSizeInventory()]; for (int i = 0; i < nbttaglist.tagCount(); i++) { NBTTagCompound compound = nbttaglist.getCompoundTagAt(i); byte slotNum = compound.getByte("Slot"); if (slotNum >= 0 && slotNum < inventory.length) { inventory[slotNum] = ItemStack.loadItemStackFromNBT(compound); } } markDirty(); } @Override public void onNetworkUpdate(String field) { if (field.equals("facing") && prevFacing != facing) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); prevFacing = facing; } } @Override public void invalidate() { if (!worldObj.isRemote && addedToEnergyNet) { EnergyTileUnloadEvent event = new EnergyTileUnloadEvent(this); MinecraftForge.EVENT_BUS.post(event); addedToEnergyNet = false; } super.invalidate(); } @Override public void writeToNBT(NBTTagCompound nbttagcompound) { super.writeToNBT(nbttagcompound); nbttagcompound.setShort("facing", facing); nbttagcompound.setDouble("counter", counter); nbttagcompound.setByte("powerType", powerType); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < inventory.length; i++) { if (inventory[i] != null) { NBTTagCompound compound = new NBTTagCompound(); compound.setByte("Slot", (byte) i); inventory[i].writeToNBT(compound); nbttaglist.appendTag(compound); } } nbttagcompound.setTag("Items", nbttaglist); } @Override public int getSizeInventory() { return inventory.length; } @Override public ItemStack getStackInSlot(int slotNum) { return inventory[slotNum]; } @Override public ItemStack decrStackSize(int slotNum, int amount) { if (inventory[slotNum] != null) { if (inventory[slotNum].stackSize <= amount) { ItemStack itemStack = inventory[slotNum]; inventory[slotNum] = null; markDirty(); return itemStack; } ItemStack taken = inventory[slotNum].splitStack(amount); if (inventory[slotNum].stackSize == 0) { inventory[slotNum] = null; } markDirty(); return taken; } return null; } @Override public ItemStack getStackInSlotOnClosing(int var1) { return null; } @Override public void setInventorySlotContents(int slotNum, ItemStack itemStack) { inventory[slotNum] = itemStack; if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { itemStack.stackSize = getInventoryStackLimit(); } markDirty(); } @Override public String getInventoryName() { return "block.RemoteThermo"; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; } @Override public void openInventory(){} @Override public void closeInventory(){} @Override public void markDirty() { super.markDirty(); int upgradeCountTransormer = 0; ItemStack itemStack = inventory[0]; if (itemStack != null && itemStack.isItemEqual(IC2Items.getItem("transformerUpgrade"))) { upgradeCountTransormer = itemStack.stackSize; } upgradeCountTransormer = Math.min(upgradeCountTransormer, 4); if (worldObj != null && !worldObj.isRemote) { packetSize = BASE_PACKET_SIZE * (int) Math.pow(4D, upgradeCountTransormer); if (addedToEnergyNet) { EnergyTileUnloadEvent event = new EnergyTileUnloadEvent(this); MinecraftForge.EVENT_BUS.post(event); } addedToEnergyNet = false; EnergyTileLoadEvent event = new EnergyTileLoadEvent(this); MinecraftForge.EVENT_BUS.post(event); addedToEnergyNet = true; } }; @Override public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) { return direction.ordinal() == getFacing(); } @Override public boolean emitsEnergyTo(TileEntity receiver, ForgeDirection direction) { return direction.ordinal() != getFacing(); } @Override public boolean isItemValid(int slotIndex, ItemStack itemstack) { return itemstack.isItemEqual(IC2Items.getItem("transformerUpgrade")); } @Override public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int face) { return getFacing() != face; }; @Override public boolean wrenchCanRemove(EntityPlayer entityPlayer) { return true; } @Override public float getWrenchDropRate() { return 1; } @Override public List<String> getNetworkedFields() { Vector<String> vector = new Vector<String>(2); vector.add("facing"); vector.add("powerType"); return vector; } @Override public void onNetworkEvent(EntityPlayer player, int event) { counter = 0; } @Override public ItemStack getWrenchDrop(EntityPlayer entityPlayer) { return new ItemStack(IC2NuclearControl.blockNuclearControlMain, 1, BlockDamages.DAMAGE_ENERGY_COUNTER); } @Override public double getConductionLoss() { return 0.025D; } @Override public double getInsulationEnergyAbsorption() { return 16384; } @Override public double getInsulationBreakdownEnergy() { return packetSize + 1; } @Override public double getConductorBreakdownEnergy() { return packetSize + 1; } @Override public void removeInsulation() { } @Override public void removeConductor() { worldObj.setBlock(xCoord, yCoord, zCoord, Blocks.air, 0, 3); worldObj.createExplosion(null, xCoord, yCoord, zCoord, 0.8F, false); } @Override public boolean hasCustomInventoryName() { return false; } @Override public boolean isItemValidForSlot(int slot, ItemStack itemstack) { return isItemValid(slot, itemstack); } }