Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sk.henn.techcraft.mods.energia.oprava;
- import com.google.common.math.DoubleMath;
- import ic2.api.Direction;
- import ic2.api.energy.EnergyNet;
- import ic2.api.energy.NodeStats;
- import ic2.api.energy.tile.IEnergyAcceptor;
- import ic2.api.energy.tile.IEnergyConductor;
- import ic2.api.energy.tile.IEnergyEmitter;
- import ic2.api.energy.tile.IEnergySink;
- import ic2.api.energy.tile.IEnergySource;
- import ic2.api.energy.tile.IEnergyTile;
- import ic2.api.energy.tile.IMetaDelegate;
- import ic2.core.ExplosionIC2;
- import ic2.core.IC2;
- import ic2.core.IC2DamageSource;
- import ic2.core.block.machine.tileentity.TileEntityMatter;
- import ic2.core.block.wiring.TileEntityTransformer;
- import java.math.RoundingMode;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.Vector;
- import java.util.Map.Entry;
- import net.minecraft.entity.Entity;
- import net.minecraft.entity.EntityLivingBase;
- import net.minecraft.entity.player.EntityPlayer;
- import net.minecraft.init.Blocks;
- import net.minecraft.tileentity.TileEntity;
- import net.minecraft.util.AxisAlignedBB;
- import net.minecraft.util.ChunkCoordinates;
- import net.minecraft.world.World;
- import net.minecraftforge.common.util.ForgeDirection;
- import sk.henn.techcraft.mods.energia.oprava.doplnky.IMultiEnergySource;
- public class EnergyNetLocal
- {
- public static double minConductionLoss = 1.0E-4D;
- private static Direction[] directions = Direction.values();
- public static EnergyTransferList list;
- private World world;
- private EnergyNetLocal.EnergyPathMap energySourceToEnergyPathMap = new EnergyNetLocal.EnergyPathMap();
- private Map<EntityLivingBase, Integer> entityLivingToShockEnergyMap = new HashMap();
- private Map<ChunkCoordinates, IEnergyTile> registeredTiles = new HashMap();
- private Map<ChunkCoordinates, IEnergySource> sources = new HashMap();
- private EnergyNetLocal.WaitingList waitingList = new EnergyNetLocal.WaitingList();
- private int x;
- EnergyNetLocal(World world)
- {
- this.world = world;
- }
- public void addTile(TileEntity par1)
- {
- if (par1 instanceof IMetaDelegate)
- {
- List tiles = ((IMetaDelegate)par1).getSubTiles();
- Iterator i$ = tiles.iterator();
- while (i$.hasNext())
- {
- TileEntity tile = (TileEntity)i$.next();
- this.addTileEntity(coords(tile), par1);
- }
- if (par1 instanceof IEnergySource)
- {
- this.sources.put(coords((TileEntity)tiles.get(0)), (IEnergySource)par1);
- }
- }
- else
- {
- this.addTileEntity(coords(par1), par1);
- }
- }
- public void addTileEntity(ChunkCoordinates coords, TileEntity tile)
- {
- if (tile instanceof IEnergyTile && !this.registeredTiles.containsKey(coords))
- {
- this.registeredTiles.put(coords, (IEnergyTile)tile);
- this.update(coords.posX, coords.posY, coords.posZ);
- if (tile instanceof IEnergyAcceptor)
- {
- this.waitingList.onTileEntityAdded(this.getValidReceivers(tile, true), tile);
- }
- if (tile instanceof IEnergySource && !(tile instanceof IMetaDelegate))
- {
- this.sources.put(coords, (IEnergySource)tile);
- }
- }
- }
- public void removeTile(TileEntity par1)
- {
- if (par1 instanceof IMetaDelegate)
- {
- List tiles = ((IMetaDelegate)par1).getSubTiles();
- Iterator i$ = tiles.iterator();
- while (i$.hasNext())
- {
- TileEntity tile = (TileEntity)i$.next();
- this.removeTileEntity(coords(tile), par1);
- }
- }
- else
- {
- this.removeTileEntity(coords(par1), par1);
- }
- }
- public void removeTileEntity(ChunkCoordinates coords, TileEntity tile)
- {
- if (tile instanceof IEnergyTile && this.registeredTiles.containsKey(coords))
- {
- this.registeredTiles.remove(coords);
- this.update(coords.posX, coords.posY, coords.posZ);
- if (tile instanceof IEnergyAcceptor)
- {
- this.energySourceToEnergyPathMap.removeAll(this.energySourceToEnergyPathMap.getSources((IEnergyAcceptor)tile));
- this.waitingList.onTileEntityRemoved(tile);
- }
- if (tile instanceof IEnergySource)
- {
- this.sources.remove(coords);
- this.energySourceToEnergyPathMap.remove(tile);
- }
- }
- else
- {
- boolean alreadyRemoved = !this.registeredTiles.containsKey(coords);
- if (!alreadyRemoved)
- {
- // Uncomplication.log.warn("removing " + tile + " from the EnergyNet failed, already removed: " + alreadyRemoved);
- }
- }
- }
- public int emitEnergyFrom(ChunkCoordinates coords, IEnergySource energySource, int amount)
- {
- if (!this.registeredTiles.containsKey(coords))
- {
- // Uncomplication.log.warn("EnergyNet.emitEnergyFrom: " + energySource + " is not added to the enet");
- return amount;
- }
- else
- {
- if (!this.energySourceToEnergyPathMap.containsKey(energySource))
- {
- TileEntity var10003 = (TileEntity)energySource;
- EnergyTransferList var10005 = list;
- this.energySourceToEnergyPathMap.put(energySource, this.discover(var10003, false, EnergyTransferList.getMaxEnergy(energySource, (int)energySource.getOfferedEnergy())));
- }
- Vector activeEnergyPaths = new Vector();
- double totalInvLoss = 0.0D;
- double source = (double)energySource.getSourceTier();
- Iterator suppliedEnergyPaths = this.energySourceToEnergyPathMap.get(energySource).iterator();
- EnergyNetLocal.EnergyPath i$;
- while (suppliedEnergyPaths.hasNext())
- {
- i$ = (EnergyNetLocal.EnergyPath)suppliedEnergyPaths.next();
- assert i$.target instanceof IEnergySink;
- IEnergySink entry = (IEnergySink)i$.target;
- if (entry.getDemandedEnergy() > 0.0D && i$.loss < (double)amount && !false)
- {
- totalInvLoss += 1.0D / i$.loss;
- activeEnergyPaths.add(i$);
- }
- }
- Collections.shuffle(activeEnergyPaths);
- for (int var28 = activeEnergyPaths.size() - amount; var28 > 0; --var28)
- {
- i$ = (EnergyNetLocal.EnergyPath)activeEnergyPaths.remove(activeEnergyPaths.size() - 1);
- totalInvLoss -= 1.0D / i$.loss;
- }
- int maxShockEnergy;
- HashMap var29;
- int var30;
- for (var29 = new HashMap(); !activeEnergyPaths.isEmpty() && amount > 0; amount -= var30)
- {
- var30 = 0;
- double var32 = 0.0D;
- Vector energyInjected2 = activeEnergyPaths;
- activeEnergyPaths = new Vector();
- activeEnergyPaths.iterator();
- Iterator energyPath4 = energyInjected2.iterator();
- while (energyPath4.hasNext())
- {
- EnergyNetLocal.EnergyPath i$1 = (EnergyNetLocal.EnergyPath)energyPath4.next();
- IEnergySink energyConductor3 = (IEnergySink)i$1.target;
- int energyConductor2 = (int)Math.floor((double)Math.round((double)amount / totalInvLoss / i$1.loss * 100000.0D) / 100000.0D);
- maxShockEnergy = (int)Math.floor(i$1.loss);
- if (energyConductor2 > maxShockEnergy)
- {
- double i$2 = (double)(energyConductor2 - maxShockEnergy);
- double te = Math.min(i$2, energyConductor3.getDemandedEnergy());
- if (te <= 0.0D && EnergyTransferList.hasOverrideInput(energyConductor3))
- {
- te = (double)EnergyTransferList.getOverrideInput(energyConductor3);
- }
- if (te > 0.0D)
- {
- int tier = energyConductor3.getSinkTier();
- int accepting = (int)EnergyNet.instance.getPowerFromTier(tier);
- if (tier >= Integer.MAX_VALUE || accepting <= 0)
- {
- accepting = Integer.MAX_VALUE;
- }
- if (i$2 > (double)accepting)
- {
- if (!false)
- {
- this.explodeTiles(energyConductor3);
- }
- }
- else
- {
- double energyReturned = energyConductor3.injectEnergy(i$1.targetDirection.toForgeDirection(), te, source);
- if (energyReturned == 0.0D)
- {
- activeEnergyPaths.add(i$1);
- var32 += 1.0D / i$1.loss;
- }
- else if (energyReturned >= (double)(energyConductor2 - maxShockEnergy))
- {
- energyReturned = (double)(energyConductor2 - maxShockEnergy);
- // Uncomplication.log.warn("API ERROR: " + energyConductor3 + " didn\'t implement demandsEnergy() properly, no energy from injectEnergy accepted although demandsEnergy() returned true.");
- }
- var30 = (int)((double)var30 + te - energyReturned + (double)maxShockEnergy);
- int energyInjected = (int)(te - energyReturned);
- if (!var29.containsKey(i$1))
- {
- var29.put(i$1, Integer.valueOf(energyInjected));
- }
- else
- {
- var29.put(i$1, Integer.valueOf(energyInjected + ((Integer)var29.get(i$1)).intValue()));
- }
- }
- }
- }
- else
- {
- activeEnergyPaths.add(i$1);
- var32 += 1.0D / i$1.loss;
- }
- }
- if (var30 == 0 && !activeEnergyPaths.isEmpty())
- {
- EnergyNetLocal.EnergyPath var35 = (EnergyNetLocal.EnergyPath)activeEnergyPaths.remove(activeEnergyPaths.size() - 1);
- var32 -= 1.0D / var35.loss;
- }
- totalInvLoss = var32;
- }
- Iterator var31 = var29.entrySet().iterator();
- while (var31.hasNext())
- {
- Entry var33 = (Entry)var31.next();
- EnergyNetLocal.EnergyPath energyPath3 = (EnergyNetLocal.EnergyPath)var33.getKey();
- int var34 = ((Integer)var33.getValue()).intValue();
- energyPath3.totalEnergyConducted += (long)var34;
- energyPath3.maxSendedEnergy = Math.max(energyPath3.maxSendedEnergy, (long)var34);
- if (var34 > energyPath3.minInsulationEnergyAbsorption)
- {
- List var36 = this.world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox((double)(energyPath3.minX - 1), (double)(energyPath3.minY - 1), (double)(energyPath3.minZ - 1), (double)(energyPath3.maxX + 2), (double)(energyPath3.maxY + 2), (double)(energyPath3.maxZ + 2)));
- Iterator var38 = var36.iterator();
- while (var38.hasNext())
- {
- EntityLivingBase var40 = (EntityLivingBase)var38.next();
- maxShockEnergy = 0;
- Iterator var42 = energyPath3.conductors.iterator();
- while (true)
- {
- if (var42.hasNext())
- {
- IEnergyConductor energyConductor = (IEnergyConductor)var42.next();
- TileEntity var43 = (TileEntity)energyConductor;
- if (!var40.boundingBox.intersectsWith(AxisAlignedBB.getBoundingBox((double)(var43.xCoord - 1), (double)(var43.yCoord - 1), (double)(var43.zCoord - 1), (double)(var43.xCoord + 2), (double)(var43.yCoord + 2), (double)(var43.zCoord + 2))))
- {
- continue;
- }
- int shockEnergy = (int)((double)var34 - energyConductor.getInsulationEnergyAbsorption());
- if (shockEnergy > maxShockEnergy)
- {
- maxShockEnergy = shockEnergy;
- }
- if (energyConductor.getInsulationEnergyAbsorption() != (double)energyPath3.minInsulationEnergyAbsorption)
- {
- continue;
- }
- }
- if (this.entityLivingToShockEnergyMap.containsKey(var40))
- {
- this.entityLivingToShockEnergyMap.put(var40, Integer.valueOf(((Integer)this.entityLivingToShockEnergyMap.get(var40)).intValue() + maxShockEnergy));
- }
- else
- {
- this.entityLivingToShockEnergyMap.put(var40, Integer.valueOf(maxShockEnergy));
- }
- break;
- }
- }
- if (var34 >= energyPath3.minInsulationBreakdownEnergy)
- {
- var38 = energyPath3.conductors.iterator();
- while (var38.hasNext())
- {
- IEnergyConductor var41 = (IEnergyConductor)var38.next();
- if ((double)var34 >= var41.getInsulationBreakdownEnergy())
- {
- var41.removeInsulation();
- if (var41.getInsulationEnergyAbsorption() < (double)energyPath3.minInsulationEnergyAbsorption)
- {
- energyPath3.minInsulationEnergyAbsorption = (int)var41.getInsulationEnergyAbsorption();
- }
- }
- }
- }
- }
- if (var34 >= energyPath3.minConductorBreakdownEnergy)
- {
- Iterator var37 = energyPath3.conductors.iterator();
- while (var37.hasNext())
- {
- IEnergyConductor var39 = (IEnergyConductor)var37.next();
- if ((double)var34 >= var39.getConductorBreakdownEnergy() && !false)
- {
- var39.removeConductor();
- }
- }
- }
- }
- return amount;
- }
- }
- public double getTotalEnergyEmitted(TileEntity tileEntity)
- {
- double ret = 0.0D;
- Iterator i$;
- EnergyNetLocal.EnergyPath energyPath2;
- if (tileEntity instanceof IEnergyConductor)
- {
- i$ = this.energySourceToEnergyPathMap.getPaths((IEnergyAcceptor)tileEntity).iterator();
- while (i$.hasNext())
- {
- energyPath2 = (EnergyNetLocal.EnergyPath)i$.next();
- if (tileEntity instanceof IEnergyConductor && energyPath2.conductors.contains(tileEntity))
- {
- ret += (double)energyPath2.totalEnergyConducted;
- }
- }
- }
- if (tileEntity instanceof IEnergySource && this.energySourceToEnergyPathMap.containsKey(tileEntity))
- {
- for (i$ = this.energySourceToEnergyPathMap.get(tileEntity).iterator(); i$.hasNext(); ret += (double)energyPath2.totalEnergyConducted)
- {
- energyPath2 = (EnergyNetLocal.EnergyPath)i$.next();
- }
- }
- return ret;
- }
- public double getTotalEnergySunken(TileEntity tileEntity)
- {
- double ret = 0.0D;
- if (tileEntity instanceof IEnergyConductor || tileEntity instanceof IEnergySink)
- {
- Iterator i$ = this.energySourceToEnergyPathMap.getPaths((IEnergyAcceptor)tileEntity).iterator();
- while (i$.hasNext())
- {
- EnergyNetLocal.EnergyPath energyPath = (EnergyNetLocal.EnergyPath)i$.next();
- if (tileEntity instanceof IEnergySink && energyPath.target == tileEntity || tileEntity instanceof IEnergyConductor && energyPath.conductors.contains(tileEntity))
- {
- ret += (double)energyPath.totalEnergyConducted;
- }
- }
- }
- return ret;
- }
- private List<EnergyNetLocal.EnergyPath> discover(TileEntity emitter, boolean reverse, int lossLimit)
- {
- HashMap reachedTileEntities = new HashMap();
- LinkedList tileEntitiesToCheck = new LinkedList();
- tileEntitiesToCheck.add(emitter);
- while (!tileEntitiesToCheck.isEmpty())
- {
- TileEntity energyPaths = (TileEntity)tileEntitiesToCheck.remove();
- if (!energyPaths.isInvalid())
- {
- double i$ = 0.0D;
- if (this.registeredTiles.get(coords(energyPaths)) != null && this.registeredTiles.get(coords(energyPaths)) != emitter && reachedTileEntities.containsKey(energyPaths))
- {
- i$ = ((EnergyNetLocal.EnergyBlockLink)reachedTileEntities.get(energyPaths)).loss;
- }
- List tileEntity = this.getValidReceivers(energyPaths, reverse);
- Iterator energyBlockLink = tileEntity.iterator();
- while (energyBlockLink.hasNext())
- {
- EnergyNetLocal.EnergyTarget energyPath = (EnergyNetLocal.EnergyTarget)energyBlockLink.next();
- if (energyPath.tileEntity != emitter)
- {
- double energyConductor = 0.0D;
- if (energyPath.tileEntity instanceof IEnergyConductor)
- {
- energyConductor = ((IEnergyConductor)energyPath.tileEntity).getConductionLoss();
- if (energyConductor < 1.0E-4D)
- {
- energyConductor = 1.0E-4D;
- }
- if (i$ + energyConductor >= (double)lossLimit)
- {
- continue;
- }
- }
- if (!reachedTileEntities.containsKey(energyPath.tileEntity) || ((EnergyNetLocal.EnergyBlockLink)reachedTileEntities.get(energyPath.tileEntity)).loss > i$ + energyConductor)
- {
- reachedTileEntities.put(energyPath.tileEntity, new EnergyNetLocal.EnergyBlockLink(energyPath.direction, i$ + energyConductor));
- if (energyPath.tileEntity instanceof IEnergyConductor)
- {
- tileEntitiesToCheck.remove(energyPath.tileEntity);
- tileEntitiesToCheck.add(energyPath.tileEntity);
- }
- }
- }
- }
- }
- }
- LinkedList energyPaths1 = new LinkedList();
- Iterator i$1 = reachedTileEntities.entrySet().iterator();
- while (i$1.hasNext())
- {
- Entry entry = (Entry)i$1.next();
- TileEntity tileEntity1 = (TileEntity)entry.getKey();
- if (!reverse && tileEntity1 instanceof IEnergySink || reverse && tileEntity1 instanceof IEnergySource)
- {
- EnergyNetLocal.EnergyBlockLink energyBlockLink1 = (EnergyNetLocal.EnergyBlockLink)entry.getValue();
- EnergyNetLocal.EnergyPath energyPath1 = new EnergyNetLocal.EnergyPath();
- if (energyBlockLink1.loss > 0.1D)
- {
- energyPath1.loss = energyBlockLink1.loss;
- }
- else
- {
- energyPath1.loss = 0.1D;
- }
- energyPath1.target = tileEntity1;
- energyPath1.targetDirection = energyBlockLink1.direction;
- if (!reverse && emitter instanceof IEnergySource)
- {
- while (true)
- {
- tileEntity1 = EnergyNet.instance.getNeighbor(tileEntity1, energyBlockLink1.direction.toForgeDirection());
- if (tileEntity1 == emitter || !(tileEntity1 instanceof IEnergyConductor))
- {
- break;
- }
- IEnergyConductor energyConductor1 = (IEnergyConductor)tileEntity1;
- if (tileEntity1.xCoord < energyPath1.minX)
- {
- energyPath1.minX = tileEntity1.xCoord;
- }
- if (tileEntity1.yCoord < energyPath1.minY)
- {
- energyPath1.minY = tileEntity1.yCoord;
- }
- if (tileEntity1.zCoord < energyPath1.minZ)
- {
- energyPath1.minZ = tileEntity1.zCoord;
- }
- if (tileEntity1.xCoord > energyPath1.maxX)
- {
- energyPath1.maxX = tileEntity1.xCoord;
- }
- if (tileEntity1.yCoord > energyPath1.maxY)
- {
- energyPath1.maxY = tileEntity1.yCoord;
- }
- if (tileEntity1.zCoord > energyPath1.maxZ)
- {
- energyPath1.maxZ = tileEntity1.zCoord;
- }
- energyPath1.conductors.add(energyConductor1);
- if (energyConductor1.getInsulationEnergyAbsorption() < (double)energyPath1.minInsulationEnergyAbsorption)
- {
- energyPath1.minInsulationEnergyAbsorption = (int)energyConductor1.getInsulationEnergyAbsorption();
- }
- if (energyConductor1.getInsulationBreakdownEnergy() < (double)energyPath1.minInsulationBreakdownEnergy)
- {
- energyPath1.minInsulationBreakdownEnergy = (int)energyConductor1.getInsulationBreakdownEnergy();
- }
- if (energyConductor1.getConductorBreakdownEnergy() < (double)energyPath1.minConductorBreakdownEnergy)
- {
- energyPath1.minConductorBreakdownEnergy = (int)energyConductor1.getConductorBreakdownEnergy();
- }
- energyBlockLink1 = (EnergyNetLocal.EnergyBlockLink)reachedTileEntities.get(tileEntity1);
- if (energyBlockLink1 == null)
- {
- IC2.platform.displayError("An energy network pathfinding entry is corrupted.\nThis could happen due to incorrect Minecraft behavior or a bug.\n\n(Technical information: energyBlockLink, tile entities below)\nE: " + emitter + " (" + emitter.xCoord + "," + emitter.yCoord + "," + emitter.zCoord + ")\n" + "C: " + tileEntity1 + " (" + tileEntity1.xCoord + "," + tileEntity1.yCoord + "," + tileEntity1.zCoord + ")\n" + "R: " + energyPath1.target + " (" + energyPath1.target.xCoord + "," + energyPath1.target.yCoord + "," + energyPath1.target.zCoord + ")", new Object[0]);
- }
- }
- }
- energyPaths1.add(energyPath1);
- }
- }
- return energyPaths1;
- }
- private boolean conductorToWeak(Set<IEnergyConductor> par1, int energyToSend)
- {
- boolean flag = false;
- Iterator i$ = par1.iterator();
- while (i$.hasNext())
- {
- IEnergyConductor cond = (IEnergyConductor)i$.next();
- if (cond.getConductorBreakdownEnergy() <= (double)energyToSend)
- {
- flag = true;
- break;
- }
- }
- return flag;
- }
- public List<EnergyNetLocal.EnergyPath> discoverTargets(TileEntity emitter, boolean reverse, int lossLimit)
- {
- List paths = this.discover(emitter, reverse, lossLimit);
- LinkedList targets = new LinkedList();
- Iterator i$ = paths.iterator();
- while (i$.hasNext())
- {
- EnergyNetLocal.EnergyPath path = (EnergyNetLocal.EnergyPath)i$.next();
- targets.add(path.target);
- }
- return targets;
- }
- private List<EnergyNetLocal.EnergyTarget> getValidReceivers(TileEntity emitter, boolean reverse)
- {
- LinkedList validReceivers = new LinkedList();
- Direction[] arr$ = directions;
- int len$ = arr$.length;
- for (int i$ = 0; i$ < len$; ++i$)
- {
- Direction direction = arr$[i$];
- if (emitter instanceof IMetaDelegate)
- {
- IMetaDelegate target = (IMetaDelegate)emitter;
- List inverseDirection = target.getSubTiles();
- Iterator sender = inverseDirection.iterator();
- while (sender.hasNext())
- {
- TileEntity receiver = (TileEntity)sender.next();
- TileEntity target1 = EnergyNet.instance.getNeighbor(receiver, direction.toForgeDirection());
- if (target1 != emitter && target1 instanceof IEnergyTile && this.registeredTiles.containsKey(coords(target1)))
- {
- Direction inverseDirection1 = direction.getInverse();
- IEnergyEmitter sender1;
- IEnergyAcceptor receiver1;
- if (reverse)
- {
- if (emitter instanceof IEnergyAcceptor && target1 instanceof IEnergyEmitter)
- {
- sender1 = (IEnergyEmitter)target1;
- receiver1 = (IEnergyAcceptor)emitter;
- if (sender1.emitsEnergyTo(emitter, inverseDirection1.toForgeDirection()) && receiver1.acceptsEnergyFrom(target1, direction.toForgeDirection()))
- {
- validReceivers.add(new EnergyNetLocal.EnergyTarget(target1, inverseDirection1));
- }
- }
- }
- else if (emitter instanceof IEnergyEmitter && target1 instanceof IEnergyAcceptor)
- {
- sender1 = (IEnergyEmitter)emitter;
- receiver1 = (IEnergyAcceptor)target1;
- if (sender1.emitsEnergyTo(target1, direction.toForgeDirection()) && receiver1.acceptsEnergyFrom(emitter, inverseDirection1.toForgeDirection()))
- {
- validReceivers.add(new EnergyNetLocal.EnergyTarget(target1, inverseDirection1));
- }
- }
- }
- }
- }
- else
- {
- TileEntity var16 = EnergyNet.instance.getNeighbor(emitter, direction.toForgeDirection());
- if (var16 instanceof IEnergyTile && this.registeredTiles.containsKey(coords(var16)))
- {
- Direction var17 = direction.getInverse();
- IEnergyEmitter var18;
- IEnergyAcceptor var19;
- if (reverse)
- {
- if (emitter instanceof IEnergyAcceptor && var16 instanceof IEnergyEmitter)
- {
- var18 = (IEnergyEmitter)var16;
- var19 = (IEnergyAcceptor)emitter;
- if (var18.emitsEnergyTo(emitter, var17.toForgeDirection()) && var19.acceptsEnergyFrom(var16, direction.toForgeDirection()))
- {
- validReceivers.add(new EnergyNetLocal.EnergyTarget(var16, var17));
- }
- }
- }
- else if (emitter instanceof IEnergyEmitter && var16 instanceof IEnergyAcceptor)
- {
- var18 = (IEnergyEmitter)emitter;
- var19 = (IEnergyAcceptor)var16;
- if (var18.emitsEnergyTo(var16, direction.toForgeDirection()) && var19.acceptsEnergyFrom(emitter, var17.toForgeDirection()))
- {
- validReceivers.add(new EnergyNetLocal.EnergyTarget(var16, var17));
- }
- }
- }
- }
- }
- return validReceivers;
- }
- public List<IEnergySource> discoverFirstPathOrSources(TileEntity par1)
- {
- HashSet reached = new HashSet();
- ArrayList result = new ArrayList();
- ArrayList workList = new ArrayList();
- workList.add(par1);
- while (workList.size() > 0)
- {
- TileEntity tile = (TileEntity)workList.remove(0);
- if (!tile.isInvalid())
- {
- List targets = this.getValidReceivers(tile, true);
- for (int i = 0; i < targets.size(); ++i)
- {
- TileEntity target = ((EnergyNetLocal.EnergyTarget)targets.get(i)).tileEntity;
- if (target != par1 && !reached.contains(target))
- {
- reached.add(target);
- if (target instanceof IEnergySource)
- {
- result.add((IEnergySource)target);
- }
- else if (target instanceof IEnergyConductor)
- {
- workList.add(target);
- }
- }
- }
- }
- }
- return result;
- }
- public static ChunkCoordinates coords(TileEntity par1)
- {
- return par1 == null ? null : new ChunkCoordinates(par1.xCoord, par1.yCoord, par1.zCoord);
- }
- public void onTickStart()
- {
- Iterator i$ = this.entityLivingToShockEnergyMap.entrySet().iterator();
- while (i$.hasNext())
- {
- Entry entry = (Entry)i$.next();
- EntityLivingBase target = (EntityLivingBase)entry.getKey();
- int damage = (((Integer)entry.getValue()).intValue() + 63) / 64;
- if (target.isEntityAlive())
- {
- target.attackEntityFrom(IC2DamageSource.electricity, (float)damage);
- }
- }
- this.entityLivingToShockEnergyMap.clear();
- }
- public void onTickEnd()
- {
- if (this.waitingList.hasWork())
- {
- List iter = this.waitingList.getPathTiles();
- Iterator z = iter.iterator();
- while (z.hasNext())
- {
- TileEntity entry = (TileEntity)z.next();
- List source = this.discoverFirstPathOrSources(entry);
- if (source.size() > 0)
- {
- this.energySourceToEnergyPathMap.removeAll(source);
- }
- }
- this.waitingList.clear();
- }
- Iterator var9 = (new HashMap(this.sources)).entrySet().iterator();
- for (int var10 = 0; var9.hasNext(); ++var10)
- {
- Entry var11 = (Entry)var9.next();
- if (var11 != null)
- {
- IEnergySource var12 = (IEnergySource)var11.getValue();
- if (var12 != null)
- {
- EnergyNetLocal.EnergyPath packetAmount;
- if (this.energySourceToEnergyPathMap.containsKey(var12))
- {
- for (Iterator offer = this.energySourceToEnergyPathMap.get(var12).iterator(); offer.hasNext(); packetAmount.maxSendedEnergy = 0L)
- {
- packetAmount = (EnergyNetLocal.EnergyPath)offer.next();
- packetAmount.totalEnergyConducted = 0L;
- }
- }
- int var13 = DoubleMath.roundToInt(var12.getOfferedEnergy(), RoundingMode.DOWN);
- if (var13 > 0)
- {
- int var14 = this.getPacketAmount(var12);
- for (int i = 0; i < var14; ++i)
- {
- var13 = DoubleMath.roundToInt(var12.getOfferedEnergy(), RoundingMode.DOWN);
- if (var13 < 1)
- {
- break;
- }
- int removed = var13 - this.emitEnergyFrom((ChunkCoordinates)var11.getKey(), var12, var13);
- if (removed <= 0)
- {
- break;
- }
- var12.drawEnergy((double)removed);
- }
- }
- }
- }
- }
- }
- private int getPacketAmount(IEnergySource source)
- {
- return source instanceof IMultiEnergySource && ((IMultiEnergySource)source).sendMultibleEnergyPackets() ? ((IMultiEnergySource)source).getMultibleEnergyPacketAmount() : (source instanceof TileEntityTransformer ? (((TileEntityTransformer)source).redstone ? 1 : 4) : 1);
- }
- public void explodeTiles(IEnergySink sink)
- {
- this.removeTile((TileEntity)sink);
- if (sink instanceof IMetaDelegate)
- {
- IMetaDelegate meta = (IMetaDelegate)sink;
- Iterator i$ = meta.getSubTiles().iterator();
- while (i$.hasNext())
- {
- TileEntity tile = (TileEntity)i$.next();
- this.explodeMachineAt(tile.xCoord, tile.yCoord, tile.zCoord, tile);
- }
- }
- else
- {
- this.explodeMachineAt(((TileEntity)sink).xCoord, ((TileEntity)sink).yCoord, ((TileEntity)sink).zCoord, (TileEntity)sink);
- }
- }
- public TileEntity getTileEntity(int x, int y, int z)
- {
- ChunkCoordinates coords = new ChunkCoordinates(x, y, z);
- return this.registeredTiles.containsKey(coords) ? (TileEntity)this.registeredTiles.get(coords) : null;
- }
- public NodeStats getNodeStats(TileEntity tile)
- {
- double emitted = this.getTotalEnergyEmitted(tile);
- double received = this.getTotalEnergySunken(tile);
- return new NodeStats(received, emitted, (double)EnergyNet.instance.getTierFromPower(this.getVoltage(tile)));
- }
- private double getVoltage(TileEntity tileEntity)
- {
- double voltage = 0.0D;
- Iterator i$;
- EnergyNetLocal.EnergyPath energyPath;
- if (tileEntity instanceof IEnergySource && this.energySourceToEnergyPathMap.containsKey(tileEntity))
- {
- for (i$ = this.energySourceToEnergyPathMap.get(tileEntity).iterator(); i$.hasNext(); voltage = Math.max(voltage, (double)energyPath.maxSendedEnergy))
- {
- energyPath = (EnergyNetLocal.EnergyPath)i$.next();
- }
- }
- if (tileEntity instanceof IEnergyConductor || tileEntity instanceof IEnergySink)
- {
- i$ = this.energySourceToEnergyPathMap.getPaths((IEnergyAcceptor)tileEntity).iterator();
- while (i$.hasNext())
- {
- energyPath = (EnergyNetLocal.EnergyPath)i$.next();
- if (tileEntity instanceof IEnergySink && energyPath.target == tileEntity || tileEntity instanceof IEnergyConductor && energyPath.conductors.contains(tileEntity))
- {
- voltage = Math.max(voltage, (double)energyPath.maxSendedEnergy);
- }
- }
- }
- return voltage;
- }
- void explodeMachineAt(int x, int y, int z, TileEntity tile)
- {
- this.world.setBlockToAir(x, y, z);
- float power = 2.5F;
- EntityPlayer player = this.world.getClosestPlayer((double)x, (double)y, (double)z, 15.0D);
- if (player != null)
- {
- }
- ExplosionIC2 explosion = new ExplosionIC2(this.world, (Entity)null, 0.5D + (double)x, 0.5D + (double)y, 0.5D + (double)z, power, 0.75F);
- explosion.doExplosion();
- }
- void update(int x, int y, int z)
- {
- ForgeDirection[] arr$ = ForgeDirection.values();
- int len$ = arr$.length;
- for (int i$ = 0; i$ < len$; ++i$)
- {
- ForgeDirection dir = arr$[i$];
- if (this.world.blockExists(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ))
- {
- this.world.notifyBlockChange(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, Blocks.air);
- //System.out.println(x + dir.offsetX + " " +y + dir.offsetY + " " + z + dir.offsetZ);
- //this.
- //this.world.markBlockForUpdate(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);;
- // this.update(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ);
- }
- }
- }
- public void onUnload()
- {
- this.energySourceToEnergyPathMap.clear();
- this.registeredTiles.clear();
- this.sources.clear();
- this.entityLivingToShockEnergyMap.clear();
- this.waitingList.clear();
- }
- static class EnergyBlockLink
- {
- Direction direction;
- double loss;
- EnergyBlockLink(Direction direction, double loss)
- {
- this.direction = direction;
- this.loss = loss;
- }
- }
- static class EnergyPath
- {
- TileEntity target = null;
- Direction targetDirection;
- Set<IEnergyConductor> conductors = new HashSet();
- int minX = Integer.MAX_VALUE;
- int minY = Integer.MAX_VALUE;
- int minZ = Integer.MAX_VALUE;
- int maxX = Integer.MIN_VALUE;
- int maxY = Integer.MIN_VALUE;
- int maxZ = Integer.MIN_VALUE;
- double loss = 0.0D;
- int minInsulationEnergyAbsorption = Integer.MAX_VALUE;
- int minInsulationBreakdownEnergy = Integer.MAX_VALUE;
- int minConductorBreakdownEnergy = Integer.MAX_VALUE;
- long totalEnergyConducted = 0L;
- long maxSendedEnergy = 0L;
- }
- static class EnergyPathMap
- {
- Map<IEnergySource, List<EnergyNetLocal.EnergyPath>> senderPath = new HashMap();
- Map<EnergyNetLocal.EnergyPath, IEnergySource> pathToSender = new HashMap();
- public void put(IEnergySource par1, List<EnergyNetLocal.EnergyPath> par2)
- {
- this.senderPath.put(par1, par2);
- for (int i = 0; i < par2.size(); ++i)
- {
- this.pathToSender.put(par2.get(i), par1);
- }
- }
- public boolean containsKey(Object par1)
- {
- return this.senderPath.containsKey(par1);
- }
- public List<EnergyNetLocal.EnergyPath> get(Object par1)
- {
- return (List)this.senderPath.get(par1);
- }
- public void remove(Object par1)
- {
- List paths = (List)this.senderPath.remove(par1);
- if (paths != null)
- {
- for (int i = 0; i < paths.size(); ++i)
- {
- this.pathToSender.remove(paths.get(i));
- }
- }
- }
- public void removeAll(List<IEnergySource> par1)
- {
- for (int i = 0; i < par1.size(); ++i)
- {
- this.remove(par1.get(i));
- }
- }
- public List<EnergyNetLocal.EnergyPath> getPaths(IEnergyAcceptor par1)
- {
- ArrayList paths = new ArrayList();
- Iterator i$ = this.getSources(par1).iterator();
- while (i$.hasNext())
- {
- IEnergySource source = (IEnergySource)i$.next();
- if (this.containsKey(source))
- {
- paths.addAll(this.get(source));
- }
- }
- return paths;
- }
- public List<IEnergySource> getSources(IEnergyAcceptor par1)
- {
- ArrayList source = new ArrayList();
- Iterator i$ = this.pathToSender.entrySet().iterator();
- while (i$.hasNext())
- {
- Entry entry = (Entry)i$.next();
- if (!source.contains(entry.getValue()))
- {
- EnergyNetLocal.EnergyPath path = (EnergyNetLocal.EnergyPath)entry.getKey();
- if (par1 instanceof IEnergyConductor && path.conductors.contains(par1) || par1 instanceof IEnergySink && path.target == par1)
- {
- source.add(entry.getValue());
- }
- }
- }
- return source;
- }
- public void clear()
- {
- this.senderPath.clear();
- this.pathToSender.clear();
- }
- }
- static class EnergyTarget
- {
- TileEntity tileEntity;
- Direction direction;
- EnergyTarget(TileEntity tileEntity, Direction direction)
- {
- this.tileEntity = tileEntity;
- this.direction = direction;
- }
- }
- static class PathLogic
- {
- List<TileEntity> tiles = new ArrayList();
- public boolean contains(TileEntity par1)
- {
- return this.tiles.contains(par1);
- }
- public void add(TileEntity par1)
- {
- this.tiles.add(par1);
- }
- public void remove(TileEntity par1)
- {
- this.tiles.remove(par1);
- }
- public void clear()
- {
- this.tiles.clear();
- }
- public TileEntity getRepresentingTile()
- {
- return this.tiles.isEmpty() ? null : (TileEntity)this.tiles.get(0);
- }
- }
- class WaitingList
- {
- List<EnergyNetLocal.PathLogic> paths = new ArrayList();
- public void onTileEntityAdded(List<EnergyNetLocal.EnergyTarget> around, TileEntity tile)
- {
- if (!around.isEmpty() && !this.paths.isEmpty())
- {
- boolean found = false;
- ArrayList logics = new ArrayList();
- for (int newLogic = 0; newLogic < this.paths.size(); ++newLogic)
- {
- EnergyNetLocal.PathLogic i$ = (EnergyNetLocal.PathLogic)this.paths.get(newLogic);
- if (i$.contains(tile))
- {
- found = true;
- if (tile instanceof IEnergyConductor)
- {
- logics.add(i$);
- }
- }
- else
- {
- Iterator logic = around.iterator();
- while (logic.hasNext())
- {
- EnergyNetLocal.EnergyTarget i$1 = (EnergyNetLocal.EnergyTarget)logic.next();
- if (i$.contains(i$1.tileEntity))
- {
- found = true;
- i$.add(tile);
- if (i$1.tileEntity instanceof IEnergyConductor)
- {
- logics.add(i$);
- }
- break;
- }
- }
- }
- }
- if (logics.size() > 1 && tile instanceof IEnergyConductor)
- {
- EnergyNetLocal.PathLogic var10 = new EnergyNetLocal.PathLogic();
- Iterator var11 = logics.iterator();
- while (var11.hasNext())
- {
- EnergyNetLocal.PathLogic var12 = (EnergyNetLocal.PathLogic)var11.next();
- this.paths.remove(var12);
- Iterator var13 = var12.tiles.iterator();
- while (var13.hasNext())
- {
- TileEntity toMove = (TileEntity)var13.next();
- if (!var10.contains(toMove))
- {
- var10.add(toMove);
- }
- }
- var12.clear();
- }
- this.paths.add(var10);
- }
- if (!found)
- {
- this.createNewPath(tile);
- }
- }
- else
- {
- this.createNewPath(tile);
- }
- }
- public void onTileEntityRemoved(TileEntity par1)
- {
- if (!this.paths.isEmpty())
- {
- ArrayList toRecalculate = new ArrayList();
- int i;
- for (i = 0; i < this.paths.size(); ++i)
- {
- EnergyNetLocal.PathLogic tile = (EnergyNetLocal.PathLogic)this.paths.get(i);
- if (tile.contains(par1))
- {
- tile.remove(par1);
- toRecalculate.addAll(tile.tiles);
- this.paths.remove(i--);
- }
- }
- for (i = 0; i < toRecalculate.size(); ++i)
- {
- TileEntity var5 = (TileEntity)toRecalculate.get(i);
- this.onTileEntityAdded(EnergyNetLocal.this.getValidReceivers(var5, true), var5);
- }
- }
- }
- public void createNewPath(TileEntity par1)
- {
- EnergyNetLocal.PathLogic logic = new EnergyNetLocal.PathLogic();
- logic.add(par1);
- this.paths.add(logic);
- }
- public void clear()
- {
- if (!this.paths.isEmpty())
- {
- for (int i = 0; i < this.paths.size(); ++i)
- {
- ((EnergyNetLocal.PathLogic)this.paths.get(i)).clear();
- }
- this.paths.clear();
- }
- }
- public boolean hasWork()
- {
- return this.paths.size() > 0;
- }
- public List<TileEntity> getPathTiles()
- {
- ArrayList tiles = new ArrayList();
- for (int i = 0; i < this.paths.size(); ++i)
- {
- TileEntity tile = ((EnergyNetLocal.PathLogic)this.paths.get(i)).getRepresentingTile();
- if (tile != null)
- {
- tiles.add(tile);
- }
- }
- return tiles;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement