use of cofh.api.energy.IEnergyProvider in project BuildCraft by BuildCraft.
the class PipePowerWood method updateEntity.
@Override
public void updateEntity() {
super.updateEntity();
sources = 0;
for (EnumFacing o : EnumFacing.VALUES) {
boolean oldPowerSource = powerSources[o.ordinal()];
if (!container.isPipeConnected(o)) {
powerSources[o.ordinal()] = false;
} else {
TileEntity tile = container.getTile(o);
if (powerSources[o.ordinal()] = transport.isPowerSource(tile, o)) {
sources++;
}
}
if (oldPowerSource != powerSources[o.ordinal()]) {
container.scheduleRenderUpdate();
}
}
if (container.getWorld().isRemote) {
// of power sources for client-side rendering.
return;
}
if (sources <= 0) {
battery.useEnergy(0, 50, false);
requestedEnergy = 0;
return;
}
if (allowExtraction) {
allowExtraction = false;
int energyMaxExtract = Math.min(transport.maxPower, battery.getMaxEnergyStored() - battery.getEnergyStored());
energyMaxExtract /= sources;
for (EnumFacing o : EnumFacing.VALUES) {
if (!powerSources[o.ordinal()]) {
continue;
}
TileEntity source = container.getNeighborTile(o);
if (source instanceof IEnergyProvider) {
int energyExtracted = battery.addEnergy(0, ((IEnergyProvider) source).extractEnergy(o.getOpposite(), energyMaxExtract, true), false);
((IEnergyProvider) source).extractEnergy(o.getOpposite(), energyExtracted, false);
}
}
}
int energyToRemove = Math.min(battery.getEnergyStored(), requestedEnergy);
energyToRemove /= sources;
if (battery.getEnergyStored() > 0) {
for (EnumFacing o : EnumFacing.VALUES) {
if (!powerSources[o.ordinal()]) {
continue;
}
// PipePowerWood's resistance is 0, so this is fine.
battery.setEnergy(battery.getEnergyStored() - (int) transport.receiveEnergy(o, energyToRemove));
}
}
if (PipeTransportPower.canExplode) {
battery.setEnergy(0);
}
lastRequestedEnergy = requestedEnergy;
requestedEnergy = 0;
}
use of cofh.api.energy.IEnergyProvider in project PneumaticCraft by MineMaarten.
the class DroneInteractRFImport method doInteract.
@Override
public boolean doInteract(ChunkPosition pos, IDrone drone, IBlockInteractHandler interactHandler, boolean simulate) {
IEnergyStorage droneEnergy = CoFHCore.getEnergyStorage(drone);
if (droneEnergy.getEnergyStored() == droneEnergy.getMaxEnergyStored()) {
interactHandler.abort();
return false;
} else {
TileEntity te = drone.getWorld().getTileEntity(pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ);
if (te instanceof IEnergyProvider) {
IEnergyProvider provider = (IEnergyProvider) te;
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
if (interactHandler.getSides()[d.ordinal()]) {
int transferedEnergy = droneEnergy.receiveEnergy(provider.extractEnergy(d, interactHandler.useCount() ? interactHandler.getRemainingCount() : Integer.MAX_VALUE, true), true);
if (transferedEnergy > 0) {
if (!simulate) {
interactHandler.decreaseCount(transferedEnergy);
droneEnergy.receiveEnergy(transferedEnergy, false);
provider.extractEnergy(d, transferedEnergy, false);
}
return true;
}
}
}
}
return false;
}
}
use of cofh.api.energy.IEnergyProvider in project SimplyJetpacks by Tonius.
the class ItemJetpackFueller method onUsingTick.
@Override
public void onUsingTick(ItemStack itemStack, EntityPlayer player, int count) {
MovingObjectPosition blockPos = BlockHelper.getCurrentMovingObjectPosition(player, true);
if (blockPos == null || blockPos.sideHit < 0) {
player.setItemInUse(null, 1);
} else {
player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack));
if (player.worldObj.isRemote) {
return;
}
ItemStack chestplate = player.getCurrentArmor(2);
if (chestplate == null || !(chestplate.getItem() instanceof ItemPack)) {
return;
}
ItemPack packItem = (ItemPack) chestplate.getItem();
PackBase pack = packItem.getPack(chestplate);
if (pack == null) {
return;
}
FuelType fuelType = pack.fuelType;
ForgeDirection pullSide = ForgeDirection.values()[blockPos.sideHit];
player.worldObj.getBlock(blockPos.blockX, blockPos.blockY, blockPos.blockZ);
TileEntity tile = player.worldObj.getTileEntity(blockPos.blockX, blockPos.blockY, blockPos.blockZ);
int toPull = Math.min(pack.fuelPerTickIn, packItem.getMaxFuelStored(chestplate) - packItem.getFuelStored(chestplate));
int pulled = 0;
if (fuelType == FuelType.ENERGY && tile instanceof IEnergyProvider) {
IEnergyProvider energyTile = (IEnergyProvider) tile;
pulled = energyTile.extractEnergy(pullSide, toPull, false);
} else if (fuelType == FuelType.FLUID) {
if (tile instanceof IFluidHandler) {
IFluidHandler fluidTile = (IFluidHandler) tile;
FluidStack fluid = fluidTile.drain(pullSide, toPull, false);
if (fluid == null || !fluid.getFluid().getName().equals(pack.fuelFluid)) {
return;
}
fluid = fluidTile.drain(pullSide, toPull, true);
pulled = fluid.amount;
}
}
if (pulled > 0) {
packItem.addFuel(chestplate, pulled, false);
}
}
}
use of cofh.api.energy.IEnergyProvider in project Galacticraft by micdoodle8.
the class EnergyUtil method getAdjacentPowerConnections.
public static TileEntity[] getAdjacentPowerConnections(TileEntity tile) {
final TileEntity[] adjacentConnections = new TileEntity[6];
BlockVec3 thisVec = new BlockVec3(tile);
for (EnumFacing direction : EnumFacing.VALUES) {
if (tile instanceof IConductor && !((IConductor) tile).canConnect(direction, NetworkType.POWER)) {
continue;
}
TileEntity tileEntity = thisVec.getTileEntityOnSide(tile.getWorld(), direction);
if (tileEntity == null) {
continue;
}
if (tileEntity instanceof IConnector) {
if (((IConnector) tileEntity).canConnect(direction.getOpposite(), NetworkType.POWER)) {
adjacentConnections[direction.ordinal()] = tileEntity;
}
continue;
}
if (isMekLoaded && (tileEntity instanceof IStrictEnergyAcceptor || tileEntity instanceof ICableOutputter)) {
// Do not connect GC wires directly to Mek Universal Cables
try {
if (clazzMekCable != null && clazzMekCable.isInstance(tileEntity)) {
continue;
}
} catch (Exception e) {
e.printStackTrace();
}
if (tileEntity instanceof IStrictEnergyAcceptor && ((IStrictEnergyAcceptor) tileEntity).canReceiveEnergy(direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
} else if (tileEntity instanceof ICableOutputter && ((ICableOutputter) tileEntity).canOutputTo(direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
}
continue;
}
if (isBCReallyLoaded) {
// Do not connect GC wires directly to BC pipes of any type
try {
if (clazzPipeTile.isInstance(tileEntity)) {
continue;
}
} catch (Exception e) {
}
}
if (isRFLoaded && tileEntity instanceof IEnergyConnection) {
if (isRF2Loaded && (tileEntity instanceof IEnergyProvider || tileEntity instanceof IEnergyReceiver) || isRF1Loaded && tileEntity instanceof IEnergyHandler || clazzRailcraftEngine != null && clazzRailcraftEngine.isInstance(tileEntity)) {
// Do not connect GC wires directly to power conduits
if (clazzEnderIOCable != null && clazzEnderIOCable.isInstance(tileEntity)) {
continue;
}
if (clazzMFRRednetEnergyCable != null && clazzMFRRednetEnergyCable.isInstance(tileEntity)) {
continue;
}
if (((IEnergyConnection) tileEntity).canConnectEnergy(direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
}
}
continue;
}
if (isIC2Loaded) {
if (tileEntity instanceof IEnergyConductor) {
continue;
}
if (!tile.getWorld().isRemote) {
Object IC2tile = tileEntity;
BlockPos checkingIC2 = thisVec.toBlockPos().offset(direction);
try {
IC2tile = EnergyNet.instance.getSubTile(tile.getWorld(), checkingIC2);
} catch (Exception e) {
e.printStackTrace();
}
if (IC2tile instanceof IEnergyAcceptor && tile instanceof IEnergyEmitter) {
if (((IEnergyAcceptor) IC2tile).acceptsEnergyFrom((IEnergyEmitter) tile, direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
}
continue;
}
if (IC2tile instanceof IEnergyEmitter && tile instanceof IEnergyAcceptor) {
if (((IEnergyEmitter) IC2tile).emitsEnergyTo((IEnergyAcceptor) tile, direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
}
continue;
}
} else {
try {
Class clazz = tileEntity.getClass();
if (clazz.getName().startsWith("ic2")) {
// Special case: IC2's transformers don't seem to setup their sink and source directions in Energy clientside
if (clazz.getName().startsWith("ic2.core.block.wiring.TileEntityTransformer")) {
adjacentConnections[direction.ordinal()] = tileEntity;
continue;
}
Field energyField = null;
fieldLoop: while (energyField == null && clazz != null) {
for (Field f : clazz.getDeclaredFields()) {
if (f.getName().equals("energy")) {
energyField = f;
break fieldLoop;
}
}
clazz = clazz.getSuperclass();
}
energyField.setAccessible(true);
Object energy = energyField.get(tileEntity);
Set<EnumFacing> connections;
if (tile instanceof IEnergyEmitter) {
connections = (Set<EnumFacing>) energy.getClass().getMethod("getSinkDirs").invoke(energy);
if (connections.contains(direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
continue;
}
}
if (tile instanceof IEnergyAcceptor) {
connections = (Set<EnumFacing>) energy.getClass().getMethod("getSourceDirs").invoke(energy);
if (connections.contains(direction.getOpposite())) {
adjacentConnections[direction.ordinal()] = tileEntity;
continue;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return adjacentConnections;
}
use of cofh.api.energy.IEnergyProvider in project PneumaticCraft by MineMaarten.
the class ProgWidgetRFCondition method getEvaluator.
@Override
protected DroneAIBlockCondition getEvaluator(IDroneBase drone, IProgWidget widget) {
return new DroneAIBlockCondition(drone, (ProgWidgetAreaItemBase) widget) {
@Override
protected boolean evaluate(ChunkPosition pos) {
TileEntity te = drone.getWorld().getTileEntity(pos.chunkPosX, pos.chunkPosY, pos.chunkPosZ);
int energy = 0;
if (te instanceof IEnergyReceiver) {
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
if (getSides()[d.ordinal()]) {
energy = Math.max(((IEnergyReceiver) te).getEnergyStored(d), energy);
}
}
}
if (te instanceof IEnergyProvider) {
for (ForgeDirection d : ForgeDirection.VALID_DIRECTIONS) {
if (getSides()[d.ordinal()]) {
energy = Math.max(((IEnergyProvider) te).getEnergyStored(d), energy);
}
}
}
return ((ICondition) widget).getOperator() == ICondition.Operator.EQUALS ? energy == ((ICondition) widget).getRequiredCount() : energy >= ((ICondition) widget).getRequiredCount();
}
};
}
Aggregations