diff --git a/common/buildcraft/api/blueprints/Schematic.java b/common/buildcraft/api/blueprints/Schematic.java index bfaff95f..a3825865 100755 --- a/common/buildcraft/api/blueprints/Schematic.java +++ b/common/buildcraft/api/blueprints/Schematic.java @@ -39,6 +39,15 @@ import net.minecraft.nbt.NBTTagCompound; */ public class Schematic { + /** + * Return true if the block on the world correspond to the block stored in + * the blueprint at the location given by the slot. By default, this + * subprogram is permissive and doesn't take into account metadata. + */ + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { + return true; + } + public final LinkedList getRequirements(IBuilderContext context) { LinkedList res = new LinkedList(); diff --git a/common/buildcraft/api/blueprints/SchematicBlock.java b/common/buildcraft/api/blueprints/SchematicBlock.java index 8786107e..41cb9c0d 100755 --- a/common/buildcraft/api/blueprints/SchematicBlock.java +++ b/common/buildcraft/api/blueprints/SchematicBlock.java @@ -107,7 +107,7 @@ public class SchematicBlock extends SchematicBlockBase implements Comparable f * f) { + return false; + } else { + return true; + } + } + } diff --git a/common/buildcraft/builders/schematics/SchematicDirt.java b/common/buildcraft/builders/schematics/SchematicDirt.java index 0ba68c0c..c270748e 100644 --- a/common/buildcraft/builders/schematics/SchematicDirt.java +++ b/common/buildcraft/builders/schematics/SchematicDirt.java @@ -29,7 +29,7 @@ public class SchematicDirt extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { Block block = context.world().getBlock(x, y, z); return block == Blocks.dirt || block == Blocks.grass || block == Blocks.farmland; diff --git a/common/buildcraft/builders/schematics/SchematicFarmland.java b/common/buildcraft/builders/schematics/SchematicFarmland.java index 8d94a692..4e684d44 100755 --- a/common/buildcraft/builders/schematics/SchematicFarmland.java +++ b/common/buildcraft/builders/schematics/SchematicFarmland.java @@ -29,7 +29,7 @@ public class SchematicFarmland extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { Block block = context.world().getBlock(x, y, z); return block == Blocks.farmland; diff --git a/common/buildcraft/builders/schematics/SchematicFluid.java b/common/buildcraft/builders/schematics/SchematicFluid.java index dd548d03..d24ab2c0 100644 --- a/common/buildcraft/builders/schematics/SchematicFluid.java +++ b/common/buildcraft/builders/schematics/SchematicFluid.java @@ -30,7 +30,7 @@ public class SchematicFluid extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { if (meta == 0) { return block == context.world().getBlock(x, y, z) && context.world().getBlockMetadata(x, y, z) == 0; } else { diff --git a/common/buildcraft/builders/schematics/SchematicGravel.java b/common/buildcraft/builders/schematics/SchematicGravel.java index 2d23bc30..9c8028bb 100755 --- a/common/buildcraft/builders/schematics/SchematicGravel.java +++ b/common/buildcraft/builders/schematics/SchematicGravel.java @@ -29,7 +29,7 @@ public class SchematicGravel extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { Block block = context.world().getBlock(x, y, z); return block == Blocks.gravel; diff --git a/common/buildcraft/builders/schematics/SchematicHanging.java b/common/buildcraft/builders/schematics/SchematicHanging.java index c6264338..ad4288fd 100755 --- a/common/buildcraft/builders/schematics/SchematicHanging.java +++ b/common/buildcraft/builders/schematics/SchematicHanging.java @@ -9,6 +9,7 @@ package buildcraft.builders.schematics; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityHanging; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -85,4 +86,30 @@ public class SchematicHanging extends SchematicEntity { storedRequirements [0] = new ItemStack(baseItem); } } + + @Override + public boolean isAlreadyBuilt(IBuilderContext context, CoordTransformation transform) { + Position newPosition = new Position (cpt.getInteger("TileX"), cpt.getInteger("TileY"), cpt.getInteger("TileZ")); + newPosition = transform.translate(newPosition); + + int dir = cpt.getInteger("Direction"); + + for (Object o : context.world().loadedEntityList) { + Entity e = (Entity) o; + + if (e instanceof EntityHanging) { + EntityHanging h = (EntityHanging) e; + Position existingPositon = new Position(h.field_146063_b, h.field_146064_c, h.field_146062_d); + + System.out.println ("EXPECTED POS" + newPosition + ", found " + existingPositon); + System.out.println ("EXPECTED DIR" + dir + ", found " + ((EntityHanging) e).hangingDirection); + + if (existingPositon.isClose(newPosition, 0.1F) && dir == ((EntityHanging) e).hangingDirection) { + return true; + } + } + } + + return false; + } } diff --git a/common/buildcraft/builders/schematics/SchematicIgnore.java b/common/buildcraft/builders/schematics/SchematicIgnore.java index d4d274ba..eb04c73f 100644 --- a/common/buildcraft/builders/schematics/SchematicIgnore.java +++ b/common/buildcraft/builders/schematics/SchematicIgnore.java @@ -22,7 +22,7 @@ public class SchematicIgnore extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return true; } diff --git a/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java b/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java index b61c85d9..b3014543 100644 --- a/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java +++ b/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java @@ -22,7 +22,7 @@ public class SchematicIgnoreMeta extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return block == context.world().getBlock(x, y, z); } } diff --git a/common/buildcraft/builders/schematics/SchematicMinecart.java b/common/buildcraft/builders/schematics/SchematicMinecart.java index 2e609b38..a7797b36 100755 --- a/common/buildcraft/builders/schematics/SchematicMinecart.java +++ b/common/buildcraft/builders/schematics/SchematicMinecart.java @@ -9,6 +9,7 @@ package buildcraft.builders.schematics; import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityMinecart; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagList; @@ -51,4 +52,32 @@ public class SchematicMinecart extends SchematicEntity { storedRequirements = new ItemStack [1]; storedRequirements [0] = new ItemStack(baseItem); } + + @Override + public boolean isAlreadyBuilt(IBuilderContext context, CoordTransformation transform) { + NBTTagList nbttaglist = cpt.getTagList("Pos", 6); + Position newPosition = new Position(nbttaglist.func_150309_d(0), + nbttaglist.func_150309_d(1), nbttaglist.func_150309_d(2)); + + newPosition.x += 0.5; + newPosition.z += 0.5; + + newPosition = transform.translate(newPosition); + + for (Object o : context.world().loadedEntityList) { + Entity e = (Entity) o; + + Position existingPositon = new Position(e.posX, e.posY, e.posZ); + + if (e instanceof EntityMinecart) { + System.out.println ("found " + existingPositon + ", should be " + newPosition); + if (existingPositon.isClose(newPosition, 0.1F)) { + return true; + } + } + } + + return false; + } + } diff --git a/common/buildcraft/builders/schematics/SchematicPortal.java b/common/buildcraft/builders/schematics/SchematicPortal.java index aa75ce49..77743114 100755 --- a/common/buildcraft/builders/schematics/SchematicPortal.java +++ b/common/buildcraft/builders/schematics/SchematicPortal.java @@ -27,7 +27,7 @@ public class SchematicPortal extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return true; } diff --git a/common/buildcraft/builders/schematics/SchematicPumpkin.java b/common/buildcraft/builders/schematics/SchematicPumpkin.java index 48064c66..f5f06c18 100644 --- a/common/buildcraft/builders/schematics/SchematicPumpkin.java +++ b/common/buildcraft/builders/schematics/SchematicPumpkin.java @@ -22,7 +22,7 @@ public class SchematicPumpkin extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return block == context.world().getBlock(x, y, z); } diff --git a/common/buildcraft/builders/schematics/SchematicRail.java b/common/buildcraft/builders/schematics/SchematicRail.java index 5f5bf76e..3530f9a0 100755 --- a/common/buildcraft/builders/schematics/SchematicRail.java +++ b/common/buildcraft/builders/schematics/SchematicRail.java @@ -60,7 +60,7 @@ public class SchematicRail extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return block == context.world().getBlock(x, y, z); } diff --git a/common/buildcraft/builders/schematics/SchematicRotateMeta.java b/common/buildcraft/builders/schematics/SchematicRotateMeta.java index 07fafde2..1a4b3674 100644 --- a/common/buildcraft/builders/schematics/SchematicRotateMeta.java +++ b/common/buildcraft/builders/schematics/SchematicRotateMeta.java @@ -35,7 +35,7 @@ public class SchematicRotateMeta extends SchematicTile { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return block == context.world().getBlock(x, y, z); } diff --git a/common/buildcraft/builders/schematics/SchematicSeeds.java b/common/buildcraft/builders/schematics/SchematicSeeds.java index 2a591c56..68b6c703 100755 --- a/common/buildcraft/builders/schematics/SchematicSeeds.java +++ b/common/buildcraft/builders/schematics/SchematicSeeds.java @@ -34,7 +34,7 @@ public class SchematicSeeds extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return context.world().getBlock(x, y, z) == block; } } diff --git a/common/buildcraft/builders/schematics/SchematicStairs.java b/common/buildcraft/builders/schematics/SchematicStairs.java index e2f613e4..359a5a46 100644 --- a/common/buildcraft/builders/schematics/SchematicStairs.java +++ b/common/buildcraft/builders/schematics/SchematicStairs.java @@ -22,7 +22,7 @@ public class SchematicStairs extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return block == context.world().getBlock(x, y, z); } diff --git a/common/buildcraft/builders/schematics/SchematicStone.java b/common/buildcraft/builders/schematics/SchematicStone.java index 7454664a..a0f29d6c 100755 --- a/common/buildcraft/builders/schematics/SchematicStone.java +++ b/common/buildcraft/builders/schematics/SchematicStone.java @@ -29,7 +29,7 @@ public class SchematicStone extends SchematicBlock { } @Override - public boolean isValid(IBuilderContext context, int x, int y, int z) { + public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { Block block = context.world().getBlock(x, y, z); return block == Blocks.stone; diff --git a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java index a902e691..7db7b96a 100644 --- a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java +++ b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java @@ -163,8 +163,7 @@ public class BptBuilderBlueprint extends BptBuilderBase { try { getNext = !slot.schematic.ignoreBuilding() - && !slot.schematic.isValid(context, slot.x, slot.y, - slot.z); + && !slot.isAlreadyBuilt(context); } catch (Throwable t) { // Defensive code against errors in implementers t.printStackTrace(); @@ -207,15 +206,19 @@ public class BptBuilderBlueprint extends BptBuilderBase { TileAbstractBuilder builder, LinkedList list) { Iterator it = list.iterator(); - while (iterator.hasNext()) { + while (it.hasNext()) { BuildingSlotEntity slot = it.next(); - if (checkRequirements(builder, slot.schematic)) { - useRequirements(builder, slot); + if (slot.isAlreadyBuilt(context)) { + it.remove(); + } else { + if (checkRequirements(builder, slot.schematic)) { + useRequirements(builder, slot); - iterator.remove(); - postProcessing.add(slot); - return slot; + it.remove(); + postProcessing.add(slot); + return slot; + } } } diff --git a/common/buildcraft/core/blueprints/BuildingSlot.java b/common/buildcraft/core/blueprints/BuildingSlot.java index 74dcc448..fd141166 100755 --- a/common/buildcraft/core/blueprints/BuildingSlot.java +++ b/common/buildcraft/core/blueprints/BuildingSlot.java @@ -45,5 +45,7 @@ public abstract class BuildingSlot { stackConsumed.add (stack); } + public abstract boolean isAlreadyBuilt (IBuilderContext context); + public abstract Schematic getSchematic (); } diff --git a/common/buildcraft/core/blueprints/BuildingSlotBlock.java b/common/buildcraft/core/blueprints/BuildingSlotBlock.java index d92e2b9d..f1dcd748 100755 --- a/common/buildcraft/core/blueprints/BuildingSlotBlock.java +++ b/common/buildcraft/core/blueprints/BuildingSlotBlock.java @@ -40,7 +40,7 @@ public class BuildingSlotBlock extends BuildingSlot implements Comparable