package ihl.flexible_cable; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import ic2.api.energy.EnergyNet; import ic2.api.energy.event.EnergyTileLoadEvent; import ic2.api.energy.event.EnergyTileUnloadEvent; import ic2.api.energy.tile.IEnergySink; import ic2.api.energy.tile.IEnergySource; import ic2.core.ExplosionIC2; import ic2.core.IC2; import ic2.core.block.TileEntityBlock; import ihl.interfaces.IEnergyNetNode; import ihl.interfaces.IMultiPowerCableHolder; import ihl.utils.IHLUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; public class AnchorTileEntity extends TileEntityBlock implements IEnergySink, IEnergySource, IMultiPowerCableHolder { public boolean addedToEnergyNet=false; public final Set sacrifices = new HashSet(); public SubAnchorEnergyNetNode[] energyNetNodes = new SubAnchorEnergyNetNode[6]; public boolean[] hasCableOnSide=new boolean [] {false,false,false,false,false,false}; public int checksum=-1; public boolean checkCables=true; public AnchorTileEntity() { super(); for(short i=0;i<6;i++) { energyNetNodes[i] = new SubAnchorEnergyNetNode(this, i); } } @Override public List getNetworkedFields() { List fields = super.getNetworkedFields(); fields.add("hasCableOnSide"); return fields; } @Override public void onLoaded() { super.onLoaded(); for(short i=0;i<6;i++) { energyNetNodes[i].onLoaded(); } if (IC2.platform.isSimulating()&&!this.addedToEnergyNet) { MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this)); this.addedToEnergyNet = true; } } @Override public void onUnloaded() { if (IC2.platform.isSimulating()) { if(this.addedToEnergyNet) { MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this)); this.addedToEnergyNet = false; } } } @Override public boolean wrenchCanRemove(EntityPlayer var1) { return false; } public boolean enableUpdateEntity() { return IC2.platform.isSimulating(); } @Override public void updateEntityServer() { if(!sacrifices.isEmpty()) { Iterator victimIterator = sacrifices.iterator(); while(victimIterator.hasNext()) { TileEntity sacrifice = victimIterator.next(); ExplosionIC2 explosion = new ExplosionIC2(this.worldObj, null, sacrifice.xCoord+0.5D, sacrifice.yCoord+0.5D, sacrifice.zCoord+0.5D, 3F, 0.3F, ExplosionIC2.Type.Normal, null, 0); explosion.doExplosion(); sacrifices.remove(sacrifice); } } int newchecksum=0; for(short i=0;i<6;i++) { if(this.hasCableOnSide[i]) { newchecksum++; } } if(newchecksum!=checksum) { IC2.network.get().updateTileEntityField(this, "hasCableOnSide"); checksum=newchecksum; } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagList energyNetNodeNBTList = new NBTTagList(); for(SubAnchorEnergyNetNode node:this.energyNetNodes) { energyNetNodeNBTList.appendTag(node.writeToNBT()); } nbt.setTag("energyNetNodes", energyNetNodeNBTList); nbt.setBoolean("checkCables", this.checkCables); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); if(!nbt.hasKey("energyNetNodes")) { short facing = nbt.getShort("facing"); int gridID=nbt.getInteger("gridID"); this.energyNetNodes[facing].setGrid(gridID); NBTTagList cableNBTList=nbt.getTagList("cableList", 10); for(int i=0;i500D) { Set teset = new HashSet(); ForgeDirection direction = ForgeDirection.getOrientation(i).getOpposite(); TileEntity te = EnergyNet.instance.getNeighbor(this, direction); teset.add(te); TileEntity te1 = this.getSink(te, teset); if(te1 instanceof IEnergyNetNode) { if(((IEnergyNetNode)te1).getMaxAllowableVoltage()>=voltage) { return; } } if(te1!=null) { sacrifices.add(te1); } } if(amount<=0d) { break; } } } @Override public int getSourceTier() { return 4; } @Override public double getDemandedEnergy() { double amount=0d; for(short i=0;i<6;i++) { amount+=energyNetNodes[i].getDemandedEnergy(); } return amount; } @Override public int getSinkTier() { return 4; } @Override public double injectEnergy(ForgeDirection directionFrom, double amount, double voltage) { switch(directionFrom) { case UP: return this.energyNetNodes[0].injectEnergyToGrid(amount); case DOWN: return this.energyNetNodes[1].injectEnergyToGrid(amount); case SOUTH: return this.energyNetNodes[2].injectEnergyToGrid(amount); case NORTH: return this.energyNetNodes[3].injectEnergyToGrid(amount); case EAST: return this.energyNetNodes[4].injectEnergyToGrid(amount); case WEST: return this.energyNetNodes[5].injectEnergyToGrid(amount); default: return amount; } } @Override public ItemStack getWrenchDrop(EntityPlayer entityPlayer) { return null; } @Override public boolean wrenchCanSetFacing(EntityPlayer entityPlayer, int side) { return !this.wrenchCanRemove(entityPlayer); } public TileEntity getSink(TileEntity te, Set teset) { teset.add(te); while(te!=null && !(te instanceof IEnergySink)) { TileEntity te1 = EnergyNet.instance.getNeighbor(te, ForgeDirection.NORTH); if(te1==null || teset.contains(te1)) { te1 = EnergyNet.instance.getNeighbor(te, ForgeDirection.SOUTH); } else { TileEntity te2 = this.getSink(te1, teset); if(te2!=null) { return te2; } } if(te1==null || teset.contains(te1)) { te1 = EnergyNet.instance.getNeighbor(te, ForgeDirection.UP); } else { TileEntity te2 = this.getSink(te1, teset); if(te2!=null) { return te2; } } if(te1==null || teset.contains(te1)) { te1 = EnergyNet.instance.getNeighbor(te, ForgeDirection.DOWN); } else { TileEntity te2 = this.getSink(te1, teset); if(te2!=null) { return te2; } } if(te1==null || teset.contains(te1)) { te1 = EnergyNet.instance.getNeighbor(te, ForgeDirection.WEST); } else { TileEntity te2 = this.getSink(te1, teset); if(te2!=null) { return te2; } } if(te1==null || teset.contains(te1)) { te1 = EnergyNet.instance.getNeighbor(te, ForgeDirection.EAST); } else { TileEntity te2 = this.getSink(te1, teset); if(te2!=null) { return te2; } } if(te1!=null) { teset.add(te1); } te=te1; } if(te instanceof IEnergySink) { return te; } else { return null; } } public void checkIfNoCablesLeft() { boolean noCables=true; for(SubAnchorEnergyNetNode sen:energyNetNodes) { if(!sen.getCableList().isEmpty()) { noCables=false; } } if(noCables) { worldObj.setBlockToAir(xCoord, yCoord, zCoord); } } @Override public boolean isCableRemoved(int chainUniqueID) { if(!checkCables) { return false; } for(SubAnchorEnergyNetNode sen:energyNetNodes) { if(!sen.isCableRemoved(chainUniqueID)) { return false; } } return true; } @Override public IEnergyNetNode getEnergyNetNode(short facing) { return energyNetNodes[facing]; } @Override public short getSide(EntityPlayer player) { return IHLUtils.getFacingFromPlayerView(player, true); } @Override public void removeAttachedChains() { for(short i=0;i<6;i++) { energyNetNodes[i].removeAttachedChains(); } } }