package blusunrize.immersiveengineering.common.blocks.metal; import blusunrize.immersiveengineering.api.IEEnums; import blusunrize.immersiveengineering.api.IEEnums.SideConfig; import blusunrize.immersiveengineering.api.Lib; import blusunrize.immersiveengineering.api.energy.immersiveflux.FluxStorage; import blusunrize.immersiveengineering.common.Config.IEConfig; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IBlockOverlayText; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IComparatorOverride; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IConfigurableSides; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.ITileDrop; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; import blusunrize.immersiveengineering.common.util.EnergyHelper; import blusunrize.immersiveengineering.common.util.EnergyHelper.IEForgeEnergyWrapper; import blusunrize.immersiveengineering.common.util.EnergyHelper.IIEInternalFluxHandler; import blusunrize.immersiveengineering.common.util.ItemNBTHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.util.math.RayTraceResult; import javax.annotation.Nonnull; public class TileEntityCapacitorLV extends TileEntityIEBase implements ITickable, IIEInternalFluxHandler, IBlockOverlayText, IConfigurableSides, IComparatorOverride, ITileDrop { public SideConfig[] sideConfig={SideConfig.NONE,SideConfig.INPUT,SideConfig.NONE,SideConfig.NONE,SideConfig.NONE,SideConfig.NONE}; FluxStorage energyStorage = new FluxStorage(getMaxStorage(),getMaxInput(),getMaxOutput()); public int comparatorOutput=0; @Override public void update() { if(!worldObj.isRemote) { for(int i=0; i<6; i++) this.transferEnergy(i); if(worldObj.getTotalWorldTime()%32==((getPos().getX()^getPos().getZ())&31)) { int i = scaleStoredEnergyTo(15); if(i!=this.comparatorOutput) { this.comparatorOutput=i; worldObj.updateComparatorOutputLevel(getPos(), getBlockType()); } } } } public int scaleStoredEnergyTo(int scale) { return (int)(scale*(energyStorage.getEnergyStored()/(float)energyStorage.getMaxEnergyStored())); } protected void transferEnergy(int side) { if(this.sideConfig[side] != SideConfig.OUTPUT) return; EnumFacing fd = EnumFacing.getFront(side); TileEntity tileEntity = worldObj.getTileEntity(getPos().offset(fd)); int out = Math.min(getMaxOutput(), this.energyStorage.getEnergyStored()); this.energyStorage.modifyEnergyStored(-EnergyHelper.insertFlux(tileEntity, fd.getOpposite(), out, false)); } @Override public IEEnums.SideConfig getSideConfig(int side) { return this.sideConfig[side]; } @Override public boolean toggleSide(int side, EntityPlayer player) { sideConfig[side] = SideConfig.next(sideConfig[side]); this.markDirty(); this.markContainingBlockForUpdate(null); worldObj.addBlockEvent(getPos(), this.getBlockType(), 0, 0); return true; } @Override public boolean receiveClientEvent(int id, int arg) { if(id==0) { this.markContainingBlockForUpdate(null); return true; } return false; } public int getMaxStorage() { return IEConfig.Machines.capacitorLV_storage; } public int getMaxInput() { return IEConfig.Machines.capacitorLV_input; } public int getMaxOutput() { return IEConfig.Machines.capacitorLV_output; } @Override public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { for(int i=0; i<6; i++) nbt.setInteger("sideConfig_"+i, sideConfig[i].ordinal()); energyStorage.writeToNBT(nbt); } @Override public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { if(nbt.hasKey("sideConfig"))//old NBT style { int[] old = nbt.getIntArray("sideConfig"); for(int i=0; i<old.length; i++) sideConfig[i] = SideConfig.values()[old[i]+1]; } else for(int i=0; i<6; i++) sideConfig[i] = SideConfig.values()[nbt.getInteger("sideConfig_"+i)]; energyStorage.readFromNBT(nbt); } IEForgeEnergyWrapper[] wrappers = IEForgeEnergyWrapper.getDefaultWrapperArray(this); @Nonnull @Override public FluxStorage getFluxStorage() { return this.energyStorage; } @Nonnull @Override public SideConfig getEnergySideConfig(EnumFacing facing) { if(facing==null) return SideConfig.NONE; return this.sideConfig[facing.ordinal()]; } @Override public IEForgeEnergyWrapper getCapabilityWrapper(EnumFacing facing) { if(facing==null) return null; return wrappers[facing.ordinal()]; } @Override public String[] getOverlayText(EntityPlayer player, RayTraceResult mop, boolean hammer) { if(hammer && IEConfig.colourblindSupport) { SideConfig i = sideConfig[Math.min(sideConfig.length-1, mop.sideHit.ordinal())]; SideConfig j = sideConfig[Math.min(sideConfig.length-1, mop.sideHit.getOpposite().ordinal())]; return new String[]{ I18n.format(Lib.DESC_INFO+"blockSide.facing") +": "+ I18n.format(Lib.DESC_INFO+"blockSide.connectEnergy."+i), I18n.format(Lib.DESC_INFO+"blockSide.opposite") +": "+ I18n.format(Lib.DESC_INFO+"blockSide.connectEnergy."+j) }; } return null; } @Override public boolean useNixieFont(EntityPlayer player, RayTraceResult mop) { return false; } @Override public int getComparatorInputOverride() { return this.comparatorOutput; } @Override public ItemStack getTileDrop(EntityPlayer player, IBlockState state) { ItemStack stack = new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)); if(energyStorage.getEnergyStored()>0) ItemNBTHelper.setInt(stack, "energyStorage", energyStorage.getEnergyStored()); for(int i=0; i<6; i++) ItemNBTHelper.setInt(stack, "sideConfig_"+i, sideConfig[i].ordinal()); return stack; } @Override public void readOnPlacement(EntityLivingBase placer, ItemStack stack) { if(ItemNBTHelper.hasKey(stack, "energyStorage")) energyStorage.setEnergy(ItemNBTHelper.getInt(stack, "energyStorage")); for(int i=0; i<6; i++) if(ItemNBTHelper.hasKey(stack, "sideConfig_"+i)) sideConfig[i] = SideConfig.values()[ItemNBTHelper.getInt(stack, "sideConfig_"+i)]; } }