From 7f34e2824b93d59d974b91288213ba34c959642d Mon Sep 17 00:00:00 2001 From: asiekierka Date: Mon, 29 Dec 2014 22:17:40 +0100 Subject: [PATCH] re-add gate pulsar pulse counting with multiple actions, optimize builder code --- .../api/gates/GateExpansionController.java | 2 +- api/buildcraft/api/gates/package-info.java | 2 +- common/buildcraft/BuildCraftSilicon.java | 21 ++++++++++++------- .../buildcraft/builders/TilePathMarker.java | 2 +- .../core/blueprints/BptBuilderBase.java | 5 +++-- .../core/blueprints/BptBuilderBlueprint.java | 3 ++- common/buildcraft/transport/Gate.java | 15 +++++++++++-- .../transport/gates/GateExpansionPulsar.java | 21 +++++++++++-------- .../transport/gates/StatementSlot.java | 21 +++++++++++++++++++ .../transport/pipes/PipeItemsWood.java | 4 ++-- 10 files changed, 69 insertions(+), 27 deletions(-) diff --git a/api/buildcraft/api/gates/GateExpansionController.java b/api/buildcraft/api/gates/GateExpansionController.java index 2a9c8d59..cabb2a20 100644 --- a/api/buildcraft/api/gates/GateExpansionController.java +++ b/api/buildcraft/api/gates/GateExpansionController.java @@ -42,7 +42,7 @@ public abstract class GateExpansionController { public void startResolution() { } - public boolean resolveAction(IStatement action) { + public boolean resolveAction(IStatement action, int count) { return false; } diff --git a/api/buildcraft/api/gates/package-info.java b/api/buildcraft/api/gates/package-info.java index a5277c6d..ac86f498 100644 --- a/api/buildcraft/api/gates/package-info.java +++ b/api/buildcraft/api/gates/package-info.java @@ -6,7 +6,7 @@ * Please check the contents of the license, which should be located * as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "3.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|gates") +@API(apiVersion = "4.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|gates") package buildcraft.api.gates; import cpw.mods.fml.common.API; diff --git a/common/buildcraft/BuildCraftSilicon.java b/common/buildcraft/BuildCraftSilicon.java index e14b6bd7..0c4217e7 100644 --- a/common/buildcraft/BuildCraftSilicon.java +++ b/common/buildcraft/BuildCraftSilicon.java @@ -21,6 +21,7 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraftforge.common.config.Configuration; import net.minecraftforge.oredict.OreDictionary; import buildcraft.api.blueprints.BuilderAPI; @@ -123,8 +124,12 @@ public class BuildCraftSilicon extends BuildCraftMod { public static IActionInternal actionStationDropInPipe = new ActionStationAcceptItemsPipe(); public static IActionInternal actionStationMachineRequestItems = new ActionStationRequestItemsMachine(); + public static float chipsetCostMultiplier = 1.0F; + @Mod.EventHandler public void preInit(FMLPreInitializationEvent evt) { + chipsetCostMultiplier = BuildCraftCore.mainConfiguration.getFloat("chipset.costMultiplier", Configuration.CATEGORY_GENERAL, 1.0F, 0.001F, 1000.0F, "The multiplier for chipset recipe cost."); + BuildCraftCore.mainConfiguration.save(); laserBlock = new BlockLaser(); @@ -283,21 +288,21 @@ public class BuildCraftSilicon extends BuildCraftMod { 'I', "ingotIron"); // CHIPSETS - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:redstoneChipset", 100000, Chipset.RED.getStack(), + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:redstoneChipset", Math.round(100000 * chipsetCostMultiplier), Chipset.RED.getStack(), "dustRedstone"); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:ironChipset", 200000, Chipset.IRON.getStack(), + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:ironChipset", Math.round(200000 * chipsetCostMultiplier), Chipset.IRON.getStack(), "dustRedstone", "ingotIron"); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:goldChipset", 400000, Chipset.GOLD.getStack(), + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:goldChipset", Math.round(400000 * chipsetCostMultiplier), Chipset.GOLD.getStack(), "dustRedstone", "ingotGold"); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:diamondChipset", 800000, + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:diamondChipset", Math.round(800000 * chipsetCostMultiplier), Chipset.DIAMOND.getStack(), "dustRedstone", "gemDiamond"); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:emeraldChipset", 1200000, + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:emeraldChipset", Math.round(1200000 * chipsetCostMultiplier), Chipset.EMERALD.getStack(), "dustRedstone", "gemEmerald"); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:pulsatingChipset", 400000, + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:pulsatingChipset", Math.round(400000 * chipsetCostMultiplier), Chipset.PULSATING.getStack(2), "dustRedstone", Items.ender_pearl); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:quartzChipset", 600000, Chipset.QUARTZ.getStack(), + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:quartzChipset", Math.round(600000 * chipsetCostMultiplier), Chipset.QUARTZ.getStack(), "dustRedstone", "gemQuartz"); - BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:compChipset", 600000, Chipset.COMP.getStack(), + BuildcraftRecipeRegistry.assemblyTable.addRecipe("buildcraft:compChipset", Math.round(600000 * chipsetCostMultiplier), Chipset.COMP.getStack(), "dustRedstone", Items.comparator); // ROBOTS AND BOARDS diff --git a/common/buildcraft/builders/TilePathMarker.java b/common/buildcraft/builders/TilePathMarker.java index 8de728cc..34544194 100644 --- a/common/buildcraft/builders/TilePathMarker.java +++ b/common/buildcraft/builders/TilePathMarker.java @@ -144,7 +144,7 @@ public class TilePathMarker extends TileMarker { } public LinkedList getPath() { - TreeSet visitedPaths = new TreeSet(); + HashSet visitedPaths = new HashSet(); LinkedList res = new LinkedList(); TilePathMarker nextTile = this; diff --git a/common/buildcraft/core/blueprints/BptBuilderBase.java b/common/buildcraft/core/blueprints/BptBuilderBase.java index 7a43121b..6ef85524 100644 --- a/common/buildcraft/core/blueprints/BptBuilderBase.java +++ b/common/buildcraft/core/blueprints/BptBuilderBase.java @@ -9,6 +9,7 @@ package buildcraft.core.blueprints; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedList; import java.util.TreeSet; @@ -44,8 +45,8 @@ public abstract class BptBuilderBase implements IAreaProvider { public BlueprintBase blueprint; public BptContext context; protected boolean done; - protected TreeSet clearedLocations = new TreeSet(); - protected TreeSet builtLocations = new TreeSet(); + protected HashSet clearedLocations = new HashSet(); + protected HashSet builtLocations = new HashSet(); protected int x, y, z; protected boolean initialized = false; diff --git a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java index f66ae785..944f5cb0 100644 --- a/common/buildcraft/core/blueprints/BptBuilderBlueprint.java +++ b/common/buildcraft/core/blueprints/BptBuilderBlueprint.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; @@ -59,7 +60,7 @@ public class BptBuilderBlueprint extends BptBuilderBase { public ArrayList neededItems = new ArrayList(); - protected TreeSet builtEntities = new TreeSet(); + protected HashSet builtEntities = new HashSet(); private LinkedList buildList = new LinkedList(); private LinkedList entityList = new LinkedList(); diff --git a/common/buildcraft/transport/Gate.java b/common/buildcraft/transport/Gate.java index cf9bba33..9088545e 100644 --- a/common/buildcraft/transport/Gate.java +++ b/common/buildcraft/transport/Gate.java @@ -14,6 +14,7 @@ import java.util.List; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import com.google.common.collect.HashMultiset; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -80,6 +81,8 @@ public final class Gate implements IGate, IStatementContainer { private float pulseStage = 0; private ForgeDirection direction; + private HashMultiset statementCounts = HashMultiset.create(); + // / CONSTRUCTOR public Gate(Pipe pipe, GateMaterial material, GateLogic logic, ForgeDirection direction) { this.pipe = pipe; @@ -412,7 +415,7 @@ public final class Gate implements IGate, IStatementContainer { } } - activeActions = new ArrayList(); + activeActions.clear(); for (int it = 0; it < MAX_STATEMENTS; ++it) { boolean allActive = true; @@ -452,6 +455,14 @@ public final class Gate implements IGate, IStatementContainer { } } + statementCounts.clear(); + + for (int it = 0; it < MAX_STATEMENTS; ++it) { + if (actionsState[it] == ActionActiveState.Activated) { + statementCounts.add(actions[it], 1); + } + } + // Activate the actions for (StatementSlot slot : activeActions) { IStatement action = slot.statement; @@ -501,7 +512,7 @@ public final class Gate implements IGate, IStatementContainer { public boolean resolveAction(IStatement action) { for (GateExpansionController expansion : expansions.values()) { - if (expansion.resolveAction(action)) { + if (expansion.resolveAction(action, statementCounts.count(action))) { return true; } } diff --git a/common/buildcraft/transport/gates/GateExpansionPulsar.java b/common/buildcraft/transport/gates/GateExpansionPulsar.java index 60886b81..44198ec7 100644 --- a/common/buildcraft/transport/gates/GateExpansionPulsar.java +++ b/common/buildcraft/transport/gates/GateExpansionPulsar.java @@ -46,6 +46,7 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement private boolean singlePulse; private boolean hasPulsed; private int tick; + private int count; public GateExpansionControllerPulsar(TileEntity pipeTile) { super(GateExpansionPulsar.this, pipeTile); @@ -65,12 +66,12 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement } @Override - public boolean resolveAction(IStatement action) { + public boolean resolveAction(IStatement action, int count) { if (action instanceof ActionEnergyPulsar) { - enablePulse(); + enablePulse(count); return true; } else if (action instanceof ActionSingleEnergyPulse) { - enableSinglePulse(); + enableSinglePulse(count); return true; } return false; @@ -101,10 +102,7 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement if (pipeTile instanceof IEnergyHandler && (!singlePulse || !hasPulsed)) { gate.setPulsing(true); - // TODO: (1 - 1) is coming from pulse count, which has been - // removed. The add energy algorithm probably needs to be - // reviewed altogether. - ((IEnergyHandler) pipeTile).receiveEnergy(ForgeDirection.UNKNOWN, Math.min(1 << (1 - 1), 64) * 10, + ((IEnergyHandler) pipeTile).receiveEnergy(ForgeDirection.UNKNOWN, Math.min(1 << (count - 1), 64) * 10, false); hasPulsed = true; } else { @@ -112,14 +110,16 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement } } - private void enableSinglePulse() { + private void enableSinglePulse(int count) { singlePulse = true; isActive = true; + this.count = count; } - private void enablePulse() { + private void enablePulse(int count) { isActive = true; singlePulse = false; + this.count = count; } private void disablePulse() { @@ -127,6 +127,7 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement hasPulsed = false; } isActive = false; + this.count = 0; } @Override @@ -139,6 +140,7 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement nbt.setBoolean("singlePulse", singlePulse); nbt.setBoolean("isActive", isActive); nbt.setBoolean("hasPulsed", hasPulsed); + nbt.setByte("pulseCount", (byte) count); nbt.setInteger("tick", tick); } @@ -147,6 +149,7 @@ public final class GateExpansionPulsar extends GateExpansionBuildcraft implement isActive = nbt.getBoolean("isActive"); singlePulse = nbt.getBoolean("singlePulse"); hasPulsed = nbt.getBoolean("hasPulsed"); + count = nbt.getByte("pulseCount"); tick = nbt.getInteger("tick"); } } diff --git a/common/buildcraft/transport/gates/StatementSlot.java b/common/buildcraft/transport/gates/StatementSlot.java index 539d9b4e..544ef4ce 100755 --- a/common/buildcraft/transport/gates/StatementSlot.java +++ b/common/buildcraft/transport/gates/StatementSlot.java @@ -8,10 +8,31 @@ */ package buildcraft.transport.gates; +import net.minecraft.nbt.NBTTagCompound; import buildcraft.api.statements.IStatement; import buildcraft.api.statements.IStatementParameter; +import buildcraft.api.statements.StatementManager; public class StatementSlot { public IStatement statement; public IStatementParameter[] parameters; + + @Override + public boolean equals(Object o) { + if (o == null || !(o instanceof StatementSlot)) { + return false; + } + StatementSlot s = (StatementSlot) o; + if (s.statement != statement || parameters.length != s.parameters.length) { + return false; + } + for (int i = 0; i < parameters.length; i++) { + IStatementParameter p1 = parameters[i]; + IStatementParameter p2 = s.parameters[i]; + if (!(p1.equals(p2))) { + return false; + } + } + return true; + } } diff --git a/common/buildcraft/transport/pipes/PipeItemsWood.java b/common/buildcraft/transport/pipes/PipeItemsWood.java index 37e2194f..29ce5f04 100644 --- a/common/buildcraft/transport/pipes/PipeItemsWood.java +++ b/common/buildcraft/transport/pipes/PipeItemsWood.java @@ -147,7 +147,7 @@ public class PipeItemsWood extends Pipe implements IEnergyHa for (ItemStack stack : extracted) { if (stack == null || stack.stackSize == 0) { - battery.useEnergy(10, 10, false); + //battery.useEnergy(10, 10, false); continue; } @@ -197,7 +197,7 @@ public class PipeItemsWood extends Pipe implements IEnergyHa if (slot != null && slot.stackSize > 0 && inventory.canExtractItem(k, slot, from.ordinal())) { if (doRemove) { - int stackSize = battery.useEnergy(10, slot.stackSize * 10, false) / 10; + int stackSize = (int) Math.floor(battery.useEnergy(10, slot.stackSize * 10, false) / 10); return inventory.decrStackSize(k, stackSize); } else {