requirements extraction is now cleaner

This commit is contained in:
SpaceToad 2014-05-04 18:25:28 +02:00
parent decc8ccf10
commit aca1678591
29 changed files with 224 additions and 127 deletions

View file

@ -77,22 +77,13 @@ public abstract class Schematic {
return true; return true;
} }
public final LinkedList<ItemStack> getRequirements(IBuilderContext context) {
LinkedList<ItemStack> res = new LinkedList<ItemStack>();
addRequirements(context, res);
return res;
}
/** /**
* Returns the requirements needed to build this block. When the * Return true if the block should not be placed to the world. Requirements
* requirements are met, they will be removed all at once from the builder, * will not be asked on such a block, and building will not be called. Post
* before calling buildBlock. * processing will still be called on these blocks though.
*/ */
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> 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<ItemStack> requirements) {
}
public void writeToNBT(NBTTagCompound nbt, MappingRegistry registry) { public void writeToNBT(NBTTagCompound nbt, MappingRegistry registry) {
} }

View file

@ -26,6 +26,7 @@ public class SchematicBlock extends SchematicBlockBase {
public Block block = null; public Block block = null;
public int meta = 0; public int meta = 0;
public BuildingPermission defaultPermission = BuildingPermission.ALL;
/** /**
* This field contains requirements for a given block when stored in the * 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]; 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 @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
if (block != null) { if (block != null) {
if (storedRequirements.length != 0) { if (storedRequirements.length != 0) {
for (ItemStack s : storedRequirements) { 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 @Override
public boolean isAlreadyBuilt(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) && meta == context.world().getBlockMetadata(x, y, 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 @Override
public void rotateLeft(IBuilderContext context) { public void rotateLeft(IBuilderContext context) {
} }
/**
* Places the block in the world, at the location specified in the slot.
*/
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
// Meta needs to be specified twice, depending on the block behavior // 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); 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 @Override
public boolean doNotBuild() { public boolean doNotBuild() {
return false; 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 @Override
public void readFromWorld(IBuilderContext context, int x, int y, int z) { 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) { if (block != null) {
ArrayList<ItemStack> req = block.getDrops(context.world(), x, ArrayList<ItemStack> req = block.getDrops(context.world(), x,
y, z, context.world().getBlockMetadata(x, y, z), 0); 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("blockId", registry.getIdForBlock(block));
nbt.setInteger("blockMeta", meta); nbt.setInteger("blockMeta", meta);
NBTTagList rq = new NBTTagList(); if (storedRequirements.length > 0) {
NBTTagList rq = new NBTTagList();
for (ItemStack stack : storedRequirements) { for (ItemStack stack : storedRequirements) {
NBTTagCompound sub = new NBTTagCompound(); NBTTagCompound sub = new NBTTagCompound();
stack.writeToNBT(stack.writeToNBT(sub)); stack.writeToNBT(stack.writeToNBT(sub));
sub.setInteger("id", registry.getIdForItem(stack.getItem())); sub.setInteger("id", registry.getIdForItem(stack.getItem()));
rq.appendTag(sub); rq.appendTag(sub);
}
nbt.setTag("rq", rq);
} }
nbt.setTag("rq", rq);
} }
@Override @Override
@ -133,33 +114,35 @@ public class SchematicBlock extends SchematicBlockBase {
block = registry.getBlockForId(nbt.getInteger("blockId")); block = registry.getBlockForId(nbt.getInteger("blockId"));
meta = nbt.getInteger("blockMeta"); 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<ItemStack> rqs = new ArrayList<ItemStack>(); ArrayList<ItemStack> rqs = new ArrayList<ItemStack>();
for (int i = 0; i < rq.tagCount(); ++i) { for (int i = 0; i < rq.tagCount(); ++i) {
try { try {
NBTTagCompound sub = rq.getCompoundTagAt(i); NBTTagCompound sub = rq.getCompoundTagAt(i);
if (sub.getInteger("id") >= 0) { if (sub.getInteger("id") >= 0) {
// Maps the id in the blueprint to the id in the world // Maps the id in the blueprint to the id in the world
sub.setInteger("id", Item.itemRegistry sub.setInteger("id", Item.itemRegistry
.getIDForObject(registry.getItemForId(sub .getIDForObject(registry.getItemForId(sub
.getInteger("id")))); .getInteger("id"))));
rqs.add(ItemStack.loadItemStackFromNBT(sub)); rqs.add(ItemStack.loadItemStackFromNBT(sub));
} else { } else {
// TODO: requirement can't be retreived, this blueprint is defaultPermission = BuildingPermission.CREATIVE_ONLY;
// only useable in creative }
} 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 @Override
@ -174,4 +157,9 @@ public class SchematicBlock extends SchematicBlockBase {
return BuildingStage.SUPPORTED; return BuildingStage.SUPPORTED;
} }
} }
@Override
public BuildingPermission getBuildingPermission() {
return defaultPermission;
}
} }

View file

@ -34,13 +34,4 @@ package buildcraft.api.blueprints;
*/ */
public abstract class SchematicBlockBase extends Schematic { 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;
}
} }

View file

@ -19,7 +19,9 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagDouble; import net.minecraft.nbt.NBTTagDouble;
import net.minecraft.nbt.NBTTagFloat; import net.minecraft.nbt.NBTTagFloat;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import buildcraft.api.core.Position; import buildcraft.api.core.Position;
public class SchematicEntity extends Schematic { public class SchematicEntity extends Schematic {
@ -36,7 +38,7 @@ public class SchematicEntity extends Schematic {
public ItemStack[] storedRequirements = new ItemStack[0]; public ItemStack[] storedRequirements = new ItemStack[0];
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
for (ItemStack s : storedRequirements) { for (ItemStack s : storedRequirements) {
requirements.add(s); requirements.add(s);
} }

View file

@ -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 @Override
public void readFromWorld(IBuilderContext context, int x, int y, int z) { public void readFromWorld(IBuilderContext context, int x, int y, int z) {
super.readFromWorld(context, x, y, z); super.readFromWorld(context, x, y, z);
@ -77,6 +68,15 @@ public class SchematicTile extends SchematicBlock {
if (tile != null) { if (tile != null) {
tile.writeToNBT(cpt); 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) { if (tile instanceof IInventory) {
IInventory inv = (IInventory) tile; IInventory inv = (IInventory) tile;

View file

@ -19,12 +19,17 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicBed extends SchematicBlock { public class SchematicBed extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
if ((meta & 8) == 0) { if ((meta & 8) == 0) {
requirements.add(new ItemStack(Items.bed)); requirements.add(new ItemStack(Items.bed));
} }
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void rotateLeft(IBuilderContext context) { public void rotateLeft(IBuilderContext context) {
int orientation = meta & 7; int orientation = meta & 7;

View file

@ -19,10 +19,15 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicCactus extends SchematicBlock { public class SchematicCactus extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Blocks.cactus)); requirements.add(new ItemStack(Blocks.cactus));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, Blocks.cactus, 0, 3); context.world().setBlock(x, y, z, Blocks.cactus, 0, 3);

View file

@ -24,8 +24,12 @@ public class SchematicCustomStack extends SchematicBlock {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(customStack.copy()); requirements.add(customStack.copy());
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
} }

View file

@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicDirt extends SchematicBlock { public class SchematicDirt extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Blocks.dirt)); requirements.add(new ItemStack(Blocks.dirt));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, Blocks.dirt, meta, 3); context.world().setBlock(x, y, z, Blocks.dirt, meta, 3);

View file

@ -28,12 +28,17 @@ public class SchematicDoor extends SchematicBlock {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
if ((meta & 8) == 0) { if ((meta & 8) == 0) {
requirements.add(stack.copy()); requirements.add(stack.copy());
} }
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void rotateLeft(IBuilderContext context) { public void rotateLeft(IBuilderContext context) {
meta = rotateMeta(meta); meta = rotateMeta(meta);

View file

@ -13,6 +13,7 @@ import java.util.LinkedList;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.init.Items; import net.minecraft.init.Items;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
public class SchematicEnderChest extends SchematicRotateMeta { public class SchematicEnderChest extends SchematicRotateMeta {
@ -22,11 +23,16 @@ public class SchematicEnderChest extends SchematicRotateMeta {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Blocks.obsidian, 8)); requirements.add(new ItemStack(Blocks.obsidian, 8));
requirements.add(new ItemStack(Items.ender_eye, 1)); requirements.add(new ItemStack(Items.ender_eye, 1));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public boolean isAlreadyBuilt(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); return block == context.world().getBlock(x, y, z);

View file

@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicFarmland extends SchematicBlock { public class SchematicFarmland extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Blocks.dirt)); requirements.add(new ItemStack(Blocks.dirt));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, block, 0, 3); context.world().setBlock(x, y, z, block, 0, 3);

View file

@ -12,19 +12,19 @@ import java.util.LinkedList;
import net.minecraft.init.Items; import net.minecraft.init.Items;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.SchematicBlock; import buildcraft.api.blueprints.SchematicBlock;
public class SchematicFire extends SchematicBlock { public class SchematicFire extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack (Items.flint_and_steel)); requirements.add(new ItemStack (Items.flint_and_steel));
} }
@Override @Override
public void readFromWorld(IBuilderContext context, int x, int y, int z) { public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// No specific data to read from the world. Cancels the initialization // cancel requirements reading
// of the requirement list.
} }
} }

View file

@ -26,12 +26,17 @@ public class SchematicFluid extends SchematicBlock {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
if (meta == 0) { if (meta == 0) {
requirements.add(bucketStack.copy()); requirements.add(bucketStack.copy());
} }
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) { public boolean isAlreadyBuilt(IBuilderContext context, int x, int y, int z) {
if (meta == 0) { if (meta == 0) {
@ -51,11 +56,6 @@ public class SchematicFluid extends SchematicBlock {
return meta != 0; return meta != 0;
} }
@Override
public void readFromWorld(IBuilderContext context, int x, int y, int z) {
// Cancel storage of requirements
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
if (meta == 0) { if (meta == 0) {

View file

@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicGravel extends SchematicBlock { public class SchematicGravel extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Blocks.gravel)); requirements.add(new ItemStack(Blocks.gravel));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, Blocks.gravel, 0, 3); context.world().setBlock(x, y, z, Blocks.gravel, 0, 3);

View file

@ -18,7 +18,7 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicIgnore extends SchematicBlock { public class SchematicIgnore extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
} }
@ -37,6 +37,11 @@ public class SchematicIgnore extends SchematicBlock {
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public boolean doNotBuild() { public boolean doNotBuild() {
return true; return true;

View file

@ -11,16 +11,22 @@ package buildcraft.builders.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.SchematicBlock; import buildcraft.api.blueprints.SchematicBlock;
public class SchematicIgnoreMeta extends SchematicBlock { public class SchematicIgnoreMeta extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(block, 1, 0)); requirements.add(new ItemStack(block, 1, 0));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public boolean isAlreadyBuilt(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); return block == context.world().getBlock(x, y, z);

View file

@ -19,7 +19,12 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicPortal extends SchematicBlock { public class SchematicPortal extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
}
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
} }

View file

@ -11,16 +11,22 @@ package buildcraft.builders.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.SchematicBlock; import buildcraft.api.blueprints.SchematicBlock;
public class SchematicPumpkin extends SchematicBlock { public class SchematicPumpkin extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(block, 1, 0)); requirements.add(new ItemStack(block, 1, 0));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public boolean isAlreadyBuilt(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); return block == context.world().getBlock(x, y, z);

View file

@ -19,10 +19,15 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicRedstoneDiode extends SchematicBlock { public class SchematicRedstoneDiode extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Items.repeater)); requirements.add(new ItemStack(Items.repeater));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public void rotateLeft(IBuilderContext context) { public void rotateLeft(IBuilderContext context) {
int step = meta - (meta & 3); int step = meta - (meta & 3);

View file

@ -24,10 +24,15 @@ public class SchematicRedstoneWire extends SchematicBlock {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(customStack.copy()); requirements.add(customStack.copy());
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, block, 0, 3); context.world().setBlock(x, y, z, block, 0, 3);

View file

@ -25,10 +25,15 @@ public class SchematicSeeds extends SchematicBlock {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(seeds)); requirements.add(new ItemStack(seeds));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, block, 0, 3); context.world().setBlock(x, y, z, block, 0, 3);

View file

@ -27,10 +27,15 @@ public class SchematicSign extends SchematicTile {
} }
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Items.sign)); requirements.add(new ItemStack(Items.sign));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
// cancel requirements reading
}
@Override @Override
public void rotateLeft(IBuilderContext context) { public void rotateLeft(IBuilderContext context) {
if (!isWall) { if (!isWall) {

View file

@ -11,16 +11,22 @@ package buildcraft.builders.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.SchematicBlock; import buildcraft.api.blueprints.SchematicBlock;
public class SchematicStairs extends SchematicBlock { public class SchematicStairs extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(block, 1, 0)); requirements.add(new ItemStack(block, 1, 0));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public boolean isAlreadyBuilt(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); return block == context.world().getBlock(x, y, z);

View file

@ -20,10 +20,15 @@ import buildcraft.api.blueprints.SchematicBlock;
public class SchematicStone extends SchematicBlock { public class SchematicStone extends SchematicBlock {
@Override @Override
public void addRequirements(IBuilderContext context, LinkedList<ItemStack> requirements) { public void writeRequirementsToBuilder(IBuilderContext context, LinkedList<ItemStack> requirements) {
requirements.add(new ItemStack(Blocks.stone)); requirements.add(new ItemStack(Blocks.stone));
} }
@Override
public void readRequirementsFromWorld(IBuilderContext context, int x, int y, int z) {
}
@Override @Override
public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) { public void writeToWorld(IBuilderContext context, int x, int y, int z, LinkedList<ItemStack> stacks) {
context.world().setBlock(x, y, z, Blocks.stone, 0, 3); context.world().setBlock(x, y, z, Blocks.stone, 0, 3);

View file

@ -100,6 +100,7 @@ public class Blueprint extends BlueprintBase {
try { try {
slot.readFromWorld(context, x, y, z); slot.readFromWorld(context, x, y, z);
slot.readRequirementsFromWorld(context, x, y, z);
contents[posX][posY][posZ] = slot; contents[posX][posY][posZ] = slot;
} catch (Throwable t) { } catch (Throwable t) {
// Defensive code against errors in implementers // Defensive code against errors in implementers

View file

@ -370,7 +370,11 @@ public class BptBuilderBlueprint extends BptBuilderBase {
LinkedList<ItemStack> tmpReq = new LinkedList<ItemStack>(); LinkedList<ItemStack> tmpReq = new LinkedList<ItemStack>();
try { try {
for (ItemStack stk : slot.getRequirements(context)) { LinkedList<ItemStack> req = new LinkedList<ItemStack>();
slot.writeRequirementsToBuilder(context, req);
for (ItemStack stk : req) {
if (stk != null) { if (stk != null) {
tmpReq.add(stk.copy()); tmpReq.add(stk.copy());
} }

View file

@ -14,7 +14,9 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.MappingRegistry; import buildcraft.api.blueprints.MappingRegistry;
import buildcraft.api.blueprints.SchematicBlockBase; import buildcraft.api.blueprints.SchematicBlockBase;
@ -83,7 +85,11 @@ public class BuildingSlotBlock extends BuildingSlot {
if (mode == Mode.ClearIfInvalid) { if (mode == Mode.ClearIfInvalid) {
return new LinkedList<ItemStack>(); return new LinkedList<ItemStack>();
} else { } else {
return getSchematic().getRequirements(context); LinkedList<ItemStack> req = new LinkedList<ItemStack>();
getSchematic().writeRequirementsToBuilder(context, req);
return req;
} }
} }

View file

@ -94,12 +94,6 @@ public class SchematicPipe extends SchematicTile {
Pipe pipe = BlockGenericPipe.getPipe(context.world(), x, y, z); Pipe pipe = BlockGenericPipe.getPipe(context.world(), x, y, z);
if (BlockGenericPipe.isValid(pipe)) { if (BlockGenericPipe.isValid(pipe)) {
ArrayList<ItemStack> items = pipe.computeItemDrop();
storedRequirements = new ItemStack [items.size() + 1];
items.toArray(storedRequirements);
storedRequirements[storedRequirements.length - 1] = new ItemStack(
pipe.item);
tile.writeToNBT(cpt); tile.writeToNBT(cpt);
// This overrides the default pipeId // 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<ItemStack> items = pipe.computeItemDrop();
storedRequirements = new ItemStack[items.size() + 1];
items.toArray(storedRequirements);
storedRequirements[storedRequirements.length - 1] = new ItemStack(
pipe.item);
}
}
@Override @Override
public void postProcessing(IBuilderContext context, int x, int y, int z) { public void postProcessing(IBuilderContext context, int x, int y, int z) {
Item pipeItem = context.getMappingRegistry().getItemForId(cpt.getInteger("pipeId")); Item pipeItem = context.getMappingRegistry().getItemForId(cpt.getInteger("pipeId"));