add IEngine API, restore engine connecting behaviour
This commit is contained in:
parent
b78bf28ead
commit
9e2795d235
3 changed files with 70 additions and 26 deletions
13
api/buildcraft/api/power/IEngine.java
Normal file
13
api/buildcraft/api/power/IEngine.java
Normal file
|
@ -0,0 +1,13 @@
|
|||
package buildcraft.api.power;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
/**
|
||||
* Engines should implement this interface if they want to support
|
||||
* BuildCraft's behaviour of passing energy between engines
|
||||
* without using receiveEnergy() (which has other issues).
|
||||
*/
|
||||
public interface IEngine {
|
||||
boolean canReceiveFromEngine(ForgeDirection side);
|
||||
int receiveEnergyFromEngine(ForgeDirection side, int energy, boolean simulate);
|
||||
}
|
2
api/buildcraft/api/recipes/IFlexibleCrafter.java
Executable file → Normal file
2
api/buildcraft/api/recipes/IFlexibleCrafter.java
Executable file → Normal file
|
@ -18,7 +18,7 @@ public interface IFlexibleCrafter {
|
|||
|
||||
ItemStack getCraftingItemStack(int slotid);
|
||||
|
||||
ItemStack decrCraftingItemgStack(int slotid, int val);
|
||||
ItemStack decrCraftingItemStack(int slotid, int val);
|
||||
|
||||
FluidStack getCraftingFluidStack(int tankid);
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
package buildcraft.energy;
|
||||
|
||||
import buildcraft.api.power.IEngine;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.ICrafting;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
@ -24,7 +25,7 @@ import buildcraft.core.TileBuffer;
|
|||
import buildcraft.core.TileBuildCraft;
|
||||
import buildcraft.energy.gui.ContainerEngine;
|
||||
|
||||
public abstract class TileEngine extends TileBuildCraft implements IPipeConnection, IEnergyHandler {
|
||||
public abstract class TileEngine extends TileBuildCraft implements IPipeConnection, IEnergyHandler, IEngine {
|
||||
// Index corresponds to metadata
|
||||
public static final ResourceLocation[] BASE_TEXTURES = new ResourceLocation[]{
|
||||
new ResourceLocation(DefaultProps.TEXTURE_PATH_BLOCKS + "/base_wood.png"),
|
||||
|
@ -258,14 +259,20 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti
|
|||
private int getPowerToExtract() {
|
||||
TileEntity tile = getTileBuffer(orientation).getTile();
|
||||
|
||||
if (tile instanceof IEnergyHandler) {
|
||||
if (tile instanceof IEngine) {
|
||||
IEngine engine = (IEngine) tile;
|
||||
|
||||
int maxEnergy = engine.receiveEnergyFromEngine(
|
||||
orientation.getOpposite(),
|
||||
this.energy, true);
|
||||
return extractEnergy(maxEnergy, false);
|
||||
} else if (tile instanceof IEnergyHandler) {
|
||||
IEnergyHandler handler = (IEnergyHandler) tile;
|
||||
|
||||
int minEnergy = 0;
|
||||
int maxEnergy = handler.receiveEnergy(
|
||||
orientation.getOpposite(),
|
||||
Math.round(this.energy), true);
|
||||
return extractEnergy(minEnergy, maxEnergy, false);
|
||||
this.energy, true);
|
||||
return extractEnergy(maxEnergy, false);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
@ -275,22 +282,28 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti
|
|||
TileEntity tile = getTileBuffer(orientation).getTile();
|
||||
if (isPoweredTile(tile, orientation)) {
|
||||
int extracted = getPowerToExtract();
|
||||
if (extracted > 0) {
|
||||
setPumping(true);
|
||||
} else {
|
||||
if (extracted <= 0) {
|
||||
setPumping(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (tile instanceof IEnergyHandler) {
|
||||
IEnergyHandler handler = (IEnergyHandler) tile;
|
||||
if (extracted > 0) {
|
||||
int neededRF = handler.receiveEnergy(
|
||||
orientation.getOpposite(),
|
||||
(int) Math.round(extracted), false);
|
||||
setPumping(true);
|
||||
|
||||
extractEnergy(0, neededRF, true);
|
||||
}
|
||||
}
|
||||
if (tile instanceof IEngine) {
|
||||
IEngine engine = (IEngine) tile;
|
||||
int neededRF = engine.receiveEnergyFromEngine(
|
||||
orientation.getOpposite(),
|
||||
extracted, false);
|
||||
|
||||
extractEnergy(neededRF, true);
|
||||
} else if (tile instanceof IEnergyHandler) {
|
||||
IEnergyHandler handler = (IEnergyHandler) tile;
|
||||
int neededRF = handler.receiveEnergy(
|
||||
orientation.getOpposite(),
|
||||
extracted, false);
|
||||
|
||||
extractEnergy(neededRF, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -443,13 +456,9 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti
|
|||
}
|
||||
}
|
||||
|
||||
public int extractEnergy(int min, int energyMax, boolean doExtract) {
|
||||
public int extractEnergy(int energyMax, boolean doExtract) {
|
||||
int max = Math.min(energyMax, maxEnergyExtracted());
|
||||
|
||||
if (max < min || energy < min) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int extracted;
|
||||
|
||||
if (energy >= max) {
|
||||
|
@ -471,10 +480,12 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti
|
|||
|
||||
public boolean isPoweredTile(TileEntity tile, ForgeDirection side) {
|
||||
if (tile == null) {
|
||||
return false;
|
||||
return false;
|
||||
} else if (tile instanceof IEngine) {
|
||||
return ((IEngine) tile).canReceiveFromEngine(side.getOpposite());
|
||||
} else if (tile instanceof IEnergyHandler) {
|
||||
return ((IEnergyHandler) tile).canConnectEnergy(side.getOpposite());
|
||||
} else {
|
||||
return ((IEnergyHandler) tile).canConnectEnergy(side.getOpposite());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -549,4 +560,24 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti
|
|||
public boolean canConnectEnergy(ForgeDirection from) {
|
||||
return from == orientation;
|
||||
}
|
||||
|
||||
// IEngine
|
||||
|
||||
@Override
|
||||
public boolean canReceiveFromEngine(ForgeDirection side) {
|
||||
return side == orientation.getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int receiveEnergyFromEngine(ForgeDirection side, int amount, boolean simulate) {
|
||||
if (canReceiveFromEngine(side)) {
|
||||
int targetEnergy = Math.min(this.getMaxEnergy() - this.energy, amount);
|
||||
if (!simulate) {
|
||||
energy += targetEnergy;
|
||||
}
|
||||
return targetEnergy;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue