Buildcraft should now be mostly MFFS safe.

Depreciated the unbreakableBlock() thing in the API and added a new
function to BlockUtils that does a better job of the same thing.

The Quarry and Mining Well should be completely incapable of penetrating
a Force Field.

The Filler will terminate its current job if it detects an unbreackable
block during an operation, but its still theoretically possible to
affect blocks inside a Force Field. Some patterns are worse than others.
Preventing this completely is pretty difficult without some way to know
whether a block is inside a Force Field.
This commit is contained in:
CovertJaguar 2012-10-30 13:27:14 -07:00
parent 675f4e6df9
commit 85fee2aef7
13 changed files with 107 additions and 71 deletions

View file

@ -17,6 +17,7 @@ import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init; import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PreInit; import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.ServerStarting; import cpw.mods.fml.common.Mod.ServerStarting;
import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent;
@ -61,7 +62,11 @@ import buildcraft.core.triggers.ActionMachineControl.Mode;
import buildcraft.core.utils.Localization; import buildcraft.core.utils.Localization;
import buildcraft.transport.triggers.TriggerRedstoneInput; import buildcraft.transport.triggers.TriggerRedstoneInput;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import net.minecraft.src.Block; import net.minecraft.src.Block;
import net.minecraft.src.BlockFlower;
import net.minecraft.src.BlockFluid;
import net.minecraft.src.BlockGrass;
import net.minecraft.src.CommandHandler; import net.minecraft.src.CommandHandler;
import net.minecraft.src.EntityList; import net.minecraft.src.EntityList;
import net.minecraft.src.Item; import net.minecraft.src.Item;
@ -232,11 +237,6 @@ public class BuildCraftCore {
LiquidManager.liquids.add(new LiquidData(new LiquidStack(Block.waterStill, LiquidManager.BUCKET_VOLUME), new LiquidStack(Block.waterMoving, LiquidManager.BUCKET_VOLUME), new ItemStack(Item.potion), new ItemStack(Item.glassBottle))); LiquidManager.liquids.add(new LiquidData(new LiquidStack(Block.waterStill, LiquidManager.BUCKET_VOLUME), new LiquidStack(Block.waterMoving, LiquidManager.BUCKET_VOLUME), new ItemStack(Item.potion), new ItemStack(Item.glassBottle)));
LiquidManager.liquids.add(new LiquidData(new LiquidStack(Block.lavaStill, LiquidManager.BUCKET_VOLUME), new LiquidStack(Block.lavaMoving, LiquidManager.BUCKET_VOLUME), new ItemStack(Item.bucketLava), new ItemStack(Item.bucketEmpty))); LiquidManager.liquids.add(new LiquidData(new LiquidStack(Block.lavaStill, LiquidManager.BUCKET_VOLUME), new LiquidStack(Block.lavaMoving, LiquidManager.BUCKET_VOLUME), new ItemStack(Item.bucketLava), new ItemStack(Item.bucketEmpty)));
BuildCraftAPI.softBlocks[Block.tallGrass.blockID] = true;
BuildCraftAPI.softBlocks[Block.snow.blockID] = true;
BuildCraftAPI.softBlocks[Block.waterMoving.blockID] = true;
BuildCraftAPI.softBlocks[Block.waterStill.blockID] = true;
ActionManager.registerTriggerProvider(new DefaultTriggerProvider()); ActionManager.registerTriggerProvider(new DefaultTriggerProvider());
ActionManager.registerActionProvider(new DefaultActionProvider()); ActionManager.registerActionProvider(new DefaultActionProvider());
@ -261,6 +261,17 @@ public class BuildCraftCore {
} }
@PostInit
public void postInit(FMLPostInitializationEvent event){
for(Block block : Block.blocksList) {
if(block instanceof BlockFluid || block instanceof BlockGrass){
BuildCraftAPI.softBlocks[block.blockID] = true;
}
}
BuildCraftAPI.softBlocks[Block.snow.blockID] = true;
}
@ServerStarting @ServerStarting
public void serverStarting(FMLServerStartingEvent event) { public void serverStarting(FMLServerStartingEvent event) {
CommandHandler commandManager = (CommandHandler)event.getServer().getCommandManager(); CommandHandler commandManager = (CommandHandler)event.getServer().getCommandManager();

View file

@ -157,9 +157,6 @@ public class BuildCraftEnergy {
LiquidManager.liquids.add(new LiquidData(new LiquidStack(oilStill, LiquidManager.BUCKET_VOLUME), new LiquidStack(oilMoving, LiquidManager.BUCKET_VOLUME), new ItemStack(bucketOil), new ItemStack(Item.bucketEmpty))); LiquidManager.liquids.add(new LiquidData(new LiquidStack(oilStill, LiquidManager.BUCKET_VOLUME), new LiquidStack(oilMoving, LiquidManager.BUCKET_VOLUME), new ItemStack(bucketOil), new ItemStack(Item.bucketEmpty)));
LiquidManager.liquids.add(new LiquidData(new LiquidStack(fuel, LiquidManager.BUCKET_VOLUME), new LiquidStack(fuel, LiquidManager.BUCKET_VOLUME), new ItemStack(bucketFuel), new ItemStack(Item.bucketEmpty))); LiquidManager.liquids.add(new LiquidData(new LiquidStack(fuel, LiquidManager.BUCKET_VOLUME), new LiquidStack(fuel, LiquidManager.BUCKET_VOLUME), new ItemStack(bucketFuel), new ItemStack(Item.bucketEmpty)));
BuildCraftAPI.softBlocks[oilMoving.blockID] = true;
BuildCraftAPI.softBlocks[oilStill.blockID] = true;
} }
public static void loadRecipes() { public static void loadRecipes() {

View file

@ -1,8 +1,8 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011
* http://www.mod-buildcraft.com * http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in * License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
@ -13,14 +13,14 @@ import net.minecraft.src.Block;
import net.minecraft.src.World; import net.minecraft.src.World;
public class BuildCraftAPI { public class BuildCraftAPI {
@Deprecated @Deprecated
// To be removed, see LiquidManager // To be removed, see LiquidManager
public static final int BUCKET_VOLUME = 1000; public static final int BUCKET_VOLUME = 1000;
public static final int LAST_ORIGINAL_BLOCK = 122; public static final int LAST_ORIGINAL_BLOCK = 122;
public static final int LAST_ORIGINAL_ITEM = 126; public static final int LAST_ORIGINAL_ITEM = 126;
public static boolean[] softBlocks = new boolean[Block.blocksList.length]; public static final boolean[] softBlocks = new boolean[Block.blocksList.length];
/** /**
* Return true if the block given in parameter is pass through (e.g. air, * Return true if the block given in parameter is pass through (e.g. air,
* water...) * water...)
@ -29,9 +29,8 @@ public class BuildCraftAPI {
return blockId == 0 || softBlocks[blockId] || Block.blocksList[blockId] == null; return blockId == 0 || softBlocks[blockId] || Block.blocksList[blockId] == null;
} }
/** @Deprecated
* Return true if the block cannot be broken, typically bedrock and lava // To be removed
*/
public static boolean unbreakableBlock(int blockId) { public static boolean unbreakableBlock(int blockId) {
return blockId == Block.bedrock.blockID || blockId == Block.lavaStill.blockID || blockId == Block.lavaMoving.blockID; return blockId == Block.bedrock.blockID || blockId == Block.lavaStill.blockID || blockId == Block.lavaMoving.blockID;
} }
@ -47,10 +46,4 @@ public class BuildCraftAPI {
world.setBlockWithNotify(x, y, z, 0); world.setBlockWithNotify(x, y, z, 0);
} }
static {
for (int i = 0; i < softBlocks.length; ++i) {
softBlocks[i] = false;
}
}
} }

View file

@ -1,8 +1,8 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011
* http://www.mod-buildcraft.com * http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in * License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
@ -26,7 +26,7 @@ public class FillerFillAll extends FillerPattern {
int yMax = (int) box.pMax().y; int yMax = (int) box.pMax().y;
int zMax = (int) box.pMax().z; int zMax = (int) box.pMax().z;
return fill(xMin, yMin, zMin, xMax, yMax, zMax, stackToPlace, tile.worldObj); return !fill(xMin, yMin, zMin, xMax, yMax, zMax, stackToPlace, tile.worldObj);
} }
@Override @Override

View file

@ -1,8 +1,8 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011
* http://www.mod-buildcraft.com * http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in * License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
@ -47,7 +47,7 @@ public class FillerFillPyramid extends FillerPattern {
} }
while (step <= xSize / 2 && step <= zSize / 2 && height >= yMin && height <= yMax) { while (step <= xSize / 2 && step <= zSize / 2 && height >= yMin && height <= yMax) {
if (!fill(xMin + step, height, zMin + step, xMax - step, height, zMax - step, stackToPlace, tile.worldObj)) { if (fill(xMin + step, height, zMin + step, xMax - step, height, zMax - step, stackToPlace, tile.worldObj)) {
return false; return false;
} }

View file

@ -1,8 +1,8 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011
* http://www.mod-buildcraft.com * http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in * License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
@ -120,7 +120,7 @@ public class FillerFillStairs extends FillerPattern {
if (kind == 0) { if (kind == 0) {
while (x2 - x1 + 1 > 0 && z2 - z1 + 1 > 0 && x2 - x1 < sizeX && z2 - z1 < sizeZ && height >= yMin && height <= yMax) { while (x2 - x1 + 1 > 0 && z2 - z1 + 1 > 0 && x2 - x1 < sizeX && z2 - z1 < sizeZ && height >= yMin && height <= yMax) {
if (!fill(x1, height, z1, x2, height, z2, stackToPlace, tile.worldObj)) { if (fill(x1, height, z1, x2, height, z2, stackToPlace, tile.worldObj)) {
return false; return false;
} }
@ -176,7 +176,7 @@ public class FillerFillStairs extends FillerPattern {
} }
if (!fill(x1, height, z1, x2, height, z2, stackToPlace, tile.worldObj)) { if (fill(x1, height, z1, x2, height, z2, stackToPlace, tile.worldObj)) {
return false; return false;
} }

View file

@ -1,8 +1,8 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011
* http://www.mod-buildcraft.com * http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in * License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
@ -26,27 +26,27 @@ public class FillerFillWalls extends FillerPattern {
int yMax = (int) box.pMax().y; int yMax = (int) box.pMax().y;
int zMax = (int) box.pMax().z; int zMax = (int) box.pMax().z;
if (!fill(xMin, yMin, zMin, xMax, yMin, zMax, stackToPlace, tile.worldObj)) { if (fill(xMin, yMin, zMin, xMax, yMin, zMax, stackToPlace, tile.worldObj)) {
return false; return false;
} }
if (!fill(xMin, yMin, zMin, xMin, yMax, zMax, stackToPlace, tile.worldObj)) { if (fill(xMin, yMin, zMin, xMin, yMax, zMax, stackToPlace, tile.worldObj)) {
return false; return false;
} }
if (!fill(xMin, yMin, zMin, xMax, yMax, zMin, stackToPlace, tile.worldObj)) { if (fill(xMin, yMin, zMin, xMax, yMax, zMin, stackToPlace, tile.worldObj)) {
return false; return false;
} }
if (!fill(xMax, yMin, zMin, xMax, yMax, zMax, stackToPlace, tile.worldObj)) { if (fill(xMax, yMin, zMin, xMax, yMax, zMax, stackToPlace, tile.worldObj)) {
return false; return false;
} }
if (!fill(xMin, yMin, zMax, xMax, yMax, zMax, stackToPlace, tile.worldObj)) { if (fill(xMin, yMin, zMax, xMax, yMax, zMax, stackToPlace, tile.worldObj)) {
return false; return false;
} }
if (!fill(xMin, yMax, zMin, xMax, yMax, zMax, stackToPlace, tile.worldObj)) { if (fill(xMin, yMax, zMin, xMax, yMax, zMax, stackToPlace, tile.worldObj)) {
return false; return false;
} }

View file

@ -13,6 +13,7 @@ import buildcraft.api.core.BuildCraftAPI;
import buildcraft.api.core.IBox; import buildcraft.api.core.IBox;
import buildcraft.core.DefaultProps; import buildcraft.core.DefaultProps;
import buildcraft.core.proxy.CoreProxy; import buildcraft.core.proxy.CoreProxy;
import buildcraft.core.utils.BlockUtil;
import net.minecraft.src.ItemStack; import net.minecraft.src.ItemStack;
import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntity;
@ -45,6 +46,9 @@ public class FillerFlattener extends FillerPattern {
found = false; found = false;
for (int x = xMin; x <= xMax; ++x) { for (int x = xMin; x <= xMax; ++x) {
for (int z = zMin; z <= zMax; ++z) { for (int z = zMin; z <= zMax; ++z) {
if(!BlockUtil.canChangeBlock(tile.worldObj, x, y, z)){
return true;
}
if (!blockedColumns[x - xMin][z - zMin]) { if (!blockedColumns[x - xMin][z - zMin]) {
if (!BuildCraftAPI.softBlock(tile.worldObj.getBlockId(x, y, z))) { if (!BuildCraftAPI.softBlock(tile.worldObj.getBlockId(x, y, z))) {
blockedColumns[x - xMin][z - zMin] = true; blockedColumns[x - xMin][z - zMin] = true;
@ -72,7 +76,7 @@ public class FillerFlattener extends FillerPattern {
return false; return false;
} }
return empty(xMin, yMin, zMin, xMax, 64 * 2, zMax, tile.worldObj); return !empty(xMin, yMin, zMin, xMax, 64 * 2, zMax, tile.worldObj);
} }
@Override @Override

View file

@ -47,6 +47,12 @@ public abstract class FillerPattern implements IFillerPattern {
return this.id; return this.id;
} }
/**
* Attempt to fill blocks in the area.
*
* Return false if the process failed.
*
*/
public boolean fill(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, ItemStack stackToPlace, World world) { public boolean fill(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, ItemStack stackToPlace, World world) {
boolean found = false; boolean found = false;
int xSlot = 0, ySlot = 0, zSlot = 0; int xSlot = 0, ySlot = 0, zSlot = 0;
@ -54,6 +60,9 @@ public abstract class FillerPattern implements IFillerPattern {
for (int y = yMin; y <= yMax && !found; ++y) { for (int y = yMin; y <= yMax && !found; ++y) {
for (int x = xMin; x <= xMax && !found; ++x) { for (int x = xMin; x <= xMax && !found; ++x) {
for (int z = zMin; z <= zMax && !found; ++z) { for (int z = zMin; z <= zMax && !found; ++z) {
if(!BlockUtil.canChangeBlock(world, x, y, z)){
return false;
}
if (BuildCraftAPI.softBlock(world.getBlockId(x, y, z))) { if (BuildCraftAPI.softBlock(world.getBlockId(x, y, z))) {
xSlot = x; xSlot = x;
ySlot = y; ySlot = y;
@ -70,9 +79,15 @@ public abstract class FillerPattern implements IFillerPattern {
zSlot, 1, 0.0f, 0.0f, 0.0f); zSlot, 1, 0.0f, 0.0f, 0.0f);
} }
return !found; return found;
} }
/**
* Attempt to remove the blocks in the area.
*
* Return false if is the process failed.
*
*/
public boolean empty(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, World world) { public boolean empty(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, World world) {
boolean found = false; boolean found = false;
int lastX = Integer.MAX_VALUE, lastY = Integer.MAX_VALUE, lastZ = Integer.MAX_VALUE; int lastX = Integer.MAX_VALUE, lastY = Integer.MAX_VALUE, lastZ = Integer.MAX_VALUE;
@ -81,8 +96,10 @@ public abstract class FillerPattern implements IFillerPattern {
found = false; found = false;
for (int x = xMin; x <= xMax; ++x) { for (int x = xMin; x <= xMax; ++x) {
for (int z = zMin; z <= zMax; ++z) { for (int z = zMin; z <= zMax; ++z) {
if (!BuildCraftAPI.softBlock(world.getBlockId(x, y, z)) if(!BlockUtil.canChangeBlock(world, x, y, z)){
&& !BuildCraftAPI.unbreakableBlock(world.getBlockId(x, y, z))) { return false;
}
if (!BuildCraftAPI.softBlock(world.getBlockId(x, y, z))) {
found = true; found = true;
lastX = x; lastX = x;
lastY = y; lastY = y;
@ -102,9 +119,10 @@ public abstract class FillerPattern implements IFillerPattern {
} else { } else {
BlockUtil.breakBlock(world, lastX, lastY, lastZ); BlockUtil.breakBlock(world, lastX, lastY, lastZ);
} }
return true;
} }
return lastX == Integer.MAX_VALUE; return false;
} }
} }

View file

@ -1,8 +1,8 @@
/** /**
* Copyright (c) SpaceToad, 2011 * Copyright (c) SpaceToad, 2011
* http://www.mod-buildcraft.com * http://www.mod-buildcraft.com
* *
* BuildCraft is distributed under the terms of the Minecraft Mod Public * BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in * License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt * http://www.mod-buildcraft.com/MMPL-1.0.txt
*/ */
@ -26,7 +26,7 @@ public class FillerRemover extends FillerPattern {
int yMax = (int) box.pMax().y; int yMax = (int) box.pMax().y;
int zMax = (int) box.pMax().z; int zMax = (int) box.pMax().z;
return empty(xMin, yMin, zMin, xMax, yMax, zMax, tile.worldObj); return !empty(xMin, yMin, zMin, xMax, yMax, zMax, tile.worldObj);
} }
@Override @Override

View file

@ -12,6 +12,8 @@ import java.util.ArrayList;
import buildcraft.BuildCraftCore; import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftEnergy;
import buildcraft.BuildCraftFactory;
import net.minecraft.src.Block; import net.minecraft.src.Block;
import net.minecraft.src.ItemStack; import net.minecraft.src.ItemStack;
import net.minecraft.src.World; import net.minecraft.src.World;
@ -38,4 +40,29 @@ public class BlockUtil {
world.setBlockWithNotify(x, y, z, 0); world.setBlockWithNotify(x, y, z, 0);
} }
public static boolean canChangeBlock(World world, int x, int y, int z) {
if(world.isAirBlock(x, y, z)){
return true;
}
int blockID = world.getBlockId(x, y, z);
if(Block.blocksList[blockID] == null) {
return true;
}
Block block = Block.blocksList[blockID];
if(block.getBlockHardness(world, x, y, z) < 0) {
return false;
}
if(blockID == BuildCraftEnergy.oilMoving.blockID || blockID == BuildCraftEnergy.oilStill.blockID) {
return false;
}
if(blockID == Block.lavaStill.blockID || blockID == Block.lavaMoving.blockID) {
return false;
}
return true;
}
} }

View file

@ -21,7 +21,6 @@ import buildcraft.core.IMachine;
import buildcraft.core.utils.BlockUtil; import buildcraft.core.utils.BlockUtil;
import buildcraft.core.utils.Utils; import buildcraft.core.utils.Utils;
import net.minecraft.src.Block;
import net.minecraft.src.EntityItem; import net.minecraft.src.EntityItem;
import net.minecraft.src.ItemStack; import net.minecraft.src.ItemStack;
import net.minecraft.src.World; import net.minecraft.src.World;
@ -55,12 +54,7 @@ public class TileMiningWell extends TileMachine implements IMachine, IPowerRecep
depth = depth - 1; depth = depth - 1;
} }
if (depth < 0 if (depth < 0 || !BlockUtil.canChangeBlock(world, xCoord, depth, zCoord)) {
|| (Block.blocksList[world.getBlockId(xCoord, depth, zCoord)] != null && Block.blocksList[world.getBlockId(
xCoord, depth, zCoord)].getBlockHardness(world, xCoord, yCoord, zCoord) == -1.0f)
|| world.getBlockId(xCoord, depth, zCoord) == Block.lavaMoving.blockID
|| world.getBlockId(xCoord, depth, zCoord) == Block.lavaStill.blockID) {
isDigging = false; isDigging = false;
return; return;
} }
@ -75,7 +69,7 @@ public class TileMiningWell extends TileMachine implements IMachine, IPowerRecep
return; return;
} }
if (stacks == null || stacks.size() == 0) { if (stacks == null || stacks.isEmpty()) {
return; return;
} }

View file

@ -290,7 +290,7 @@ public class TileQuarry extends TileMachine implements IMachine, IPowerReceptor,
int blockId = worldObj.getBlockId(bx, by, bz); int blockId = worldObj.getBlockId(bx, by, bz);
if (isUnquarriableBlock(blockId, bx, by, bz)) { if (!BlockUtil.canChangeBlock(worldObj, bx, by, bz)) {
blockedColumns[searchX][searchZ] = true; blockedColumns[searchX][searchZ] = true;
} else if (isQuarriableBlock(blockId, bx, by + 1, bz)) { } else if (isQuarriableBlock(blockId, bx, by + 1, bz)) {
if (doSet) { if (doSet) {
@ -436,16 +436,8 @@ public class TileQuarry extends TileMachine implements IMachine, IPowerReceptor,
} }
} }
private boolean isUnquarriableBlock(int blockID, int bx, int by, int bz) {
if (Block.blocksList[blockID] != null && Block.blocksList[blockID].getBlockHardness(worldObj, bx, by, bz) == -1.0f)
return true;
return blockID == Block.lavaStill.blockID || blockID == Block.lavaMoving.blockID;
}
private boolean isQuarriableBlock(int blockID, int bx, int by, int bz) { private boolean isQuarriableBlock(int blockID, int bx, int by, int bz) {
return !isUnquarriableBlock(blockID, bx, by, bz) && !BuildCraftAPI.softBlock(blockID); return BlockUtil.canChangeBlock(worldObj, bx, by, bz) && !BuildCraftAPI.softBlock(blockID);
} }
@Override @Override