package crazypants.enderio.machine.wireless;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import com.enderio.core.common.util.BlockCoord;
public class WirelessChargedLocation {
private final TileEntity te;
private int lastChangeCount;
private final List<IWirelessCharger> chargers;
public WirelessChargedLocation(TileEntity te) {
this.te = te;
this.chargers = new ArrayList<IWirelessCharger>();
/* Set lastChangeCount to one less than the current change count so that
the charger list is updated on first use (unless ~4B changes happen in between).
Do this instead directly updating so that WirelessChargedLocation can be used
while the TileEntity is still in construction (or loading). */
this.lastChangeCount = WirelessChargerController.instance.getChangeCount() - 1;
}
private void updateChargers() {
WirelessChargerController wcc = WirelessChargerController.instance;
chargers.clear();
lastChangeCount = wcc.getChangeCount();
final BlockCoord bc = new BlockCoord(te);
wcc.getChargers(te.getWorldObj(), bc, chargers);
Collections.sort(chargers, new Comparator<IWirelessCharger>() {
@Override
public int compare(IWirelessCharger o1, IWirelessCharger o2) {
int dist1 = o1.getLocation().getDistSq(bc);
int dist2 = o2.getLocation().getDistSq(bc);
return dist1 - dist2;
}
});
}
private void checkChangeCount() {
if(lastChangeCount != WirelessChargerController.instance.getChangeCount()) {
updateChargers();
}
}
public boolean chargeItems(ItemStack[] items) {
checkChangeCount();
for(IWirelessCharger wc : chargers) {
if(wc.isActive()) {
if(wc.chargeItems(items)) {
return true;
}
}
}
return false;
}
public int takeEnergy(int max) {
checkChangeCount();
int charged = 0;
for(IWirelessCharger wc : chargers) {
if(wc.isActive()) {
charged += wc.takeEnergy(max - charged);
if(charged >= max) {
break;
}
}
}
return charged;
}
}