Optimized blueprint memory footprint, for #1484

Air block generate null schematics
x, y, z are not recorded in the schematic anymore
This commit is contained in:
SpaceToad 2014-03-09 10:48:55 +01:00
parent d38ab99d89
commit add526d8f9
26 changed files with 170 additions and 132 deletions

View file

@ -12,6 +12,7 @@ import java.lang.reflect.InvocationTargetException;
import java.util.HashMap; import java.util.HashMap;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
public class BlueprintManager { public class BlueprintManager {
@ -32,6 +33,10 @@ public class BlueprintManager {
} }
public static Schematic newSchematic (Block block) { public static Schematic newSchematic (Block block) {
if (block == Blocks.air) {
return null;
}
if (!schematicClasses.containsKey(block)) { if (!schematicClasses.containsKey(block)) {
registerSchematicClass(block, Schematic.class); registerSchematicClass(block, Schematic.class);
} }

View file

@ -47,7 +47,7 @@ import buildcraft.core.utils.Utils;
public class Schematic { public class Schematic {
public Block block = null; public Block block = null;
public int x, y, z, meta = 0; public int meta = 0;
/** /**
* This field contains requirements for a given block when stored in the * This field contains requirements for a given block when stored in the
@ -64,25 +64,15 @@ public class Schematic {
*/ */
public NBTTagCompound cpt = new NBTTagCompound(); public NBTTagCompound cpt = new NBTTagCompound();
public enum Mode {
ClearIfInvalid, Build
};
public Mode mode = Mode.Build;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public Schematic clone() { public Schematic clone() {
Schematic obj = BlueprintManager.newSchematic(block); Schematic obj = BlueprintManager.newSchematic(block);
obj.x = x;
obj.y = y;
obj.z = z;
obj.block = block; obj.block = block;
obj.meta = meta; obj.meta = meta;
obj.cpt = (NBTTagCompound) cpt.copy(); obj.cpt = (NBTTagCompound) cpt.copy();
obj.storedRequirements = (ArrayList<ItemStack>) storedRequirements.clone(); obj.storedRequirements = (ArrayList<ItemStack>) storedRequirements.clone();
obj.mode = mode;
return obj; return obj;
} }
@ -166,7 +156,7 @@ public class Schematic {
* the blueprint at the location given by the slot. By default, this * the blueprint at the location given by the slot. By default, this
* subprogram is permissive and doesn't take into account metadata. * subprogram is permissive and doesn't take into account metadata.
*/ */
public boolean isValid(IBuilderContext context) { public boolean isValid(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);
} }
@ -180,7 +170,7 @@ public class Schematic {
/** /**
* Places the block in the world, at the location specified in the slot. * Places the block in the world, at the location specified in the slot.
*/ */
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
// Meta needs to be specified twice, depending on the block behavior // Meta needs to be specified twice, depending on the block behavior
context.world().setBlock(x, y, z, block, meta, 3); context.world().setBlock(x, y, z, block, meta, 3);
context.world().setBlockMetadataWithNotify(x, y, z, meta, 3); context.world().setBlockMetadataWithNotify(x, y, z, meta, 3);

View file

@ -0,0 +1,23 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* 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
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.api.blueprints;
public class SchematicToBuild {
public int x, y, z;
public Schematic schematic;
public enum Mode {
ClearIfInvalid, Build
};
public Mode mode = Mode.Build;
}

View file

@ -12,8 +12,8 @@ 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.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicBed extends Schematic { public class SchematicBed extends Schematic {
@ -46,7 +46,7 @@ public class SchematicBed extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
if ((meta & 8) != 0) { if ((meta & 8) != 0) {
return; return;
} }

View file

@ -13,8 +13,8 @@ import java.util.LinkedList;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicDirt extends Schematic { public class SchematicDirt extends Schematic {
@ -24,12 +24,12 @@ public class SchematicDirt extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
context.world().setBlock(x, y, z, Blocks.dirt, meta, 3); context.world().setBlock(x, y, z, Blocks.dirt, meta, 3);
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(IBuilderContext context, int x, int y, int z) {
Block block = context.world().getBlock(x, y, z); Block block = context.world().getBlock(x, y, z);
return block == Blocks.dirt || block == Blocks.grass || block == Blocks.farmland; return block == Blocks.dirt || block == Blocks.grass || block == Blocks.farmland;

View file

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicDoor extends Schematic { public class SchematicDoor extends Schematic {
@ -56,7 +56,7 @@ public class SchematicDoor extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
context.world().setBlock(x, y, z, block, meta, 3); context.world().setBlock(x, y, z, block, meta, 3);
context.world().setBlock(x, y + 1, z, block, meta + 8, 3); context.world().setBlock(x, y + 1, z, block, meta + 8, 3);

View file

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicFluid extends Schematic { public class SchematicFluid extends Schematic {
@ -30,7 +30,7 @@ public class SchematicFluid extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(IBuilderContext context, int x, int y, int z) {
if (meta == 0) { if (meta == 0) {
return block == context.world().getBlock(x, y, z) && context.world().getBlockMetadata(x, y, z) == 0; return block == context.world().getBlock(x, y, z) && context.world().getBlockMetadata(x, y, z) == 0;
} else { } else {
@ -49,7 +49,7 @@ public class SchematicFluid extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
if (meta == 0) { if (meta == 0) {
context.world().setBlock(x, y, z, block, 0,1); context.world().setBlock(x, y, z, block, 0,1);
} }

View file

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicIgnore extends Schematic { public class SchematicIgnore extends Schematic {
@ -22,7 +22,7 @@ public class SchematicIgnore extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(IBuilderContext context, int x, int y, int z) {
return true; return true;
} }

View file

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicIgnoreMeta extends Schematic { public class SchematicIgnoreMeta extends Schematic {
@ -22,7 +22,7 @@ public class SchematicIgnoreMeta extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(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

@ -9,14 +9,14 @@
package buildcraft.api.schematics; package buildcraft.api.schematics;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicInventory extends Schematic { public class SchematicInventory extends Schematic {
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
super.writeToWorld(context); super.writeToWorld(context, x, y, z);
IInventory inv = (IInventory) context.world().getTileEntity(x, y, z); IInventory inv = (IInventory) context.world().getTileEntity(x, y, z);

View file

@ -17,7 +17,7 @@ public class SchematicPiston extends SchematicRotateMeta {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
int localMeta = meta & 7; int localMeta = meta & 7;
context.world().setBlock(x, y, z, block, localMeta, 3); context.world().setBlock(x, y, z, block, localMeta, 3);

View file

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicPumpkin extends Schematic { public class SchematicPumpkin extends Schematic {
@ -22,7 +22,7 @@ public class SchematicPumpkin extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(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,8 +19,8 @@ public class SchematicRotateInventory extends SchematicRotateMeta {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
super.writeToWorld(context); super.writeToWorld(context, x, y, z);
IInventory inv = (IInventory) context.world().getTileEntity(x, y, z); IInventory inv = (IInventory) context.world().getTileEntity(x, y, z);

View file

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicRotateMeta extends Schematic { public class SchematicRotateMeta extends Schematic {
@ -43,7 +43,7 @@ public class SchematicRotateMeta extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(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

@ -11,8 +11,8 @@ package buildcraft.api.schematics;
import java.util.LinkedList; import java.util.LinkedList;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicStairs extends Schematic { public class SchematicStairs extends Schematic {
@ -22,7 +22,7 @@ public class SchematicStairs extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(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,7 +20,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftBuilders; import buildcraft.BuildCraftBuilders;
import buildcraft.api.blueprints.Schematic; import buildcraft.api.blueprints.SchematicToBuild;
import buildcraft.api.gates.IAction; import buildcraft.api.gates.IAction;
import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.IPowerReceptor;
import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler;
@ -637,10 +637,11 @@ public class TileBuilder extends TileBuildCraft implements IBuilderInventory,
public void debugForceBlueprintCompletion () { public void debugForceBlueprintCompletion () {
if (bluePrintBuilder != null) { if (bluePrintBuilder != null) {
Schematic slot = bluePrintBuilder.getNextBlock(worldObj, this); SchematicToBuild slot = bluePrintBuilder.getNextBlock(worldObj, this);
if (slot != null) { if (slot != null) {
slot.writeToWorld(bluePrintBuilder.context); slot.schematic.writeToWorld(bluePrintBuilder.context, slot.x,
slot.y, slot.z);
} }
} }
} }

View file

@ -14,8 +14,8 @@ 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 buildcraft.api.blueprints.BlueprintManager; import buildcraft.api.blueprints.BlueprintManager;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
import buildcraft.core.utils.BCLog; import buildcraft.core.utils.BCLog;
import buildcraft.core.utils.Utils; import buildcraft.core.utils.Utils;
@ -33,9 +33,14 @@ public class Blueprint extends BlueprintBase {
Schematic slot = BlueprintManager.newSchematic(block); Schematic slot = BlueprintManager.newSchematic(block);
slot.x = (int) (x - context.surroundingBox().pMin().x); if (slot == null) {
slot.y = (int) (y - context.surroundingBox().pMin().y); return;
slot.z = (int) (z - context.surroundingBox().pMin().z); }
int posX = (int) (x - context.surroundingBox().pMin().x);
int posY = (int) (y - context.surroundingBox().pMin().y);
int posZ = (int) (z - context.surroundingBox().pMin().z);
slot.block = block; slot.block = block;
slot.meta = anchorTile.getWorldObj().getBlockMetadata(x, y, z); slot.meta = anchorTile.getWorldObj().getBlockMetadata(x, y, z);
@ -45,7 +50,7 @@ public class Blueprint extends BlueprintBase {
try { try {
slot.readFromWorld(context, x, y, z); slot.readFromWorld(context, x, y, z);
contents[slot.x][slot.y][slot.z] = slot; contents[posX][posY][posZ] = slot;
} catch (Throwable t) { } catch (Throwable t) {
// Defensive code against errors in implementers // Defensive code against errors in implementers
t.printStackTrace(); t.printStackTrace();
@ -62,7 +67,11 @@ public class Blueprint extends BlueprintBase {
for (int y = 0; y < sizeY; ++y) { for (int y = 0; y < sizeY; ++y) {
for (int z = 0; z < sizeZ; ++z) { for (int z = 0; z < sizeZ; ++z) {
NBTTagCompound cpt = new NBTTagCompound(); NBTTagCompound cpt = new NBTTagCompound();
contents[x][y][z].writeToNBT(cpt, mapping);
if (contents [x][y][z] != null) {
contents[x][y][z].writeToNBT(cpt, mapping);
}
nbtContents.appendTag(cpt); nbtContents.appendTag(cpt);
} }
} }
@ -90,10 +99,14 @@ public class Blueprint extends BlueprintBase {
NBTTagCompound cpt = nbtContents.getCompoundTagAt(index); NBTTagCompound cpt = nbtContents.getCompoundTagAt(index);
index++; index++;
int blockId = cpt.getInteger("blockId"); if (cpt.hasKey("blockId")) {
int blockId = cpt.getInteger("blockId");
contents[x][y][z] = BlueprintManager.newSchematic(mapping.getBlockForId(blockId)); contents[x][y][z] = BlueprintManager.newSchematic(mapping.getBlockForId(blockId));
contents[x][y][z].readFromNBT(cpt, mapping); contents[x][y][z].readFromNBT(cpt, mapping);
} else {
contents[x][y][z] = null;
}
} }
} }
} }

View file

@ -52,9 +52,6 @@ public abstract class BlueprintBase {
public void setBlock(int x, int y, int z, Block block) { public void setBlock(int x, int y, int z, Block block) {
if (contents[x][y][z] == null) { if (contents[x][y][z] == null) {
contents[x][y][z] = BlueprintManager.newSchematic(block); contents[x][y][z] = BlueprintManager.newSchematic(block);
contents[x][y][z].x = x;
contents[x][y][z].y = y;
contents[x][y][z].z = z;
} }
contents[x][y][z].block = block; contents[x][y][z].block = block;

View file

@ -10,7 +10,7 @@ package buildcraft.core.blueprints;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World; import net.minecraft.world.World;
import buildcraft.api.blueprints.Schematic; import buildcraft.api.blueprints.SchematicToBuild;
import buildcraft.api.core.IAreaProvider; import buildcraft.api.core.IAreaProvider;
import buildcraft.core.Box; import buildcraft.core.Box;
import buildcraft.core.IBuilderInventory; import buildcraft.core.IBuilderInventory;
@ -35,7 +35,7 @@ public abstract class BptBuilderBase implements IAreaProvider {
context = bluePrint.getContext(world, box); context = bluePrint.getContext(world, box);
} }
public abstract Schematic getNextBlock(World world, IBuilderInventory inv); public abstract SchematicToBuild getNextBlock(World world, IBuilderInventory inv);
@Override @Override
public int xMin() { public int xMin() {

View file

@ -15,11 +15,13 @@ import java.util.LinkedList;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Map.Entry; import java.util.Map.Entry;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldSettings.GameType; import net.minecraft.world.WorldSettings.GameType;
import buildcraft.api.blueprints.Schematic; import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.Schematic.Mode; import buildcraft.api.blueprints.SchematicToBuild;
import buildcraft.api.blueprints.SchematicToBuild.Mode;
import buildcraft.api.core.StackKey; import buildcraft.api.core.StackKey;
import buildcraft.core.IBuilderInventory; import buildcraft.core.IBuilderInventory;
import buildcraft.core.utils.BCLog; import buildcraft.core.utils.BCLog;
@ -27,11 +29,11 @@ import buildcraft.core.utils.BlockUtil;
public class BptBuilderBlueprint extends BptBuilderBase { public class BptBuilderBlueprint extends BptBuilderBase {
LinkedList<Schematic> clearList = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> clearList = new LinkedList<SchematicToBuild>();
LinkedList<Schematic> primaryList = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> primaryList = new LinkedList<SchematicToBuild>();
LinkedList<Schematic> secondaryList = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> secondaryList = new LinkedList<SchematicToBuild>();
LinkedList<Schematic> postProcessingList = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> postProcessingList = new LinkedList<SchematicToBuild>();
public LinkedList <ItemStack> neededItems = new LinkedList <ItemStack> (); public LinkedList <ItemStack> neededItems = new LinkedList <ItemStack> ();
@ -47,21 +49,20 @@ public class BptBuilderBlueprint extends BptBuilderBase {
Schematic slot = bluePrint.contents[i][j][k]; Schematic slot = bluePrint.contents[i][j][k];
if (slot != null) { if (slot == null) {
slot = slot.clone();
} else {
slot = new Schematic(); slot = new Schematic();
slot.meta = 0; slot.meta = 0;
slot.block = null; slot.block = Blocks.air;
} }
slot.x = xCoord; SchematicToBuild b = new SchematicToBuild ();
slot.y = yCoord; b.schematic = slot;
slot.z = zCoord; b.x = xCoord;
b.y = yCoord;
b.z = zCoord;
b.mode = Mode.ClearIfInvalid;
slot.mode = Mode.ClearIfInvalid; clearList.add(b);
clearList.add(slot);
} }
} }
@ -76,28 +77,27 @@ public class BptBuilderBlueprint extends BptBuilderBase {
Schematic slot = bluePrint.contents[i][j][k]; Schematic slot = bluePrint.contents[i][j][k];
if (slot != null) { if (slot == null) {
slot = slot.clone();
} else {
slot = new Schematic(); slot = new Schematic();
slot.meta = 0; slot.meta = 0;
slot.block = null; slot.block = Blocks.air;
} }
slot.x = xCoord; SchematicToBuild b = new SchematicToBuild ();
slot.y = yCoord; b.schematic = slot;
slot.z = zCoord; b.x = xCoord;
b.y = yCoord;
slot.mode = Mode.Build; b.z = zCoord;
b.mode = Mode.Build;
if (slot.block != null && slot.block.isOpaqueCube()) { if (slot.block != null && slot.block.isOpaqueCube()) {
primaryList.add(slot); primaryList.add(b);
} else { } else {
secondaryList.add(slot); secondaryList.add(b);
} }
if (slot.block != null) { if (slot.block != null) {
postProcessingList.add(slot.clone()); postProcessingList.add(b);
} }
} }
} }
@ -117,9 +117,9 @@ public class BptBuilderBlueprint extends BptBuilderBase {
} }
@Override @Override
public Schematic getNextBlock(World world, IBuilderInventory inv) { public SchematicToBuild getNextBlock(World world, IBuilderInventory inv) {
if (clearList.size() != 0) { if (clearList.size() != 0) {
Schematic slot = internalGetNextBlock(world, inv, clearList); SchematicToBuild slot = internalGetNextBlock(world, inv, clearList);
checkDone(); checkDone();
if (slot != null) { if (slot != null) {
@ -128,7 +128,7 @@ public class BptBuilderBlueprint extends BptBuilderBase {
} }
if (primaryList.size() != 0) { if (primaryList.size() != 0) {
Schematic slot = internalGetNextBlock(world, inv, primaryList); SchematicToBuild slot = internalGetNextBlock(world, inv, primaryList);
checkDone(); checkDone();
if (slot != null) { if (slot != null) {
@ -137,7 +137,7 @@ public class BptBuilderBlueprint extends BptBuilderBase {
} }
if (secondaryList.size() != 0) { if (secondaryList.size() != 0) {
Schematic slot = internalGetNextBlock(world, inv, secondaryList); SchematicToBuild slot = internalGetNextBlock(world, inv, secondaryList);
checkDone(); checkDone();
if (slot != null) { if (slot != null) {
@ -150,18 +150,19 @@ public class BptBuilderBlueprint extends BptBuilderBase {
return null; return null;
} }
public Schematic internalGetNextBlock(World world, IBuilderInventory inv, LinkedList<Schematic> list) { public SchematicToBuild internalGetNextBlock(World world, IBuilderInventory inv, LinkedList<SchematicToBuild> list) {
LinkedList<Schematic> failSlots = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> failSlots = new LinkedList<SchematicToBuild>();
Schematic result = null; SchematicToBuild result = null;
while (list.size() > 0) { while (list.size() > 0) {
Schematic slot = list.removeFirst(); SchematicToBuild slot = list.removeFirst();
boolean getNext = false; boolean getNext = false;
try { try {
getNext = !slot.isValid(context) && !slot.ignoreBuilding(); getNext = !slot.schematic.isValid(context, slot.x, slot.y,
slot.z) && !slot.schematic.ignoreBuilding();
} catch (Throwable t) { } catch (Throwable t) {
// Defensive code against errors in implementers // Defensive code against errors in implementers
t.printStackTrace(); t.printStackTrace();
@ -181,8 +182,8 @@ public class BptBuilderBlueprint extends BptBuilderBase {
result = slot; result = slot;
break; break;
} else if (checkRequirements(inv, slot)) { } else if (checkRequirements(inv, slot.schematic)) {
useRequirements(inv, slot); useRequirements(inv, slot.schematic);
result = slot; result = slot;
break; break;
@ -334,12 +335,12 @@ public class BptBuilderBlueprint extends BptBuilderBase {
HashMap <StackKey, Integer> computeStacks = new HashMap <StackKey, Integer> (); HashMap <StackKey, Integer> computeStacks = new HashMap <StackKey, Integer> ();
for (Schematic slot : primaryList) { for (SchematicToBuild slot : primaryList) {
LinkedList<ItemStack> stacks = new LinkedList<ItemStack>(); LinkedList<ItemStack> stacks = new LinkedList<ItemStack>();
try { try {
stacks = slot.getRequirements(context); stacks = slot.schematic.getRequirements(context);
} catch (Throwable t) { } catch (Throwable t) {
// Defensive code against errors in implementers // Defensive code against errors in implementers
t.printStackTrace(); t.printStackTrace();
@ -365,8 +366,8 @@ public class BptBuilderBlueprint extends BptBuilderBase {
} }
} }
for (Schematic slot : secondaryList) { for (SchematicToBuild slot : secondaryList) {
LinkedList<ItemStack> stacks = slot.getRequirements(context); LinkedList<ItemStack> stacks = slot.schematic.getRequirements(context);
for (ItemStack stack : stacks) { for (ItemStack stack : stacks) {
if (stack == null || stack.getItem() == null || stack.stackSize == 0) { if (stack == null || stack.getItem() == null || stack.stackSize == 0) {
@ -414,9 +415,9 @@ public class BptBuilderBlueprint extends BptBuilderBase {
@Override @Override
public void postProcessing(World world) { public void postProcessing(World world) {
for (Schematic s : postProcessingList) { for (SchematicToBuild s : postProcessingList) {
try { try {
s.postProcessing(context); s.schematic.postProcessing(context);
} catch (Throwable t) { } catch (Throwable t) {
// Defensive code against errors in implementers // Defensive code against errors in implementers
t.printStackTrace(); t.printStackTrace();

View file

@ -12,13 +12,14 @@ import java.util.LinkedList;
import net.minecraft.world.World; import net.minecraft.world.World;
import buildcraft.api.blueprints.Schematic; import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.Schematic.Mode; import buildcraft.api.blueprints.SchematicToBuild;
import buildcraft.api.blueprints.SchematicToBuild.Mode;
import buildcraft.core.IBuilderInventory; import buildcraft.core.IBuilderInventory;
public class BptBuilderTemplate extends BptBuilderBase { public class BptBuilderTemplate extends BptBuilderBase {
LinkedList<Schematic> clearList = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> clearList = new LinkedList<SchematicToBuild>();
LinkedList<Schematic> buildList = new LinkedList<Schematic>(); LinkedList<SchematicToBuild> buildList = new LinkedList<SchematicToBuild>();
public BptBuilderTemplate(BlueprintBase bluePrint, World world, int x, int y, int z) { public BptBuilderTemplate(BlueprintBase bluePrint, World world, int x, int y, int z) {
super(bluePrint, world, x, y, z); super(bluePrint, world, x, y, z);
@ -36,13 +37,17 @@ public class BptBuilderTemplate extends BptBuilderBase {
slot = new Schematic(); slot = new Schematic();
slot.meta = 0; slot.meta = 0;
slot.block = null; slot.block = null;
slot.x = xCoord;
slot.y = yCoord;
slot.z = zCoord;
slot.mode = Mode.ClearIfInvalid;
clearList.add(slot); SchematicToBuild b = new SchematicToBuild();
b.schematic = slot;
b.x = xCoord;
b.y = yCoord;
b.z = zCoord;
b.mode = Mode.ClearIfInvalid;
clearList.add(b);
} }
} }
} }
@ -65,14 +70,17 @@ public class BptBuilderTemplate extends BptBuilderBase {
slot.block = null; slot.block = null;
} }
slot.x = xCoord; SchematicToBuild b = new SchematicToBuild();
slot.y = yCoord;
slot.z = zCoord;
slot.mode = Mode.Build; b.schematic = slot;
b.x = xCoord;
b.y = yCoord;
b.z = zCoord;
b.mode = Mode.Build;
if (slot.block != null) { if (slot.block != null) {
buildList.add(slot); buildList.add(b);
} }
} }
} }
@ -88,9 +96,9 @@ public class BptBuilderTemplate extends BptBuilderBase {
} }
@Override @Override
public Schematic getNextBlock(World world, IBuilderInventory inv) { public SchematicToBuild getNextBlock(World world, IBuilderInventory inv) {
if (clearList.size() != 0) { if (clearList.size() != 0) {
Schematic slot = internalGetNextBlock(world, inv, clearList); SchematicToBuild slot = internalGetNextBlock(world, inv, clearList);
checkDone(); checkDone();
if (slot != null) { if (slot != null) {
@ -101,7 +109,7 @@ public class BptBuilderTemplate extends BptBuilderBase {
} }
if (buildList.size() != 0) { if (buildList.size() != 0) {
Schematic slot = internalGetNextBlock(world, inv, buildList); SchematicToBuild slot = internalGetNextBlock(world, inv, buildList);
checkDone(); checkDone();
if (slot != null) { if (slot != null) {
@ -116,11 +124,11 @@ public class BptBuilderTemplate extends BptBuilderBase {
return null; return null;
} }
public Schematic internalGetNextBlock(World world, IBuilderInventory inv, LinkedList<Schematic> list) { public SchematicToBuild internalGetNextBlock(World world, IBuilderInventory inv, LinkedList<SchematicToBuild> list) {
Schematic result = null; SchematicToBuild result = null;
while (list.size() > 0) { while (list.size() > 0) {
Schematic slot = list.getFirst(); SchematicToBuild slot = list.getFirst();
// Note from CJ: I have no idea what this code is supposed to do, so I'm not touching it. // Note from CJ: I have no idea what this code is supposed to do, so I'm not touching it.
/*if (slot.blockId == world.getBlockId(slot.x, slot.y, slot.z)) { /*if (slot.blockId == world.getBlockId(slot.x, slot.y, slot.z)) {

View file

@ -9,8 +9,8 @@
package buildcraft.energy; package buildcraft.energy;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicEngine extends Schematic { public class SchematicEngine extends Schematic {
@ -31,7 +31,7 @@ public class SchematicEngine extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
context.world().setBlock(x, y, z, block, meta,1); context.world().setBlock(x, y, z, block, meta,1);
TileEngine engine = (TileEngine) context.world().getTileEntity(x, y, z); TileEngine engine = (TileEngine) context.world().getTileEntity(x, y, z);

View file

@ -12,9 +12,9 @@ import java.util.LinkedList;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic; import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.SchematicUtils; import buildcraft.api.blueprints.SchematicUtils;
import buildcraft.api.blueprints.IBuilderContext;
public class SchematicAutoWorkbench extends Schematic { public class SchematicAutoWorkbench extends Schematic {
@ -33,8 +33,8 @@ public class SchematicAutoWorkbench extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
super.writeToWorld(context); super.writeToWorld(context, x, y, z);
IInventory inventory = (IInventory) context.world().getTileEntity(x, y, z); IInventory inventory = (IInventory) context.world().getTileEntity(x, y, z);

View file

@ -9,8 +9,8 @@
package buildcraft.factory; package buildcraft.factory;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicRefinery extends Schematic { public class SchematicRefinery extends Schematic {
@ -28,8 +28,8 @@ public class SchematicRefinery extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
super.writeToWorld(context); super.writeToWorld(context, x, y, z);
TileRefinery refinery = (TileRefinery) context.world().getTileEntity(x, y, z); TileRefinery refinery = (TileRefinery) context.world().getTileEntity(x, y, z);

View file

@ -8,8 +8,8 @@
*/ */
package buildcraft.factory; package buildcraft.factory;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
public class SchematicTank extends Schematic { public class SchematicTank extends Schematic {
@ -19,7 +19,7 @@ public class SchematicTank extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
context.world().setBlock(x, y, z, block, meta, 3); context.world().setBlock(x, y, z, block, meta, 3);
} }

View file

@ -13,8 +13,8 @@ import java.util.LinkedList;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import buildcraft.api.blueprints.Schematic;
import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.IBuilderContext;
import buildcraft.api.blueprints.Schematic;
import buildcraft.transport.BlockGenericPipe; import buildcraft.transport.BlockGenericPipe;
import buildcraft.transport.Pipe; import buildcraft.transport.Pipe;
import buildcraft.transport.TileGenericPipe.SideProperties; import buildcraft.transport.TileGenericPipe.SideProperties;
@ -31,7 +31,7 @@ public class SchematicPipe extends Schematic {
} }
@Override @Override
public boolean isValid(IBuilderContext context) { public boolean isValid(IBuilderContext context, int x, int y, int z) {
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)) {
@ -58,7 +58,7 @@ public class SchematicPipe extends Schematic {
} }
@Override @Override
public void writeToWorld(IBuilderContext context) { public void writeToWorld(IBuilderContext context, int x, int y, int z) {
cpt.setInteger("x", x); cpt.setInteger("x", x);
cpt.setInteger("y", y); cpt.setInteger("y", y);
cpt.setInteger("z", z); cpt.setInteger("z", z);