diff --git a/api/buildcraft/api/blueprints/Schematic.java b/api/buildcraft/api/blueprints/Schematic.java index 26a74351..32fc99e4 100755 --- a/api/buildcraft/api/blueprints/Schematic.java +++ b/api/buildcraft/api/blueprints/Schematic.java @@ -77,22 +77,13 @@ public abstract class Schematic { return true; } - public final LinkedList getRequirements(IBuilderContext context) { - LinkedList res = new LinkedList(); - - addRequirements(context, res); - - return res; - } - - /** - * Returns the requirements needed to build this block. When the - * requirements are met, they will be removed all at once from the builder, - * before calling buildBlock. + * Return true if the block should not be placed to the world. Requirements + * will not be asked on such a block, and building will not be called. Post + * processing will still be called on these blocks though. */ - public void addRequirements(IBuilderContext context, LinkedList requirements) { - + public boolean doNotBuild() { + return false; } /** @@ -205,6 +196,19 @@ public abstract class Schematic { } + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + + /** + * Returns the requirements needed to build this block. When the + * requirements are met, they will be removed all at once from the builder, + * before calling buildBlock. + */ + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { + + } + public void writeToNBT(NBTTagCompound nbt, MappingRegistry registry) { } diff --git a/api/buildcraft/api/blueprints/SchematicBlock.java b/api/buildcraft/api/blueprints/SchematicBlock.java index 7d66cf31..053da34c 100755 --- a/api/buildcraft/api/blueprints/SchematicBlock.java +++ b/api/buildcraft/api/blueprints/SchematicBlock.java @@ -26,6 +26,7 @@ public class SchematicBlock extends SchematicBlockBase { public Block block = null; public int meta = 0; + public BuildingPermission defaultPermission = BuildingPermission.ALL; /** * This field contains requirements for a given block when stored in the @@ -34,13 +35,8 @@ public class SchematicBlock extends SchematicBlockBase { */ public ItemStack [] storedRequirements = new ItemStack [0]; - /** - * Returns the requirements needed to build this block. When the - * requirements are met, they will be removed all at once from the builder, - * before calling buildBlock. - */ @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { if (block != null) { if (storedRequirements.length != 0) { for (ItemStack s : storedRequirements) { @@ -52,27 +48,16 @@ public class SchematicBlock extends SchematicBlockBase { } } - /** - * 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. - */ @Override public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { return block == context.world().getBlock(x, y, z) && meta == context.world().getBlockMetadata(x, y, z); } - /** - * Perform a 90 degree rotation to the slot. - */ @Override public void rotateLeft(IBuilderContext context) { } - /** - * Places the block in the world, at the location specified in the slot. - */ @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { // Meta needs to be specified twice, depending on the block behavior @@ -80,26 +65,20 @@ public class SchematicBlock extends SchematicBlockBase { context.world().setBlockMetadataWithNotify(x, y, z, meta, 3); } - /** - * Return true if the block should not be placed to the world. Requirements - * will not be asked on such a block, and building will not be called. - */ @Override public boolean doNotBuild() { return false; } - /** - * Initializes a slot from the blueprint according to an objet placed on {x, - * y, z} on the world. This typically means adding entries in slot.cpt. Note - * that "id" and "meta" will be set automatically, corresponding to the - * block id and meta. - * - * By default, if the block is a BlockContainer, tile information will be to - * save / load the block. - */ @Override public void readFromWorld(IBuilderContext context, int x, int y, int z) { + + } + + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + super.readRequirementsFromWorld(context, x, y, z); + if (block != null) { ArrayList req = block.getDrops(context.world(), x, y, z, context.world().getBlockMetadata(x, y, z), 0); @@ -116,16 +95,18 @@ public class SchematicBlock extends SchematicBlockBase { nbt.setInteger("blockId", registry.getIdForBlock(block)); nbt.setInteger("blockMeta", meta); - NBTTagList rq = new NBTTagList(); + if (storedRequirements.length > 0) { + NBTTagList rq = new NBTTagList(); - for (ItemStack stack : storedRequirements) { - NBTTagCompound sub = new NBTTagCompound(); - stack.writeToNBT(stack.writeToNBT(sub)); - sub.setInteger("id", registry.getIdForItem(stack.getItem())); - rq.appendTag(sub); + for (ItemStack stack : storedRequirements) { + NBTTagCompound sub = new NBTTagCompound(); + stack.writeToNBT(stack.writeToNBT(sub)); + sub.setInteger("id", registry.getIdForItem(stack.getItem())); + rq.appendTag(sub); + } + + nbt.setTag("rq", rq); } - - nbt.setTag("rq", rq); } @Override @@ -133,33 +114,35 @@ public class SchematicBlock extends SchematicBlockBase { block = registry.getBlockForId(nbt.getInteger("blockId")); meta = nbt.getInteger("blockMeta"); - NBTTagList rq = nbt.getTagList("rq", Constants.NBT.TAG_COMPOUND); + if (nbt.hasKey("rq")) { + NBTTagList rq = nbt.getTagList("rq", Constants.NBT.TAG_COMPOUND); - ArrayList rqs = new ArrayList(); + ArrayList rqs = new ArrayList(); - for (int i = 0; i < rq.tagCount(); ++i) { - try { - NBTTagCompound sub = rq.getCompoundTagAt(i); + for (int i = 0; i < rq.tagCount(); ++i) { + try { + NBTTagCompound sub = rq.getCompoundTagAt(i); - if (sub.getInteger("id") >= 0) { - // Maps the id in the blueprint to the id in the world - sub.setInteger("id", Item.itemRegistry - .getIDForObject(registry.getItemForId(sub - .getInteger("id")))); + if (sub.getInteger("id") >= 0) { + // Maps the id in the blueprint to the id in the world + sub.setInteger("id", Item.itemRegistry + .getIDForObject(registry.getItemForId(sub + .getInteger("id")))); - rqs.add(ItemStack.loadItemStackFromNBT(sub)); - } else { - // TODO: requirement can't be retreived, this blueprint is - // only useable in creative + rqs.add(ItemStack.loadItemStackFromNBT(sub)); + } else { + defaultPermission = BuildingPermission.CREATIVE_ONLY; + } + } catch (Throwable t) { + t.printStackTrace(); + defaultPermission = BuildingPermission.CREATIVE_ONLY; } - } catch (Throwable t) { - t.printStackTrace(); - // TODO: requirement can't be retreived, this blueprint is - // only useable in creative } - } - storedRequirements = rqs.toArray(new ItemStack [rqs.size()]); + storedRequirements = rqs.toArray(new ItemStack[rqs.size()]); + } else { + storedRequirements = new ItemStack[0]; + } } @Override @@ -174,4 +157,9 @@ public class SchematicBlock extends SchematicBlockBase { return BuildingStage.SUPPORTED; } } + + @Override + public BuildingPermission getBuildingPermission() { + return defaultPermission; + } } diff --git a/api/buildcraft/api/blueprints/SchematicBlockBase.java b/api/buildcraft/api/blueprints/SchematicBlockBase.java index 0c680279..6ded2185 100755 --- a/api/buildcraft/api/blueprints/SchematicBlockBase.java +++ b/api/buildcraft/api/blueprints/SchematicBlockBase.java @@ -34,13 +34,4 @@ package buildcraft.api.blueprints; */ public abstract class SchematicBlockBase extends Schematic { - /** - * Return true if the block should not be placed to the world. Requirements - * will not be asked on such a block, and building will not be called. - * Post processing will still be called on these blocks though. - */ - public boolean doNotBuild() { - return false; - } - } diff --git a/api/buildcraft/api/blueprints/SchematicEntity.java b/api/buildcraft/api/blueprints/SchematicEntity.java index f7d8896b..51a0de18 100755 --- a/api/buildcraft/api/blueprints/SchematicEntity.java +++ b/api/buildcraft/api/blueprints/SchematicEntity.java @@ -19,7 +19,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagDouble; import net.minecraft.nbt.NBTTagFloat; import net.minecraft.nbt.NBTTagList; + import net.minecraftforge.common.util.Constants; + import buildcraft.api.core.Position; public class SchematicEntity extends Schematic { @@ -36,7 +38,7 @@ public class SchematicEntity extends Schematic { public ItemStack[] storedRequirements = new ItemStack[0]; @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { for (ItemStack s : storedRequirements) { requirements.add(s); } diff --git a/api/buildcraft/api/blueprints/SchematicTile.java b/api/buildcraft/api/blueprints/SchematicTile.java index 842a2930..81af354b 100755 --- a/api/buildcraft/api/blueprints/SchematicTile.java +++ b/api/buildcraft/api/blueprints/SchematicTile.java @@ -58,15 +58,6 @@ public class SchematicTile extends SchematicBlock { } } - /** - * Initializes a slot from the blueprint according to an objet placed on {x, - * y, z} on the world. This typically means adding entries in slot.cpt. Note - * that "id" and "meta" will be set automatically, corresponding to the - * block id and meta. - * - * By default, if the block is a BlockContainer, tile information will be to - * save / load the block. - */ @Override public void readFromWorld(IBuilderContext context, int x, int y, int z) { super.readFromWorld(context, x, y, z); @@ -77,6 +68,15 @@ public class SchematicTile extends SchematicBlock { if (tile != null) { tile.writeToNBT(cpt); } + } + } + + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + super.readRequirementsFromWorld(context, x, y, z); + + if (block.hasTileEntity(meta)) { + TileEntity tile = context.world().getTileEntity(x, y, z); if (tile instanceof IInventory) { IInventory inv = (IInventory) tile; diff --git a/common/buildcraft/builders/schematics/SchematicBed.java b/common/buildcraft/builders/schematics/SchematicBed.java index c668bfee..1a8bad21 100644 --- a/common/buildcraft/builders/schematics/SchematicBed.java +++ b/common/buildcraft/builders/schematics/SchematicBed.java @@ -19,12 +19,17 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicBed extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { if ((meta & 8) == 0) { requirements.add(new ItemStack(Items.bed)); } } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void rotateLeft(IBuilderContext context) { int orientation = meta & 7; diff --git a/common/buildcraft/builders/schematics/SchematicCactus.java b/common/buildcraft/builders/schematics/SchematicCactus.java index f6f18f2e..39a9325d 100755 --- a/common/buildcraft/builders/schematics/SchematicCactus.java +++ b/common/buildcraft/builders/schematics/SchematicCactus.java @@ -19,10 +19,15 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicCactus extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Blocks.cactus)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, Blocks.cactus, 0, 3); diff --git a/common/buildcraft/builders/schematics/SchematicCustomStack.java b/common/buildcraft/builders/schematics/SchematicCustomStack.java index d2047194..4ec82ab4 100644 --- a/common/buildcraft/builders/schematics/SchematicCustomStack.java +++ b/common/buildcraft/builders/schematics/SchematicCustomStack.java @@ -24,8 +24,12 @@ public class SchematicCustomStack extends SchematicBlock { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(customStack.copy()); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } } diff --git a/common/buildcraft/builders/schematics/SchematicDirt.java b/common/buildcraft/builders/schematics/SchematicDirt.java index 98d75a34..86ac0033 100644 --- a/common/buildcraft/builders/schematics/SchematicDirt.java +++ b/common/buildcraft/builders/schematics/SchematicDirt.java @@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicDirt extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Blocks.dirt)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, Blocks.dirt, meta, 3); diff --git a/common/buildcraft/builders/schematics/SchematicDoor.java b/common/buildcraft/builders/schematics/SchematicDoor.java index 2e5527f3..8a7b53c8 100644 --- a/common/buildcraft/builders/schematics/SchematicDoor.java +++ b/common/buildcraft/builders/schematics/SchematicDoor.java @@ -28,12 +28,17 @@ public class SchematicDoor extends SchematicBlock { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { if ((meta & 8) == 0) { requirements.add(stack.copy()); } } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void rotateLeft(IBuilderContext context) { meta = rotateMeta(meta); diff --git a/common/buildcraft/builders/schematics/SchematicEnderChest.java b/common/buildcraft/builders/schematics/SchematicEnderChest.java index 8d260f21..82b5cdfd 100755 --- a/common/buildcraft/builders/schematics/SchematicEnderChest.java +++ b/common/buildcraft/builders/schematics/SchematicEnderChest.java @@ -13,6 +13,7 @@ import java.util.LinkedList; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; + import buildcraft.api.blueprints.IBuilderContext; public class SchematicEnderChest extends SchematicRotateMeta { @@ -22,11 +23,16 @@ public class SchematicEnderChest extends SchematicRotateMeta { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Blocks.obsidian, 8)); requirements.add(new ItemStack(Items.ender_eye, 1)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override 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/SchematicFarmland.java b/common/buildcraft/builders/schematics/SchematicFarmland.java index b8a9393c..5e8a61fb 100755 --- a/common/buildcraft/builders/schematics/SchematicFarmland.java +++ b/common/buildcraft/builders/schematics/SchematicFarmland.java @@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicFarmland extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Blocks.dirt)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, block, 0, 3); diff --git a/common/buildcraft/builders/schematics/SchematicFire.java b/common/buildcraft/builders/schematics/SchematicFire.java index 1ed2cdc4..023bb9e7 100755 --- a/common/buildcraft/builders/schematics/SchematicFire.java +++ b/common/buildcraft/builders/schematics/SchematicFire.java @@ -12,19 +12,19 @@ import java.util.LinkedList; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; + import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.SchematicBlock; public class SchematicFire extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack (Items.flint_and_steel)); } @Override - public void readFromWorld(IBuilderContext context, int x, int y, int z) { - // No specific data to read from the world. Cancels the initialization - // of the requirement list. + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading } } diff --git a/common/buildcraft/builders/schematics/SchematicFluid.java b/common/buildcraft/builders/schematics/SchematicFluid.java index 9bfcad6e..f569c279 100644 --- a/common/buildcraft/builders/schematics/SchematicFluid.java +++ b/common/buildcraft/builders/schematics/SchematicFluid.java @@ -26,12 +26,17 @@ public class SchematicFluid extends SchematicBlock { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { if (meta == 0) { requirements.add(bucketStack.copy()); } } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { if (meta == 0) { @@ -51,11 +56,6 @@ public class SchematicFluid extends SchematicBlock { return meta != 0; } - @Override - public void readFromWorld(IBuilderContext context, int x, int y, int z) { - // Cancel storage of requirements - } - @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { if (meta == 0) { diff --git a/common/buildcraft/builders/schematics/SchematicGravel.java b/common/buildcraft/builders/schematics/SchematicGravel.java index 7e9c8924..5c2f2617 100755 --- a/common/buildcraft/builders/schematics/SchematicGravel.java +++ b/common/buildcraft/builders/schematics/SchematicGravel.java @@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicGravel extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Blocks.gravel)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, Blocks.gravel, 0, 3); diff --git a/common/buildcraft/builders/schematics/SchematicIgnore.java b/common/buildcraft/builders/schematics/SchematicIgnore.java index 8d82f1d0..1109c2b7 100644 --- a/common/buildcraft/builders/schematics/SchematicIgnore.java +++ b/common/buildcraft/builders/schematics/SchematicIgnore.java @@ -18,7 +18,7 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicIgnore extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { } @@ -37,6 +37,11 @@ public class SchematicIgnore extends SchematicBlock { } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override public boolean doNotBuild() { return true; diff --git a/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java b/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java index b3014543..e7eb74ee 100644 --- a/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java +++ b/common/buildcraft/builders/schematics/SchematicIgnoreMeta.java @@ -11,16 +11,22 @@ package buildcraft.builders.schematics; import java.util.LinkedList; import net.minecraft.item.ItemStack; + import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.SchematicBlock; public class SchematicIgnoreMeta extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(block, 1, 0)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override 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/SchematicPortal.java b/common/buildcraft/builders/schematics/SchematicPortal.java index b61c4744..c19068b5 100755 --- a/common/buildcraft/builders/schematics/SchematicPortal.java +++ b/common/buildcraft/builders/schematics/SchematicPortal.java @@ -19,7 +19,12 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicPortal extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { + + } + + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { } diff --git a/common/buildcraft/builders/schematics/SchematicPumpkin.java b/common/buildcraft/builders/schematics/SchematicPumpkin.java index f5f06c18..8536a1a7 100644 --- a/common/buildcraft/builders/schematics/SchematicPumpkin.java +++ b/common/buildcraft/builders/schematics/SchematicPumpkin.java @@ -11,16 +11,22 @@ package buildcraft.builders.schematics; import java.util.LinkedList; import net.minecraft.item.ItemStack; + import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.SchematicBlock; public class SchematicPumpkin extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(block, 1, 0)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override 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/SchematicRedstoneDiode.java b/common/buildcraft/builders/schematics/SchematicRedstoneDiode.java index e0bf0e45..9d3ebdd1 100644 --- a/common/buildcraft/builders/schematics/SchematicRedstoneDiode.java +++ b/common/buildcraft/builders/schematics/SchematicRedstoneDiode.java @@ -19,10 +19,15 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicRedstoneDiode extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Items.repeater)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override public void rotateLeft(IBuilderContext context) { int step = meta - (meta & 3); diff --git a/common/buildcraft/builders/schematics/SchematicRedstoneWire.java b/common/buildcraft/builders/schematics/SchematicRedstoneWire.java index e4e9c416..6634e767 100755 --- a/common/buildcraft/builders/schematics/SchematicRedstoneWire.java +++ b/common/buildcraft/builders/schematics/SchematicRedstoneWire.java @@ -24,10 +24,15 @@ public class SchematicRedstoneWire extends SchematicBlock { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(customStack.copy()); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, block, 0, 3); diff --git a/common/buildcraft/builders/schematics/SchematicSeeds.java b/common/buildcraft/builders/schematics/SchematicSeeds.java index 83bf781d..936bc4c1 100755 --- a/common/buildcraft/builders/schematics/SchematicSeeds.java +++ b/common/buildcraft/builders/schematics/SchematicSeeds.java @@ -25,10 +25,15 @@ public class SchematicSeeds extends SchematicBlock { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(seeds)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, block, 0, 3); diff --git a/common/buildcraft/builders/schematics/SchematicSign.java b/common/buildcraft/builders/schematics/SchematicSign.java index 377d14cf..ef08744e 100644 --- a/common/buildcraft/builders/schematics/SchematicSign.java +++ b/common/buildcraft/builders/schematics/SchematicSign.java @@ -27,10 +27,15 @@ public class SchematicSign extends SchematicTile { } @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Items.sign)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + // cancel requirements reading + } + @Override public void rotateLeft(IBuilderContext context) { if (!isWall) { diff --git a/common/buildcraft/builders/schematics/SchematicStairs.java b/common/buildcraft/builders/schematics/SchematicStairs.java index 359a5a46..cdbbcd16 100644 --- a/common/buildcraft/builders/schematics/SchematicStairs.java +++ b/common/buildcraft/builders/schematics/SchematicStairs.java @@ -11,16 +11,22 @@ package buildcraft.builders.schematics; import java.util.LinkedList; import net.minecraft.item.ItemStack; + import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.SchematicBlock; public class SchematicStairs extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(block, 1, 0)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override 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 fbb80300..e4fb98c1 100755 --- a/common/buildcraft/builders/schematics/SchematicStone.java +++ b/common/buildcraft/builders/schematics/SchematicStone.java @@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock; public class SchematicStone extends SchematicBlock { @Override - public void addRequirements(IBuilderContext context, LinkedList requirements) { + public void writeRequirementsToBuilder(IBuilderContext context, LinkedList requirements) { requirements.add(new ItemStack(Blocks.stone)); } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + + } + @Override public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList stacks) { context.world().setBlock(x, y, z, Blocks.stone, 0, 3); diff --git a/common/buildcraft/core/blueprints/Blueprint.java b/common/buildcraft/core/blueprints/Blueprint.java index 425282f0..d845aea2 100644 --- a/common/buildcraft/core/blueprints/Blueprint.java +++ b/common/buildcraft/core/blueprints/Blueprint.java @@ -100,6 +100,7 @@ public class Blueprint extends BlueprintBase { try { slot.readFromWorld(context, x, y, z); + slot.readRequirementsFromWorld(context, x, y, z); contents[posX][posY][posZ] = slot; } catch (Throwable t) { // Defensive code against errors in implementers diff --git a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java index 748da573..2a1bbc1b 100644 --- a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java +++ b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java @@ -370,7 +370,11 @@ public class BptBuilderBlueprint extends BptBuilderBase { LinkedList tmpReq = new LinkedList(); try { - for (ItemStack stk : slot.getRequirements(context)) { + LinkedList req = new LinkedList(); + + slot.writeRequirementsToBuilder(context, req); + + for (ItemStack stk : req) { if (stk != null) { tmpReq.add(stk.copy()); } diff --git a/common/buildcraft/core/blueprints/BuildingSlotBlock.java b/common/buildcraft/core/blueprints/BuildingSlotBlock.java index d029a7a3..075ae3cf 100755 --- a/common/buildcraft/core/blueprints/BuildingSlotBlock.java +++ b/common/buildcraft/core/blueprints/BuildingSlotBlock.java @@ -14,7 +14,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; + import net.minecraftforge.common.util.Constants; + import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.MappingRegistry; import buildcraft.api.blueprints.SchematicBlockBase; @@ -83,7 +85,11 @@ public class BuildingSlotBlock extends BuildingSlot { if (mode == Mode.ClearIfInvalid) { return new LinkedList(); } else { - return getSchematic().getRequirements(context); + LinkedList req = new LinkedList(); + + getSchematic().writeRequirementsToBuilder(context, req); + + return req; } } diff --git a/common/buildcraft/transport/blueprints/SchematicPipe.java b/common/buildcraft/transport/blueprints/SchematicPipe.java index d6336622..384b7170 100644 --- a/common/buildcraft/transport/blueprints/SchematicPipe.java +++ b/common/buildcraft/transport/blueprints/SchematicPipe.java @@ -94,12 +94,6 @@ public class SchematicPipe extends SchematicTile { Pipe pipe = BlockGenericPipe.getPipe(context.world(), x, y, z); if (BlockGenericPipe.isValid(pipe)) { - ArrayList items = pipe.computeItemDrop(); - storedRequirements = new ItemStack [items.size() + 1]; - items.toArray(storedRequirements); - storedRequirements[storedRequirements.length - 1] = new ItemStack( - pipe.item); - tile.writeToNBT(cpt); // This overrides the default pipeId @@ -125,6 +119,20 @@ public class SchematicPipe extends SchematicTile { } } + @Override + public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) { + TileEntity tile = context.world().getTileEntity(x, y, z); + Pipe pipe = BlockGenericPipe.getPipe(context.world(), x, y, z); + + if (BlockGenericPipe.isValid(pipe)) { + ArrayList items = pipe.computeItemDrop(); + storedRequirements = new ItemStack[items.size() + 1]; + items.toArray(storedRequirements); + storedRequirements[storedRequirements.length - 1] = new ItemStack( + pipe.item); + } + } + @Override public void postProcessing(IBuilderContext context, int x, int y, int z) { Item pipeItem = context.getMappingRegistry().getItemForId(cpt.getInteger("pipeId"));