Search in sources :

Example 1 with IMjReceiver

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
        }
    }
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) IMjReceiver(buildcraft.api.mj.IMjReceiver)

Example 2 with IMjReceiver

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
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) IMjReceiver(buildcraft.api.mj.IMjReceiver)

Example 3 with IMjReceiver

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;
// }
}
Also used : EnumFacing(net.minecraft.util.EnumFacing) IPipe(buildcraft.api.transport.pipe.IPipe) IMjReceiver(buildcraft.api.mj.IMjReceiver)

Example 4 with IMjReceiver

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;
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) IMjReceiver(buildcraft.api.mj.IMjReceiver)

Aggregations

IMjReceiver (buildcraft.api.mj.IMjReceiver)4 TileEntity (net.minecraft.tileentity.TileEntity)3 IPipe (buildcraft.api.transport.pipe.IPipe)1 EnumFacing (net.minecraft.util.EnumFacing)1