diff --git a/api/buildcraft/api/blueprints/Schematic.java b/api/buildcraft/api/blueprints/Schematic.java index c3a8eee2..cd997f59 100755 --- a/api/buildcraft/api/blueprints/Schematic.java +++ b/api/buildcraft/api/blueprints/Schematic.java @@ -269,4 +269,18 @@ public abstract class Schematic { public BuildingPermission getBuildingPermission () { return BuildingPermission.ALL; } + + /** + * Returns the amount of energy required to build this slot, depends on the + * stacks selected for the build. + */ + public double getEnergyRequirement(LinkedList stacksUsed) { + double result = 0; + + for (ItemStack s : stacksUsed) { + result += s.stackSize * SchematicRegistry.BUILD_ENERGY; + } + + return result; + } } diff --git a/api/buildcraft/api/blueprints/SchematicRegistry.java b/api/buildcraft/api/blueprints/SchematicRegistry.java index 0b903108..b668b4e8 100644 --- a/api/buildcraft/api/blueprints/SchematicRegistry.java +++ b/api/buildcraft/api/blueprints/SchematicRegistry.java @@ -22,6 +22,9 @@ import buildcraft.api.core.JavaTools; public class SchematicRegistry { + public static double BREAK_ENERGY = 10; + public static final double BUILD_ENERGY = 20; + private static class SchematicConstructor { Class clas; Object [] params; diff --git a/common/buildcraft/builders/TileAbstractBuilder.java b/common/buildcraft/builders/TileAbstractBuilder.java index 70f76137..afcdcc61 100755 --- a/common/buildcraft/builders/TileAbstractBuilder.java +++ b/common/buildcraft/builders/TileAbstractBuilder.java @@ -14,6 +14,7 @@ import java.util.LinkedList; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import buildcraft.api.blueprints.ITileBuilder; +import buildcraft.api.blueprints.SchematicRegistry; import buildcraft.api.core.NetworkData; import buildcraft.api.core.SafeTimeTracker; import buildcraft.api.mj.MjBattery; @@ -27,15 +28,12 @@ import buildcraft.core.network.RPCSide; public abstract class TileAbstractBuilder extends TileBuildCraft implements ITileBuilder, IInventory, IBoxProvider { - public static double BREAK_ENERGY = 10; - public static final double BUILD_ENERGY = 20; - /** * Computes the maximum amount of energy required to build a full chest, * plus a safeguard. That's a nice way to evaluate maximum amount of energy * that need to be in a builder. */ - private static final double FULL_CHEST_ENERGY = 9 * 3 * 64 * BUILD_ENERGY + 1000; + private static final double FULL_CHEST_ENERGY = 9 * 3 * 64 * SchematicRegistry.BUILD_ENERGY + 1000; @MjBattery(maxReceivedPerCycle = 100, maxCapacity = FULL_CHEST_ENERGY, minimumConsumption = 1) protected double mjStored = 0; diff --git a/common/buildcraft/core/blueprints/BptBuilderBase.java b/common/buildcraft/core/blueprints/BptBuilderBase.java index 5cda3f49..aa638e00 100644 --- a/common/buildcraft/core/blueprints/BptBuilderBase.java +++ b/common/buildcraft/core/blueprints/BptBuilderBase.java @@ -20,6 +20,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import buildcraft.BuildCraftBuilders; import buildcraft.api.blueprints.IBuilderContext; +import buildcraft.api.blueprints.SchematicRegistry; import buildcraft.api.core.IAreaProvider; import buildcraft.api.core.Position; import buildcraft.builders.BuildingItem; @@ -149,10 +150,10 @@ public abstract class BptBuilderBase implements IAreaProvider { .getBlockHardness(context.world(), slot.x, slot.y, slot.z)+1; - if (builder.energyAvailable() < hardness * TileAbstractBuilder.BREAK_ENERGY) { + if (builder.energyAvailable() < hardness * SchematicRegistry.BREAK_ENERGY) { return false; } else { - builder.consumeEnergy(hardness * TileAbstractBuilder.BREAK_ENERGY); + builder.consumeEnergy(hardness * SchematicRegistry.BREAK_ENERGY); for (int i = 0; i < hardness; ++i) { slot.addStackConsumed(new ItemStack(BuildCraftBuilders.buildToolBlock)); diff --git a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java index c277eedc..bafa8c90 100644 --- a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java +++ b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java @@ -314,15 +314,12 @@ public class BptBuilderBlueprint extends BptBuilderBase { } public boolean checkRequirements(TileAbstractBuilder builder, Schematic slot) { - double energyRequired = 0; - LinkedList tmpReq = new LinkedList(); try { for (ItemStack stk : slot.getRequirements(context)) { if (stk != null) { tmpReq.add(stk.copy()); - energyRequired += stk.stackSize * TileAbstractBuilder.BUILD_ENERGY; } } } catch (Throwable t) { @@ -331,25 +328,31 @@ public class BptBuilderBlueprint extends BptBuilderBase { BCLog.logger.throwing("BptBuilderBlueprint", "checkRequirements", t); } - if (builder.energyAvailable() < energyRequired) { - return false; - } + LinkedList stacksUsed = new LinkedList(); if (context.world().getWorldInfo().getGameType() == GameType.CREATIVE) { - return true; + for (ItemStack s : tmpReq) { + stacksUsed.add(s); + } + + if (builder.energyAvailable() < slot.getEnergyRequirement (stacksUsed)) { + return false; + } else { + return true; + } } for (ItemStack reqStk : tmpReq) { for (IInvSlot slotInv : InventoryIterator.getIterable(new InventoryCopy(builder), ForgeDirection.UNKNOWN)) { if (!builder.isBuildingMaterialSlot(slotInv.getIndex())) { - + continue; } ItemStack invStk = slotInv.getStackInSlot(); if (invStk != null && invStk.stackSize > 0 && StackHelper.isCraftingEquivalent(reqStk, invStk, true)) { try { - slot.useItem(context, reqStk, slotInv); + stacksUsed.add(slot.useItem(context, reqStk, slotInv)); } catch (Throwable t) { // Defensive code against errors in implementers t.printStackTrace(); @@ -367,19 +370,20 @@ public class BptBuilderBlueprint extends BptBuilderBase { } } - return true; + if (builder.energyAvailable() < slot.getEnergyRequirement (stacksUsed)) { + return false; + } else { + return true; + } } public void useRequirements(TileAbstractBuilder builder, BuildingSlot slot) { LinkedList tmpReq = new LinkedList(); - double energyRequired = 0; - try { for (ItemStack stk : slot.getRequirements(context)) { if (stk != null) { tmpReq.add(stk.copy()); - energyRequired += stk.stackSize * TileAbstractBuilder.BUILD_ENERGY; } } } catch (Throwable t) { @@ -389,13 +393,13 @@ public class BptBuilderBlueprint extends BptBuilderBase { } - builder.consumeEnergy(energyRequired); - if (context.world ().getWorldInfo().getGameType() == GameType.CREATIVE) { - for (ItemStack s : slot.getRequirements(context)) { + for (ItemStack s : tmpReq) { slot.addStackConsumed(s); } + builder.consumeEnergy(slot.getEnergyRequirement()); + return; } @@ -408,7 +412,7 @@ public class BptBuilderBlueprint extends BptBuilderBase { for (IInvSlot slotInv : InventoryIterator.getIterable(builder, ForgeDirection.UNKNOWN)) { if (!builder.isBuildingMaterialSlot(slotInv.getIndex())) { - + continue; } ItemStack invStk = slotInv.getStackInSlot(); @@ -438,6 +442,8 @@ public class BptBuilderBlueprint extends BptBuilderBase { } } + builder.consumeEnergy(slot.getEnergyRequirement ()); + return; } diff --git a/common/buildcraft/core/blueprints/BptBuilderTemplate.java b/common/buildcraft/core/blueprints/BptBuilderTemplate.java index 447962d5..7681937f 100644 --- a/common/buildcraft/core/blueprints/BptBuilderTemplate.java +++ b/common/buildcraft/core/blueprints/BptBuilderTemplate.java @@ -14,6 +14,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.blueprints.SchematicBlockBase; +import buildcraft.api.blueprints.SchematicRegistry; import buildcraft.api.core.BuildCraftAPI; import buildcraft.api.core.IInvSlot; import buildcraft.builders.TileAbstractBuilder; @@ -170,8 +171,8 @@ public class BptBuilderTemplate extends BptBuilderBase { iterator.remove(); builtLocations.add(new BlockIndex(slot.x, slot.y, slot.z)); } else { - if (builder.energyAvailable() > TileAbstractBuilder.BUILD_ENERGY && firstSlotToConsume != null) { - builder.consumeEnergy(TileAbstractBuilder.BUILD_ENERGY); + if (builder.energyAvailable() > SchematicRegistry.BUILD_ENERGY && firstSlotToConsume != null) { + builder.consumeEnergy(SchematicRegistry.BUILD_ENERGY); slot.addStackConsumed(firstSlotToConsume .decreaseStackInSlot()); diff --git a/common/buildcraft/core/blueprints/BuildingSlot.java b/common/buildcraft/core/blueprints/BuildingSlot.java index a8bb98f1..caa0d4f0 100755 --- a/common/buildcraft/core/blueprints/BuildingSlot.java +++ b/common/buildcraft/core/blueprints/BuildingSlot.java @@ -58,4 +58,6 @@ public abstract class BuildingSlot { public abstract void writeToNBT (NBTTagCompound nbt, MappingRegistry registry); public abstract void readFromNBT (NBTTagCompound nbt, MappingRegistry registry); + + public abstract double getEnergyRequirement(); } diff --git a/common/buildcraft/core/blueprints/BuildingSlotBlock.java b/common/buildcraft/core/blueprints/BuildingSlotBlock.java index 9b485aa2..d029a7a3 100755 --- a/common/buildcraft/core/blueprints/BuildingSlotBlock.java +++ b/common/buildcraft/core/blueprints/BuildingSlotBlock.java @@ -161,4 +161,9 @@ public class BuildingSlotBlock extends BuildingSlot { return getSchematic ().getStacksToDisplay (stackConsumed); } } + + @Override + public double getEnergyRequirement() { + return schematic.getEnergyRequirement(stackConsumed); + } } diff --git a/common/buildcraft/core/blueprints/BuildingSlotEntity.java b/common/buildcraft/core/blueprints/BuildingSlotEntity.java index 7f3b0118..d4f41166 100755 --- a/common/buildcraft/core/blueprints/BuildingSlotEntity.java +++ b/common/buildcraft/core/blueprints/BuildingSlotEntity.java @@ -78,4 +78,9 @@ public class BuildingSlotEntity extends BuildingSlot { schematic = (SchematicEntity) SchematicFactory .createSchematicFromWorldNBT(nbt.getCompoundTag("schematic"), registry); } + + @Override + public double getEnergyRequirement() { + return schematic.getEnergyRequirement(stackConsumed); + } }