// Path: src/main/java/cn/academy/energy/api/block/IWirelessGenerator.java
// public interface IWirelessGenerator extends IWirelessUser {
// 
//     /**
//      * @param req How much energy is required
//      * @return How much energy this generator can provide. Must be guaranteed 0<=ret<=req
//      */
//     public double getProvidedEnergy(double req);
// 
//     /**
//      * @return Max energy transmitted each tick
//      */
//     public double getBandwidth();
// 
// }
// 
// Path: src/main/java/cn/academy/energy/api/block/IWirelessNode.java
// public interface IWirelessNode extends IWirelessTile {
// 
//     double getMaxEnergy();
// 
//     double getEnergy();
// 
//     void setEnergy(double value);
// 
//     /**
//      * @return How many energy that this node can transfer each tick.
//      */
//     double getBandwidth();
// 
//     int getCapacity();
// 
//     /**
//      * @return How far this node's signal can reach.
//      */
//     double getRange();
// 
//     /**
//      * @return the user custom name of the node
//      */
//     String getNodeName();
// 
// }
// 
// Path: src/main/java/cn/academy/energy/api/block/IWirelessReceiver.java
// public interface IWirelessReceiver extends IWirelessUser {
// 
//     double getRequiredEnergy();
// 
//     /**
//      * Inject some amount of energy into the machine. ALWAYS positive
//      * @return energy not injected
//      */
//     double injectEnergy(double amt);
// 
//     /**
//      * Pull some energy out of the machine. ALWAYS positive
//      * @param amt The amount
//      * @return energy really pulled out.
//      */
//     double pullEnergy(double amt);
// 
//     /**
//      * @return How much energy this receiver can retrieve each tick.
//      */
//     double getBandwidth();
// 
// }
// 
// Path: src/main/java/cn/academy/energy/internal/VBlocks.java
// static class VNGenerator extends VBlock<IWirelessGenerator> {
//     public VNGenerator(IWirelessGenerator te) {
//         super((TileEntity) te, true);
//     }
// 
//     public VNGenerator(NBTTagCompound tag) {
//         super(tag, true);
//     }
// 
//     @Override
//     protected boolean isAcceptable(TileEntity tile) {
//         return tile instanceof IWirelessGenerator;
//     }
// }
// 
// Path: src/main/java/cn/academy/energy/internal/VBlocks.java
// static class VNNode extends VBlock<IWirelessNode> {
//     public VNNode(IWirelessNode te) {
//         super((TileEntity) te, true);
//     }
// 
//     public VNNode(NBTTagCompound tag) {
//         super(tag, true);
//     }
// 
//     @Override
//     protected boolean isAcceptable(TileEntity tile) {
//         return tile instanceof IWirelessNode;
//     }
// }
// 
// Path: src/main/java/cn/academy/energy/internal/VBlocks.java
// static class VNReceiver extends VBlock<IWirelessReceiver> {
//     public VNReceiver(IWirelessReceiver te) {
//         super((TileEntity) te, true);
//     }
// 
//     public VNReceiver(NBTTagCompound tag) {
//         super(tag, true);
//     }
// 
//     @Override
//     protected boolean isAcceptable(TileEntity tile) {
//         return tile instanceof IWirelessReceiver;
//     }
// }


import cn.academy.energy.api.block.IWirelessGenerator;
import cn.academy.energy.api.block.IWirelessNode;
import cn.academy.energy.api.block.IWirelessReceiver;
import cn.academy.energy.internal.VBlocks.VNGenerator;
import cn.academy.energy.internal.VBlocks.VNNode;
import cn.academy.energy.internal.VBlocks.VNReceiver;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
                    IWirelessGenerator igen = gen.get(world);
                    if (igen == null) {
                        iter.remove();
                    } else {
                        double cur = iNode.getEnergy();
                        double required = Math.min(transferLeft,
                                Math.min(igen.getBandwidth(), iNode.getMaxEnergy() - cur));
                        double amt = igen.getProvidedEnergy(required);

                        if (amt > required) {
                            //AcademyCraft.log.warn("Energy input overflow for generator " + igen);
                            amt = required;
                        }

                        cur += amt;
                        iNode.setEnergy(cur);
                        transferLeft -= amt;
                    }
                }
            }
        }

        transferLeft = iNode.getBandwidth();
        {
            Collections.shuffle(receivers);

            Iterator<VNReceiver> iter = receivers.iterator();
            while (transferLeft != 0 && iter.hasNext()) {
                VNReceiver rec = iter.next();
                if (rec.isLoaded(world)) {
// Path: src/main/java/cn/academy/energy/api/block/IWirelessGenerator.java
// public interface IWirelessGenerator extends IWirelessUser {
// 
//     /**
//      * @param req How much energy is required
//      * @return How much energy this generator can provide. Must be guaranteed 0<=ret<=req
//      */
//     public double getProvidedEnergy(double req);
// 
//     /**
//      * @return Max energy transmitted each tick
//      */
//     public double getBandwidth();
// 
// }
// 
// Path: src/main/java/cn/academy/energy/api/block/IWirelessNode.java
// public interface IWirelessNode extends IWirelessTile {
// 
//     double getMaxEnergy();
// 
//     double getEnergy();
// 
//     void setEnergy(double value);
// 
//     /**
//      * @return How many energy that this node can transfer each tick.
//      */
//     double getBandwidth();
// 
//     int getCapacity();
// 
//     /**
//      * @return How far this node's signal can reach.
//      */
//     double getRange();
// 
//     /**
//      * @return the user custom name of the node
//      */
//     String getNodeName();
// 
// }
// 
// Path: src/main/java/cn/academy/energy/api/block/IWirelessReceiver.java
// public interface IWirelessReceiver extends IWirelessUser {
// 
//     double getRequiredEnergy();
// 
//     /**
//      * Inject some amount of energy into the machine. ALWAYS positive
//      * @return energy not injected
//      */
//     double injectEnergy(double amt);
// 
//     /**
//      * Pull some energy out of the machine. ALWAYS positive
//      * @param amt The amount
//      * @return energy really pulled out.
//      */
//     double pullEnergy(double amt);
// 
//     /**
//      * @return How much energy this receiver can retrieve each tick.
//      */
//     double getBandwidth();
// 
// }
// 
// Path: src/main/java/cn/academy/energy/internal/VBlocks.java
// static class VNGenerator extends VBlock<IWirelessGenerator> {
//     public VNGenerator(IWirelessGenerator te) {
//         super((TileEntity) te, true);
//     }
// 
//     public VNGenerator(NBTTagCompound tag) {
//         super(tag, true);
//     }
// 
//     @Override
//     protected boolean isAcceptable(TileEntity tile) {
//         return tile instanceof IWirelessGenerator;
//     }
// }
// 
// Path: src/main/java/cn/academy/energy/internal/VBlocks.java
// static class VNNode extends VBlock<IWirelessNode> {
//     public VNNode(IWirelessNode te) {
//         super((TileEntity) te, true);
//     }
// 
//     public VNNode(NBTTagCompound tag) {
//         super(tag, true);
//     }
// 
//     @Override
//     protected boolean isAcceptable(TileEntity tile) {
//         return tile instanceof IWirelessNode;
//     }
// }
// 
// Path: src/main/java/cn/academy/energy/internal/VBlocks.java
// static class VNReceiver extends VBlock<IWirelessReceiver> {
//     public VNReceiver(IWirelessReceiver te) {
//         super((TileEntity) te, true);
//     }
// 
//     public VNReceiver(NBTTagCompound tag) {
//         super(tag, true);
//     }
// 
//     @Override
//     protected boolean isAcceptable(TileEntity tile) {
//         return tile instanceof IWirelessReceiver;
//     }
// }


// Path: src/main/java/cn/academy/energy/internal/NodeConn.java
import cn.academy.energy.api.block.IWirelessGenerator;
import cn.academy.energy.api.block.IWirelessNode;
import cn.academy.energy.api.block.IWirelessReceiver;
import cn.academy.energy.internal.VBlocks.VNGenerator;
import cn.academy.energy.internal.VBlocks.VNNode;
import cn.academy.energy.internal.VBlocks.VNReceiver;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

                    IWirelessGenerator igen = gen.get(world);
                    if (igen == null) {
                        iter.remove();
                    } else {
                        double cur = iNode.getEnergy();
                        double required = Math.min(transferLeft,
                                Math.min(igen.getBandwidth(), iNode.getMaxEnergy() - cur));
                        double amt = igen.getProvidedEnergy(required);

                        if (amt > required) {
                            //AcademyCraft.log.warn("Energy input overflow for generator " + igen);
                            amt = required;
                        }

                        cur += amt;
                        iNode.setEnergy(cur);
                        transferLeft -= amt;
                    }
                }
            }
        }

        transferLeft = iNode.getBandwidth();
        {
            Collections.shuffle(receivers);

            Iterator<VNReceiver> iter = receivers.iterator();
            while (transferLeft != 0 && iter.hasNext()) {
                VNReceiver rec = iter.next();
                if (rec.isLoaded(world)) {
                    IWirelessReceiver irec = rec.get(world);