From 7dde152e0f3f11a7e5cac613140baa78624ed290 Mon Sep 17 00:00:00 2001 From: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Date: Thu, 2 Jan 2020 06:34:26 +0100 Subject: moved imprint loader onto server start + fixes NBT issues with recipes Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Former-commit-id: b145d22c3a8af5bdda021c4039b830935fd1dbe1 --- build.properties | 2 +- .../github/bartimaeusnek/bartworks/MainMod.java | 8 ++- .../CircuitGeneration/CircuitImprintLoader.java | 79 +++++++++++++++++----- 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/build.properties b/build.properties index 13606e11cd..1a4f713309 100644 --- a/build.properties +++ b/build.properties @@ -22,7 +22,7 @@ mc_version=1.7.10 majorUpdate=0 minorUpdate=5 -buildNumber=3_f2 +buildNumber=4 APIVersion=8 ic2.version=2.2.828-experimental gregtech.version=5.09.32.36 diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java b/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java index 2d33252b12..cf0c828cc5 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/MainMod.java @@ -217,7 +217,7 @@ public final class MainMod { removeIC2Recipes(); MainMod.addElectricImplosionCompressorRecipes(); PlatinumSludgeOverHaul.replacePureElements(); - new CircuitImprintLoader().run(); + runOnServerStarted(); fixEnergyRequirements(); MainMod.unificationRecipeEnforcer(); @@ -225,8 +225,11 @@ public final class MainMod { private static boolean recipesAdded; - public static void runOnPlayerJoined(boolean classicMode, boolean extraGasRecipes){ + public static void runOnPlayerJoined(boolean classicMode, boolean extraGasRecipes) { OreDictHandler.adaptCacheForWorld(); + + CircuitImprintLoader.run(); + if (!recipesAdded) { if (!extraGasRecipes) { ArrayListMultimap toChange = MainMod.getRecipesToChange(NOBLE_GAS, ANAEROBE_GAS); @@ -238,6 +241,7 @@ public final class MainMod { // removeDuplicateRecipes(); recipesAdded = true; } + } private static void fixEnergyRequirements() { diff --git a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java index 3298aec12b..403556f4eb 100644 --- a/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java +++ b/src/main/java/com/github/bartimaeusnek/bartworks/system/material/CircuitGeneration/CircuitImprintLoader.java @@ -44,14 +44,35 @@ import net.minecraftforge.oredict.OreDictionary; import java.util.HashSet; import java.util.Iterator; -public class CircuitImprintLoader implements Runnable { +public class CircuitImprintLoader { public static final ArrayListMultimap recipeTagMap = ArrayListMultimap.create(); + static final HashBiMap bwCircuitTagMap = HashBiMap.create(20); - static final HashSet refs = new HashSet<>(); public static short reverseIDs = Short.MAX_VALUE-1; public static HashBiMap circuitIIconRefs = HashBiMap.create(20); +// /** +// * stack is assumed valid +// **/ +// private static NBTTagCompound getUniqueIdentifierFromStack(ItemStack stack){ +// NBTTagCompound tagCompound = new NBTTagCompound(); +// tagCompound.setString("Name", stack.getUnlocalizedName()); +// tagCompound.setString("ODName", OreDictionary.getOreName(OreDictionary.getOreID(stack))); +// tagCompound.setShort("Damage", (short)stack.getItemDamage()); +// +// return tagCompound; +// } +// +// private static ItemStack getStackFromUniqueIdentifier(NBTTagCompound tagCompound){ +// return OreDictionary.getOres(tagCompound.getString("ODName")).stream().filter( +// e -> +// e.getItemDamage() == tagCompound.getShort("Damage") +// && e.getUnlocalizedName().equals(tagCompound.getString("Name")) +// +// ).findFirst().orElse(null); +// } + public static NBTTagCompound getTagFromStack(ItemStack stack){ if (GT_Utility.isStackValid(stack)) return stack.copy().splitStack(1).writeToNBT(new NBTTagCompound()); @@ -62,49 +83,66 @@ public class CircuitImprintLoader implements Runnable { return ItemStack.loadItemStackFromNBT(tagCompound); } - @Override - public void run() { - if (BWRecipes.instance.getMappingsFor(BWRecipes.CIRCUITASSEMBLYLINE).mRecipeList.size() > 0) - return; + public static void run() { + boolean newServer = false; + if (BWRecipes.instance.getMappingsFor(BWRecipes.CIRCUITASSEMBLYLINE).mRecipeList.size() > 0){ + BWRecipes.instance.getMappingsFor(BWRecipes.CIRCUITASSEMBLYLINE).mRecipeList.clear(); + recipeTagMap.clear(); + newServer = true; + } + Iterator it = GT_Recipe.GT_Recipe_Map.sCircuitAssemblerRecipes.mRecipeList.iterator(); GT_Recipe circuitRecipe; + HashSet toRem = new HashSet<>(); HashSet toAdd = new HashSet<>(); + while (it.hasNext()) { circuitRecipe = it.next(); + ItemStack[] outputs = circuitRecipe.mOutputs; + if (outputs.length < 1) continue; + int[] oreIDS = OreDictionary.getOreIDs(outputs[0]); + if (oreIDS.length < 1) continue; + String name = OreDictionary.getOreName(oreIDS[0]); + if (name.contains("Circuit") || name.contains("circuit")) { + CircuitImprintLoader.recipeTagMap.put(CircuitImprintLoader.getTagFromStack(outputs[0]), circuitRecipe.copy()); - for (ItemStack s : circuitRecipe.mInputs) { - if (circuitRecipe.mFluidInputs[0].isFluidEqual(Materials.SolderingAlloy.getMolten(0))) - CircuitImprintLoader.refs.add(CircuitImprintLoader.getTagFromStack(s.copy().splitStack(1))); - } + if (circuitRecipe.mFluidInputs[0].isFluidEqual(Materials.SolderingAlloy.getMolten(0))) { GT_Recipe newRecipe = CircuitImprintLoader.reBuildRecipe(circuitRecipe); + if (newRecipe != null) BWRecipes.instance.getMappingsFor(BWRecipes.CIRCUITASSEMBLYLINE).addRecipe(newRecipe); + if (circuitRecipe.mEUt > BW_Util.getTierVoltage(ConfigHandler.cutoffTier)) { toRem.add(circuitRecipe); toAdd.add(CircuitImprintLoader.makeMoreExpensive(circuitRecipe)); } + } else { - if (circuitRecipe.mEUt > BW_Util.getTierVoltage(ConfigHandler.cutoffTier)) { + + if (circuitRecipe.mEUt > BW_Util.getTierVoltage(ConfigHandler.cutoffTier)) toRem.add(circuitRecipe); - } - } + } } } - GT_Recipe.GT_Recipe_Map.sCircuitAssemblerRecipes.mRecipeList.addAll(toAdd); - GT_Recipe.GT_Recipe_Map.sCircuitAssemblerRecipes.mRecipeList.removeAll(toRem); - this.makeCircuitImprints(); + + if (!newServer) { + GT_Recipe.GT_Recipe_Map.sCircuitAssemblerRecipes.mRecipeList.addAll(toAdd); + GT_Recipe.GT_Recipe_Map.sCircuitAssemblerRecipes.mRecipeList.removeAll(toRem); + } + + makeCircuitImprints(); } @SuppressWarnings("deprecation") @@ -165,7 +203,6 @@ public class CircuitImprintLoader implements Runnable { return new BWRecipes.DynamicGTRecipe(false,in,new ItemStack[]{out},BW_Meta_Items.getNEWCIRCUITS().getStackWithNBT(CircuitImprintLoader.getTagFromStack(original.mOutputs[0]),0,0),null, original.mFluidInputs,null,original.mDuration * 16,original.mEUt,0); } - public static final HashSet blacklistSet = new HashSet<>(); private static boolean checkForBlacklistedComponents(ItemStack[] itemStacks){ @@ -178,16 +215,21 @@ public class CircuitImprintLoader implements Runnable { return false; } - private void makeCircuitImprints(){ + private static void makeCircuitImprints() { + //TODO: cache and remove recipes if new world is loaded. + for (NBTTagCompound tag : CircuitImprintLoader.recipeTagMap.keySet()){ ItemStack stack = CircuitImprintLoader.getStackFromTag(tag); int eut = Integer.MAX_VALUE; + for (GT_Recipe recipe : CircuitImprintLoader.recipeTagMap.get(tag)) { eut = Math.min(eut, recipe.mEUt); } + eut = Math.min(eut, BW_Util.getMachineVoltageFromTier(BW_Util.getCircuitTierFromOreDictName(OreDictionary.getOreName(OreDictionary.getOreIDs(stack)[0])))); GT_Recipe slicingRecipe = new BWRecipes.DynamicGTRecipe(true,new ItemStack[]{stack,ItemList.Shape_Slicer_Flat.get(0)},new ItemStack[]{BW_Meta_Items.getNEWCIRCUITS().getStackWithNBT(tag,1,1)},null,null,null,null,300,eut, BW_Util.CLEANROOM); GT_Recipe.GT_Recipe_Map.sSlicerRecipes.add(slicingRecipe); + GameRegistry.addRecipe(new BWRecipes.BWNBTDependantCraftingRecipe(BW_Meta_Items.getNEWCIRCUITS().getStackWithNBT(tag,0,1), " X ", "GPG", @@ -195,6 +237,7 @@ public class CircuitImprintLoader implements Runnable { 'P', BW_Meta_Items.getNEWCIRCUITS().getStackWithNBT(tag,1,1), 'G', WerkstoffLoader.Prasiolite.get(OrePrefixes.gemExquisite,1), 'X', BW_Meta_Items.getNEWCIRCUITS().getStack(3))); + GT_ModHandler.addCraftingRecipe(BW_Meta_Items.getNEWCIRCUITS().getStackWithNBT(tag,0,1), GT_ModHandler.RecipeBits.DO_NOT_CHECK_FOR_COLLISIONS | GT_ModHandler.RecipeBits.KEEPNBT | GT_ModHandler.RecipeBits.BUFFERED, new Object[]{ " X ", "GPG", -- cgit