use of buildcraft.api.mj.IMjReceiver in project BuildCraft by BuildCraft.
the class TileEngineBase_BC8 method sendPower.
private void sendPower() {
TileEntity tile = getTileBuffer(currentDirection).getTile();
if (tile == null) {
return;
}
if (getClass() == tile.getClass()) {
TileEngineBase_BC8 other = (TileEngineBase_BC8) tile;
if (currentDirection == other.currentDirection) {
other.power += extractPower(0, power, true);
}
return;
}
IMjReceiver receiver = getReceiverToPower(tile, currentDirection);
if (receiver != null) {
long extracted = getPowerToExtract(true);
if (extracted > 0) {
long excess = receiver.receivePower(extracted, false);
// Comment out for constant power
extractPower(extracted - excess, extracted - excess, true);
// currentOutput = extractEnergy(0, needed, true); // Uncomment for constant power
}
}
}
use of buildcraft.api.mj.IMjReceiver in project BuildCraft by BuildCraft.
the class TileEngineBase_BC8 method getPowerToExtract.
private long getPowerToExtract(boolean doExtract) {
TileEntity tile = getTileBuffer(currentDirection).getTile();
if (tile == null)
return 0;
if (tile.getClass() == getClass()) {
TileEngineBase_BC8 other = (TileEngineBase_BC8) tile;
return other.getMaxPower() - power;
}
IMjReceiver receiver = getReceiverToPower(tile, currentDirection);
if (receiver == null) {
return 0;
}
// Pulsed power
return extractPower(0, receiver.getPowerRequested(), doExtract);
// TODO: Use this:
// return extractPower(receiver.getMinPowerReceived(), receiver.getMaxPowerReceived(), false);
// Constant power
// return extractEnergy(0, getActualOutput(), false); // Uncomment for constant power
}
use of buildcraft.api.mj.IMjReceiver in project BuildCraft by BuildCraft.
the class PipeFlowPower method onTick.
@Override
public void onTick() {
if (pipe.getHolder().getPipeWorld().isRemote) {
return;
}
if (maxPower == -1) {
reconfigure();
}
step();
init();
for (EnumFacing face : EnumFacing.VALUES) {
Section s = sections.get(face);
if (s.internalPower > 0) {
long totalPowerQuery = 0;
for (EnumFacing face2 : EnumFacing.VALUES) {
if (face != face2) {
totalPowerQuery += sections.get(face2).powerQuery;
}
}
if (totalPowerQuery > 0) {
long unusedPowerQuery = totalPowerQuery;
for (EnumFacing face2 : EnumFacing.VALUES) {
if (face == face2) {
continue;
}
Section s2 = sections.get(face2);
if (s2.powerQuery > 0) {
long watts = Math.min(BigInteger.valueOf(s.internalPower).multiply(BigInteger.valueOf(s2.powerQuery)).divide(BigInteger.valueOf(unusedPowerQuery)).longValue(), s.internalPower);
unusedPowerQuery -= s2.powerQuery;
IPipe neighbour = pipe.getConnectedPipe(face2);
long leftover = watts;
if (neighbour != null && neighbour.getFlow() instanceof PipeFlowPower && neighbour.isConnected(face2.getOpposite())) {
PipeFlowPower oFlow = (PipeFlowPower) neighbour.getFlow();
leftover = oFlow.sections.get(face2.getOpposite()).receivePowerInternal(watts);
} else {
IMjReceiver receiver = pipe.getHolder().getCapabilityFromPipe(face2, MjAPI.CAP_RECEIVER);
if (receiver != null && receiver.canReceive()) {
leftover = receiver.receivePower(watts, false);
}
}
long used = watts - leftover;
s.internalPower -= used;
s2.debugPowerOutput += used;
s.powerAverage.push((int) used);
s2.powerAverage.push((int) used);
}
}
}
}
}
// Render compute goes here
for (Section s : sections.values()) {
s.powerAverage.tick();
long value = (long) s.powerAverage.getAverage();
long temp = Math.min(value * MjAPI.MJ / maxPower, 1 * MjAPI.MJ);
s.displayPower = (int) (temp);
}
// Compute the tiles requesting power that are not power pipes
for (EnumFacing face : EnumFacing.VALUES) {
if (pipe.getConnectedType(face) != ConnectedType.TILE) {
continue;
}
IMjReceiver recv = pipe.getHolder().getCapabilityFromPipe(face, MjAPI.CAP_RECEIVER);
if (recv != null && recv.canReceive()) {
long requested = recv.getPowerRequested();
if (requested > 0) {
requestPower(face, requested);
}
}
}
// Sum the amount of power requested on each side
long[] transferQueryTemp = new long[6];
for (EnumFacing face : EnumFacing.VALUES) {
if (!pipe.isConnected(face)) {
continue;
}
long query = 0;
for (EnumFacing face2 : EnumFacing.VALUES) {
if (face != face2) {
query += sections.get(face2).powerQuery;
}
}
transferQueryTemp[face.ordinal()] = query;
}
// Transfer requested power to neighbouring pipes
for (EnumFacing face : EnumFacing.VALUES) {
if (transferQueryTemp[face.ordinal()] <= 0 || !pipe.isConnected(face)) {
continue;
}
IPipe oPipe = pipe.getHolder().getNeighbourPipe(face);
if (oPipe == null || !(oPipe.getFlow() instanceof PipeFlowPower)) {
continue;
}
PipeFlowPower oFlow = (PipeFlowPower) oPipe.getFlow();
oFlow.requestPower(face.getOpposite(), transferQueryTemp[face.ordinal()]);
}
// if (tracker.markTimeIfDelay(pipe.getHolder().getPipeWorld())) {
if (!Arrays.equals(transferQuery, transferQueryTemp)) {
sendPayload(NET_POWER_AMOUNTS);
}
transferQuery = transferQueryTemp;
// }
}
use of buildcraft.api.mj.IMjReceiver in project BuildCraft by BuildCraft.
the class PipeBehaviourWoodPower method getTextureIndex.
@Override
public int getTextureIndex(EnumFacing face) {
if (face == null) {
return 0;
}
if (pipe.getConnectedPipe(face) != null) {
return 0;
}
TileEntity tile = pipe.getConnectedTile(face);
if (tile == null) {
return 0;
}
IMjReceiver recv = tile.getCapability(MjAPI.CAP_RECEIVER, face.getOpposite());
return recv == null ? 1 : recv.canReceive() ? 0 : 1;
}
Aggregations