assembler config now uses the new system

This commit is contained in:
Boblet 2024-02-21 09:52:42 +01:00
parent 315bb8d449
commit b63f029105
7 changed files with 222 additions and 452 deletions

View File

@ -3,6 +3,10 @@
* Tweaked super shotgun animations, added config for changing the animation style
* The benelli now has reloading animations and the drum mag as advertised
* Tom will now explode close to bedrock even when not hitting a block
* The assembler recipe config now uses the same system as all other recipe configs, the file has moved into the `hbmRecipes` folder
* Old files are still compatible if moved to the new folder, since the base structure of the recipe file is the same
* Recipes should work as expected with the `/ntmreload` command
* Recipes now have an optional list for specifying which template folder they are made in
## Fixed
* Fixed the structure toggle on the world creation screen not working correctly on most world types

View File

@ -13,6 +13,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.AssemblerRecipes;
import com.hbm.inventory.recipes.AssemblerRecipes.AssemblerRecipe;
import com.hbm.inventory.recipes.ChemplantRecipes;
import com.hbm.inventory.recipes.ChemplantRecipes.ChemRecipe;
import com.hbm.inventory.recipes.CrucibleRecipes;
@ -34,6 +35,7 @@ import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
@ -56,21 +58,22 @@ public class GUIScreenTemplateFolder extends GuiScreen {
if(player.getHeldItem() == null)
return;
Item item = player.getHeldItem().getItem();
if(player.getHeldItem().getItem() == ModItems.template_folder) {
this.isJournal = item != ModItems.template_folder;
if(!this.isJournal) {
// Stamps
for(ItemStack i : ItemStamp.stamps.get(StampType.PLATE))
allStacks.add(i.copy());
for(ItemStack i : ItemStamp.stamps.get(StampType.WIRE))
allStacks.add(i.copy());
for(ItemStack i : ItemStamp.stamps.get(StampType.CIRCUIT))
allStacks.add(i.copy());
for(ItemStack i : ItemStamp.stamps.get(StampType.PLATE)) allStacks.add(i.copy());
for(ItemStack i : ItemStamp.stamps.get(StampType.WIRE)) allStacks.add(i.copy());
for(ItemStack i : ItemStamp.stamps.get(StampType.CIRCUIT)) allStacks.add(i.copy());
// Tracks
for(int i = 1; i < ItemCassette.TrackType.values().length; i++) {
allStacks.add(new ItemStack(ModItems.siren_track, 1, i));
}
// Fluid IDs
FluidType[] fluids = Fluids.getInNiceOrder();
for(int i = 1; i < fluids.length; i++) {
@ -78,14 +81,18 @@ public class GUIScreenTemplateFolder extends GuiScreen {
allStacks.add(new ItemStack(ModItems.fluid_identifier, 1, fluids[i].getID()));
}
}
// Assembly Templates
for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) {
ComparableStack comp = AssemblerRecipes.recipeList.get(i);
if(AssemblerRecipes.hidden.get(comp) == null) {
allStacks.add(ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template, 1, i), comp));
}
}
// Assembly Templates
for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) {
ComparableStack comp = AssemblerRecipes.recipeList.get(i);
AssemblerRecipe recipe = AssemblerRecipes.recipes.get(comp);
if(recipe != null && recipe.folders.contains(item)) {
allStacks.add(ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template, 1, i), comp));
}
}
if(!this.isJournal) {
// Chemistry Templates
for(int i = 0; i < ChemplantRecipes.recipes.size(); i++) {
ChemRecipe chem = ChemplantRecipes.recipes.get(i);
@ -96,19 +103,6 @@ public class GUIScreenTemplateFolder extends GuiScreen {
for(int i = 0; i < CrucibleRecipes.recipes.size(); i++) {
allStacks.add(new ItemStack(ModItems.crucible_template, 1, CrucibleRecipes.recipes.get(i).getId()));
}
} else {
for(int i = 0; i < AssemblerRecipes.recipeList.size(); i++) {
if(AssemblerRecipes.hidden.get(AssemblerRecipes.recipeList.get(i)) != null &&
AssemblerRecipes.hidden.get(AssemblerRecipes.recipeList.get(i)).contains(player.getHeldItem().getItem())) {
ComparableStack comp = AssemblerRecipes.recipeList.get(i);
allStacks.add(ItemAssemblyTemplate.writeType(new ItemStack(ModItems.assembly_template, 1, i), comp));
}
}
isJournal = true;
}
search(null);

View File

@ -1,6 +1,16 @@
package com.hbm.inventory.recipes;
import com.google.gson.Gson;
import static com.hbm.inventory.OreDictManager.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@ -8,142 +18,35 @@ import com.google.gson.stream.JsonWriter;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.GeneralConfig;
import com.hbm.inventory.OreDictManager;
import com.hbm.inventory.RecipesCommon.AStack;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.inventory.RecipesCommon.*;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.material.MaterialShapes;
import com.hbm.inventory.material.Mats;
import com.hbm.inventory.material.NTMMaterial;
import com.hbm.inventory.recipes.loader.SerializableRecipe;
import com.hbm.items.ItemAmmoEnums;
import com.hbm.items.ItemGenericPart.EnumPartType;
import com.hbm.items.ModItems;
import com.hbm.items.ItemGenericPart.EnumPartType;
import com.hbm.items.machine.ItemAssemblyTemplate;
import com.hbm.items.machine.ItemDrillbit.EnumDrillType;
import com.hbm.items.machine.ItemPistons.EnumPistonType;
import com.hbm.items.weapon.ItemAmmoHIMARS;
import com.hbm.main.MainRegistry;
import cpw.mods.fml.common.Loader;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;
import static com.hbm.inventory.OreDictManager.*;
public class AssemblerRecipes {
public static File config;
public static File template;
private static final Gson gson = new Gson();
public static HashMap<ComparableStack, AStack[]> recipes = new HashMap();
public static HashMap<ComparableStack, Integer> time = new HashMap();
public class AssemblerRecipes extends SerializableRecipe {
public static HashMap<ComparableStack, AssemblerRecipe> recipes = new HashMap();
public static List<ComparableStack> recipeList = new ArrayList();
public static HashMap<ComparableStack, HashSet<Item>> hidden = new HashMap();
/**
* Pre-Init phase: Finds the recipe config (if exists) and checks if a template is present, if not it generates one.
* @param dir The suggested config folder
*/
public static void preInit(File dir) {
if(dir == null || !dir.isDirectory())
return;
template = dir;
List<File> files = Arrays.asList(dir.listFiles());
for(File file : files) {
if(file.getName().equals("hbmAssembler.json")) {
config = file;
}
}
}
public static void loadRecipes() {
if(config == null) {
registerDefaults();
} else {
loadJSONRecipes();
}
generateList();
saveTemplateJSON(template);
}
/**
* Generates an ordered list of outputs, used by the template item to generate subitems
*/
private static void generateList() {
List<ComparableStack> list = new ArrayList(recipes.keySet());
Collections.sort(list);
recipeList = list;
}
public static ItemStack getOutputFromTempate(ItemStack stack) {
if(stack != null && stack.getItem() instanceof ItemAssemblyTemplate) {
ComparableStack comp = ItemAssemblyTemplate.readType(stack);
//NEW
if(comp != null) {
return comp.toStack();
}
//LEGACY
int i = stack.getItemDamage();
if(i >= 0 && i < recipeList.size()) {
return recipeList.get(i).toStack();
}
}
return null;
}
public static List<AStack> getRecipeFromTempate(ItemStack stack) {
if(stack != null && stack.getItem() instanceof ItemAssemblyTemplate) {
//NEW
ComparableStack compStack = ItemAssemblyTemplate.readType(stack);
if(compStack != null) {
AStack[] ret = recipes.get(compStack);
return ret == null ? null : Arrays.asList(ret);
}
//LEGACY
int i = stack.getItemDamage();
if(i >= 0 && i < recipeList.size()) {
ItemStack out = recipeList.get(i).toStack();
if(out != null) {
ComparableStack comp = new ComparableStack(out);
AStack[] ret = recipes.get(comp);
return ret == null ? null : Arrays.asList(ret);
}
}
}
return null;
}
/**
* Registers regular recipes if there's no custom configuration
*/
private static void registerDefaults() {
@Override
public void registerDefaults() {
boolean exp = GeneralConfig.enableExpensiveMode;
@ -308,7 +211,7 @@ public class AssemblerRecipes {
makeRecipe(new ComparableStack(ModBlocks.nuke_fleija, 1), new AStack[] {new ComparableStack(ModItems.hull_small_aluminium, 1), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit_targeting_tier4, 2), new ComparableStack(ModItems.wire_gold, 8), new OreDictStack("dyeWhite", 4), },400);
makeRecipe(new ComparableStack(ModBlocks.nuke_solinium, 1), new AStack[] {new ComparableStack(ModItems.hull_small_steel, 2), new ComparableStack(ModItems.fins_quad_titanium, 1), new ComparableStack(ModItems.circuit_targeting_tier4, 3), new ComparableStack(ModItems.wire_gold, 10), new ComparableStack(ModItems.pipes_steel, 4), new OreDictStack("dyeGray", 4), },400);
makeRecipe(new ComparableStack(ModBlocks.nuke_n2, 1), new AStack[] {new ComparableStack(ModItems.hull_big_steel, 3), new ComparableStack(ModItems.hull_small_steel, 2), new ComparableStack(ModItems.wire_magnetized_tungsten, 12), new ComparableStack(ModItems.pipes_steel, 6), new ComparableStack(ModItems.circuit_targeting_tier4, 3), new OreDictStack("dyeBlack", 12), },300);
makeRecipe(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new AStack[] {new ComparableStack(ModItems.sphere_steel, 1), new ComparableStack(ModItems.hull_big_titanium, 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.wire_gold, 12), new ComparableStack(ModItems.circuit_targeting_tier4, 4), new OreDictStack("dyeGray", 6), },600);
makeRecipe(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new AStack[] {new ComparableStack(ModItems.sphere_steel, 1), new ComparableStack(ModItems.hull_big_titanium, 6), new ComparableStack(ModItems.fins_big_steel, 1), new ComparableStack(ModItems.powder_magic, 8), new ComparableStack(ModItems.wire_gold, 12), new ComparableStack(ModItems.circuit_targeting_tier4, 4), new OreDictStack("dyeGray", 6), },600, ModItems.journal_pip, ModItems.journal_bj);
makeRecipe(new ComparableStack(ModBlocks.nuke_custom, 1), new AStack[] {new ComparableStack(ModItems.hull_small_steel, 2), new ComparableStack(ModItems.fins_small_steel, 1), new ComparableStack(ModItems.circuit_gold, 1), new ComparableStack(ModItems.wire_gold, 12), new OreDictStack("dyeGray", 4), },300);
makeRecipe(new ComparableStack(ModBlocks.float_bomb, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.levitation_unit, 1), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.wire_gold, 6), },250);
makeRecipe(new ComparableStack(ModBlocks.therm_endo, 1), new AStack[] {new OreDictStack(TI.plate(), 12), new ComparableStack(ModItems.powder_ice, 32), new ComparableStack(ModItems.circuit_gold, 1), new ComparableStack(ModItems.coil_gold, 4), },250);
@ -397,15 +300,15 @@ public class AssemblerRecipes {
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_buster, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(TI.plate(), 4), new ComparableStack(ModBlocks.det_charge, 1), new ComparableStack(ModBlocks.det_cord, 4), new ComparableStack(ModItems.board_copper, 4), new ComparableStack(ModItems.circuit_targeting_tier3, 1), },100);
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_nuclear, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(PU239.ingot(), 1), new OreDictStack(OreDictManager.getReflector(), 2), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 4), new ComparableStack(ModItems.circuit_targeting_tier3, 1), },200);
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_nuclear_large, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 8), new OreDictStack(AL.plate(), 4), new OreDictStack(PU239.ingot(), 2), new ComparableStack(ModBlocks.det_charge, 4), new ComparableStack(ModItems.circuit_targeting_tier4, 1), },300);
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new ComparableStack(ModItems.bucket_mud, 1), },100);
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2), },100);
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.powder_magic, 12), new ComparableStack(ModItems.bucket_mud, 1), },100, ModItems.journal_pip);
makeRecipe(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new AStack[] {new ComparableStack(ModItems.seg_10, 1), new OreDictStack(STEEL.plate(), 12), new ComparableStack(ModBlocks.det_cord, 2), new ComparableStack(ModItems.grenade_pink_cloud, 2), },100, ModItems.journal_pip);
makeRecipe(new ComparableStack(ModItems.mp_warhead_15_he, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_charge, 4), new ComparableStack(ModItems.circuit_targeting_tier3, 1), },200);
makeRecipe(new ComparableStack(ModItems.mp_warhead_15_incendiary, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 16), new ComparableStack(ModBlocks.det_charge, 2), new OreDictStack(P_RED.dust(), 8), new ComparableStack(ModItems.circuit_targeting_tier3, 1), },200);
makeRecipe(new ComparableStack(ModItems.mp_warhead_15_nuclear, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 24), new OreDictStack(TI.plate(), 12), new OreDictStack(PU239.ingot(), 3), new ComparableStack(ModBlocks.det_charge, 6), new ComparableStack(ModItems.circuit_targeting_tier4, 1), },500);
makeRecipe(new ComparableStack(ModItems.mp_warhead_15_n2, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(STEEL.plate(), 8), new OreDictStack(TI.plate(), 20), new ComparableStack(ModBlocks.det_charge, 24), new ComparableStack(Blocks.redstone_block, 12), new OreDictStack(MAGTUNG.dust(), 6), new ComparableStack(ModItems.circuit_targeting_tier4, 1), },400);
makeRecipe(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 6), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit_targeting_tier4, 1), }, 60);
makeRecipe(new ComparableStack(ModItems.missile_soyuz, 1), new AStack[] {new ComparableStack(ModItems.rocket_fuel, 40), new ComparableStack(ModBlocks.det_cord, 20), new ComparableStack(ModItems.thruster_medium, 12), new ComparableStack(ModItems.thruster_small, 12), new ComparableStack(ModItems.tank_steel, 10), new ComparableStack(ModItems.circuit_targeting_tier4, 2), new ComparableStack(ModItems.circuit_targeting_tier3, 8), new OreDictStack(RUBBER.ingot(), 64), new ComparableStack(ModItems.fins_small_steel, 4), new ComparableStack(ModItems.hull_big_titanium, 32), new ComparableStack(ModItems.hull_big_steel, 18), new OreDictStack(FIBER.ingot(), 64), },600);
makeRecipe(new ComparableStack(ModItems.missile_soyuz_lander, 1), new AStack[] {new ComparableStack(ModItems.rocket_fuel, 10), new ComparableStack(ModItems.thruster_small, 3), new ComparableStack(ModItems.tank_steel, 2), new ComparableStack(ModItems.circuit_targeting_tier3, 4), new OreDictStack(ANY_RUBBER.ingot(), 32), new ComparableStack(ModItems.hull_big_aluminium, 2), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(FIBER.ingot(), 12), },600);
makeRecipe(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new AStack[] {new ComparableStack(ModItems.seg_15, 1), new OreDictStack(OreDictManager.getReflector(), 16), new ComparableStack(ModItems.powder_magic, 6), new ComparableStack(ModItems.egg_balefire_shard, 4), new OreDictStack(ANY_HIGHEXPLOSIVE.ingot(), 8), new ComparableStack(ModItems.circuit_targeting_tier4, 1), }, 60, ModItems.journal_bj);
makeRecipe(new ComparableStack(ModItems.missile_soyuz, 1), new AStack[] {new ComparableStack(ModItems.rocket_fuel, 40), new ComparableStack(ModBlocks.det_cord, 20), new ComparableStack(ModItems.thruster_medium, 12), new ComparableStack(ModItems.thruster_small, 12), new ComparableStack(ModItems.tank_steel, 10), new ComparableStack(ModItems.circuit_targeting_tier4, 2), new ComparableStack(ModItems.circuit_targeting_tier3, 8), new OreDictStack(RUBBER.ingot(), 64), new ComparableStack(ModItems.fins_small_steel, 4), new ComparableStack(ModItems.hull_big_titanium, 32), new ComparableStack(ModItems.hull_big_steel, 18), new OreDictStack(FIBER.ingot(), 64), },600, ModItems.journal_bj);
makeRecipe(new ComparableStack(ModItems.missile_soyuz_lander, 1), new AStack[] {new ComparableStack(ModItems.rocket_fuel, 10), new ComparableStack(ModItems.thruster_small, 3), new ComparableStack(ModItems.tank_steel, 2), new ComparableStack(ModItems.circuit_targeting_tier3, 4), new OreDictStack(ANY_RUBBER.ingot(), 32), new ComparableStack(ModItems.hull_big_aluminium, 2), new ComparableStack(ModItems.sphere_steel, 1), new OreDictStack(FIBER.ingot(), 12), },600, ModItems.journal_bj);
makeRecipe(new ComparableStack(ModItems.fusion_shield_tungsten, 1), new AStack[] {new OreDictStack(W.block(), 32), new OreDictStack(OreDictManager.getReflector(), 96)}, 600);
makeRecipe(new ComparableStack(ModItems.fusion_shield_desh, 1), new AStack[] {new OreDictStack(DESH.block(), 16), new OreDictStack(CO.block(), 16), new OreDictStack(BIGMT.plate(), 96)}, 600);
makeRecipe(new ComparableStack(ModItems.fusion_shield_chlorophyte, 1), new AStack[] {new OreDictStack(W.block(), 16), new OreDictStack(DURA.block(), 16), new OreDictStack(OreDictManager.getReflector(), 48), new ComparableStack(ModItems.powder_chlorophyte, 48)}, 600);
@ -669,7 +572,7 @@ public class AssemblerRecipes {
new ComparableStack(ModItems.coin_radiation, 1),
new ComparableStack(ModItems.coin_maskman, 1),
new ComparableStack(ModItems.coin_worm, 1),
}, 1200);
}, 1200, ModItems.journal_bj);
makeRecipe(new ComparableStack(ModBlocks.vault_door, 1), new AStack[] {
new OreDictStack(STEEL.ingot(), 32),
@ -1060,7 +963,7 @@ public class AssemblerRecipes {
if(!GeneralConfig.enable528) {
makeRecipe(new ComparableStack(ModBlocks.machine_hephaestus, 1), new AStack[] { new ComparableStack(ModItems.pipes_steel, 1), !exp ? new OreDictStack(STEEL.ingot(), 24) : new OreDictStack(STEEL.heavyComp(), 2), !exp ? new OreDictStack(CU.plate(), 24) : new OreDictStack(CU.heavyComp(), 2), new OreDictStack(NB.ingot(), 4), new OreDictStack(RUBBER.ingot(), 12), new ComparableStack(ModBlocks.glass_quartz, 16) }, 150);
makeRecipe(new ComparableStack(ModBlocks.machine_radgen, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new ComparableStack(ModItems.wire_magnetized_tungsten, 24), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1), },400);
makeRecipe(new ComparableStack(ModBlocks.machine_radgen, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(STEEL.plate(), 32), new ComparableStack(ModItems.coil_magnetized_tungsten, 6), new ComparableStack(ModItems.wire_magnetized_tungsten, 24), new ComparableStack(ModItems.circuit_gold, 4), new ComparableStack(ModItems.reactor_core, 3), new OreDictStack(STAR.ingot(), 1), new OreDictStack("dyeRed", 1), }, 400, ModItems.journal_pip);
makeRecipe(new ComparableStack(ModBlocks.machine_reactor_breeding, 1), new AStack[] {new ComparableStack(ModItems.reactor_core, 1), new OreDictStack(STEEL.ingot(), 12), new OreDictStack(PB.plate(), 16), new ComparableStack(ModBlocks.reinforced_glass, 4), new OreDictStack(ASBESTOS.ingot(), 4), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.crt_display, 1)},150);
makeRecipe(new ComparableStack(ModBlocks.reactor_research, 1), new AStack[] {new OreDictStack(STEEL.ingot(), 8), new OreDictStack(ANY_RESISTANTALLOY.ingot(), 4), new ComparableStack(ModItems.motor_desh, 2), new OreDictStack(B.ingot(), 5), new OreDictStack(PB.plate(), 8), new ComparableStack(ModItems.crt_display, 3), new ComparableStack(ModItems.circuit_copper, 2), },300);
@ -1269,298 +1172,142 @@ public class AssemblerRecipes {
makeRecipe(new ComparableStack(ModItems.heavy_component, 1, mat.id), new AStack[] { new OreDictStack(MaterialShapes.CASTPLATE.name() + mat.names[0], 256) }, 12_000);
}
}
/// HIDDEN ///
hidden.put(new ComparableStack(ModBlocks.machine_radgen, 1), new HashSet() {{ add(ModItems.journal_pip); }});
hidden.put(new ComparableStack(ModBlocks.nuke_fstbmb, 1), new HashSet() {{ add(ModItems.journal_pip); add(ModItems.journal_bj); }});
hidden.put(new ComparableStack(ModItems.mp_warhead_10_cloud, 1), new HashSet() {{ add(ModItems.journal_pip); }});
hidden.put(new ComparableStack(ModItems.mp_warhead_10_taint, 1), new HashSet() {{ add(ModItems.journal_pip); }});
hidden.put(new ComparableStack(ModItems.mp_warhead_15_balefire, 1), new HashSet() {{ add(ModItems.journal_bj); }});
hidden.put(new ComparableStack(ModItems.sat_gerald, 1), new HashSet() {{ add(ModItems.journal_bj); }});
hidden.put(new ComparableStack(ModItems.missile_soyuz, 1), new HashSet() {{ add(ModItems.journal_bj); }});
hidden.put(new ComparableStack(ModItems.missile_soyuz_lander, 1), new HashSet() {{ add(ModItems.journal_bj); }});
}
public static void makeRecipe(ComparableStack out, AStack[] in, int duration) {
makeRecipe(out, in, duration, ModItems.template_folder);
}
public static void makeRecipe(ComparableStack out, AStack[] in, int duration, Item... folder) {
if(out == null || Item.itemRegistry.getNameForObject(out.item) == null) {
MainRegistry.logger.error("Canceling assembler registration, item was null!");
return;
}
recipes.put(out, in);
time.put(out, duration);
AssemblerRecipe recipe = new AssemblerRecipe(in, duration, folder);
recipes.put(out, recipe);
recipeList.add(out);
}
@Override
public String getFileName() {
return "hbmAssembler.json";
}
@Override
public Object getRecipeObject() {
return this.recipes;
}
@Override
public void deleteRecipes() {
recipes.clear();
recipeList.clear();
}
@Override
public void readRecipe(JsonElement recipe) {
JsonObject obj = recipe.getAsJsonObject();
ItemStack output = this.readItemStack(obj.get("output").getAsJsonArray());
AStack[] input = this.readAStackArray(obj.get("input").getAsJsonArray());
int duration = obj.get("duration").getAsInt();
if(obj.has("folders")) {
JsonArray array = obj.get("folders").getAsJsonArray();
List<Item> items = new ArrayList();
for(JsonElement element : array) {
Item item = (Item) Item.itemRegistry.getObject(element.getAsString());
if(item != null) items.add(item);
}
this.makeRecipe(new ComparableStack(output), input, duration, items.toArray(new Item[0]));
} else {
this.makeRecipe(new ComparableStack(output), input, duration);
}
}
@Override
public void writeRecipe(Object recipe, JsonWriter writer) throws IOException {
Entry<ComparableStack, AssemblerRecipe> entry = (Entry<ComparableStack, AssemblerRecipe>) recipe;
writer.name("output");
this.writeItemStack(entry.getKey().toStack(), writer);
writer.name("input").beginArray();
for(AStack stack : entry.getValue().ingredients) this.writeAStack(stack, writer);
writer.endArray();
writer.name("duration").value(entry.getValue().time);
if(entry.getValue().folders.size() != 1 || !entry.getValue().folders.contains(ModItems.template_folder)) {
writer.name("folders").beginArray();
for(Item folder : entry.getValue().folders) writer.value(Item.itemRegistry.getNameForObject(folder));
writer.endArray();
}
}
public static ItemStack getOutputFromTempate(ItemStack stack) {
if(stack != null && stack.getItem() instanceof ItemAssemblyTemplate) {
ComparableStack comp = ItemAssemblyTemplate.readType(stack);
//NEW
if(comp != null) {
return comp.toStack();
}
//LEGACY
int i = stack.getItemDamage();
if(i >= 0 && i < recipeList.size()) {
return recipeList.get(i).toStack();
}
}
return null;
}
public static List<AStack> getRecipeFromTempate(ItemStack stack) {
if(stack != null && stack.getItem() instanceof ItemAssemblyTemplate) {
//NEW
ComparableStack compStack = ItemAssemblyTemplate.readType(stack);
if(compStack != null) {
AssemblerRecipe recipe = recipes.get(compStack);
AStack[] ret = recipe.ingredients;
return ret == null ? null : Arrays.asList(ret);
}
//LEGACY
int i = stack.getItemDamage();
if(i >= 0 && i < recipeList.size()) {
ItemStack out = recipeList.get(i).toStack();
if(out != null) {
ComparableStack comp = new ComparableStack(out);
AssemblerRecipe recipe = recipes.get(comp);
AStack[] ret = recipe.ingredients;
return ret == null ? null : Arrays.asList(ret);
}
}
}
return null;
}
public static void addTantalium(ComparableStack out, int amount) {
AStack[] ins = recipes.get(out);
AssemblerRecipe recipe = recipes.get(out);
if(ins != null) {
if(recipe != null) {
AStack[] news = new AStack[ins.length + 1];
AStack[] news = new AStack[recipe.ingredients.length + 1];
for(int i = 0; i < ins.length; i++)
news[i] = ins[i];
for(int i = 0; i < recipe.ingredients.length; i++)
news[i] = recipe.ingredients[i];
news[news.length - 1] = new ComparableStack(ModItems.circuit_tantalium, amount);
recipes.put(out, news);
}
}
/*
* {
* recipes : [
* {
* output : [ "item", "hbm:item.tank_steel", 1, 0 ],
* duration : 100,
* input : [
* [ "dict", "blockSteel", 6 ],
* [ "dict", "plateTitanium", 2 ],
* [ "dict", "dyeGray", 1 ],
* ]
* },
* {
* output : [ "item", "hbm:plate_gold", 2, 0 ],
* duration : 20,
* input : [
* [ "dict", "ingotGold", 3 ],
* [ "item", "hbm:item.wire_gold", 5 ]
* ]
* }
* ]
* }
*/
private static void loadJSONRecipes() {
try {
JsonObject json = gson.fromJson(new FileReader(config), JsonObject.class);
JsonElement recipes = json.get("recipes");
if(recipes instanceof JsonArray) {
JsonArray recArray = recipes.getAsJsonArray();
//go through the recipes array
for(JsonElement recipe : recArray) {
if(recipe.isJsonObject()) {
JsonObject recObj = recipe.getAsJsonObject();
JsonElement input = recObj.get("input");
JsonElement output = recObj.get("output");
JsonElement duration = recObj.get("duration");
int time = 100;
if(duration.isJsonPrimitive()) {
if(duration.getAsJsonPrimitive().isNumber()) {
time = Math.max(1, duration.getAsJsonPrimitive().getAsInt());
}
}
if(!(input instanceof JsonArray)) {
MainRegistry.logger.error("Error reading recipe, no input found!");
continue;
}
if(!(output instanceof JsonArray)) {
MainRegistry.logger.error("Error reading recipe, no output found!");
continue;
}
Object outp = parseJsonArray(output.getAsJsonArray());
List inp = new ArrayList();
for(JsonElement in : input.getAsJsonArray()) {
if(in.isJsonArray()) {
Object i = parseJsonArray(in.getAsJsonArray());
if(i instanceof ComparableStack || i instanceof OreDictStack)
inp.add(i);
}
}
if(outp instanceof ComparableStack) {
AssemblerRecipes.recipes.put((ComparableStack) outp, Arrays.copyOf(inp.toArray(), inp.size(), AStack[].class));
AssemblerRecipes.time.put((ComparableStack) outp, time);
}
}
}
}
} catch (Exception e) {
//shush
}
}
private static Object parseJsonArray(JsonArray array) {
boolean dict = false;
String item = "";
int stacksize = 1;
int meta = 0;
if(array.size() < 2)
return null;
//is index 0 "item" or "dict"?
if(array.get(0).isJsonPrimitive()) {
if(array.get(0).getAsString().equals("item")) {
dict = false;
} else if(array.get(0).getAsString().equals("dict")) {
dict = true;
} else {
MainRegistry.logger.error("Error reading recipe, stack array does not have 'item' or 'dict' label!");
return null;
}
} else {
MainRegistry.logger.error("Error reading recipe, label is not a valid data type!");
return null;
}
//is index 1 a string
if(array.get(1).isJsonPrimitive()) {
item = array.get(1).getAsString();
} else {
MainRegistry.logger.error("Error reading recipe, item string is not a valid data type!");
return null;
}
//if index 2 exists, eval it as a stacksize
if(array.size() > 2 && array.get(2).isJsonPrimitive()) {
if(array.get(2).getAsJsonPrimitive().isNumber()) {
stacksize = Math.max(1, array.get(2).getAsJsonPrimitive().getAsNumber().intValue());
} else {
MainRegistry.logger.error("Error reading recipe, stack size is not a valid data type!");
return null;
}
}
//ore dict implementation
if(dict) {
if(OreDictionary.doesOreNameExist(item)) {
return new OreDictStack(item, stacksize);
} else {
MainRegistry.logger.error("Error reading recipe, ore dict name does not exist!");
return null;
}
//comparable stack
} else {
//if index 4 exists, eval it as a meta
if(array.size() > 3 && array.get(3).isJsonPrimitive()) {
if(array.get(3).getAsJsonPrimitive().isNumber()) {
meta = Math.max(0, array.get(3).getAsJsonPrimitive().getAsNumber().intValue());
} else {
MainRegistry.logger.error("Error reading recipe, metadata is not a valid data type!");
return null;
}
}
Item it = (Item)Item.itemRegistry.getObject(item);
if(it == null) {
MainRegistry.logger.error("Item could not be found!");
return null;
}
return new ComparableStack(it, stacksize, meta);
}
}
public static void saveTemplateJSON(File dir) {
template = new File(dir.getAbsolutePath() + File.separatorChar + "_hbmAssembler.json");
try {
JsonWriter writer = new JsonWriter(new FileWriter(template));
writer.setIndent(" ");
writer.beginObject();
writer.name("recipes").beginArray();
for(ComparableStack output : recipeList) {
writer.beginObject();
writer.name("output").beginArray();
writer.setIndent("");
writer.value("item");
writer.value(Item.itemRegistry.getNameForObject(output.toStack().getItem()));
writer.value(output.stacksize);
if(output.meta > 0)
writer.value(output.meta);
writer.endArray();
writer.setIndent(" ");
writer.name("input").beginArray();
AStack[] inputs = recipes.get(output);
for(AStack astack : inputs) {
writer.beginArray();
writer.setIndent("");
if(astack instanceof ComparableStack) {
ComparableStack comp = (ComparableStack) astack;
writer.value("item");
writer.value(Item.itemRegistry.getNameForObject(comp.toStack().getItem()));
writer.value(comp.stacksize);
if(comp.meta > 0)
writer.value(comp.meta);
}
if(astack instanceof OreDictStack) {
OreDictStack ore = (OreDictStack) astack;
writer.value("dict");
writer.value(ore.name);
writer.value(ore.stacksize);
}
writer.endArray();
writer.setIndent(" ");
}
writer.endArray();
writer.name("duration").value(time.get(output));
writer.endObject();
}
writer.endArray();
writer.endObject();
writer.close();
} catch(IOException e) {
//shush
recipe.ingredients = news;
}
}
@ -1568,18 +1315,13 @@ public class AssemblerRecipes {
Map<ItemStack, List<Object>> recipes = new HashMap();
for(Entry<ComparableStack, AStack[]> entry : AssemblerRecipes.recipes.entrySet()) {
for(Entry<ComparableStack, AssemblerRecipe> entry : AssemblerRecipes.recipes.entrySet()) {
List<Object> value = new ArrayList();
AssemblerRecipe recipe = entry.getValue();
for(AStack o : entry.getValue()) {
if(o instanceof ComparableStack) {
value.add(((ComparableStack)o).toStack());
} else if(o instanceof OreDictStack) {
value.add(((OreDictStack)o).extractForNEI());
}
for(AStack o : recipe.ingredients) {
value.add(o.extractForNEI());
}
recipes.put(entry.getKey().toStack(), value);
@ -1587,4 +1329,22 @@ public class AssemblerRecipes {
return recipes;
}
public static class AssemblerRecipe {
public AStack[] ingredients;
public int time;
public HashSet<Item> folders;
public AssemblerRecipe(AStack[] ingredients, int time) {
this(ingredients, time, ModItems.template_folder);
}
public AssemblerRecipe(AStack[] ingredients, int time, Item... folder) {
this.ingredients = ingredients;
this.time = time;
this.folders = new HashSet();
for(Item item : folder) this.folders.add(item);
}
}
}

View File

@ -12,6 +12,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.AssemblerRecipes;
import com.hbm.inventory.recipes.AssemblerRecipes.AssemblerRecipe;
import com.hbm.items.ItemAmmoEnums.*;
import com.hbm.items.ItemEnums.EnumChunkType;
import com.hbm.items.ModItems;
@ -1058,10 +1059,10 @@ public class AnvilRecipes {
public static void pullFromAssembler(ComparableStack result, int tier) {
AStack[] ingredients = AssemblerRecipes.recipes.get(result);
AssemblerRecipe recipe = AssemblerRecipes.recipes.get(result);
if(ingredients != null) {
constructionRecipes.add(new AnvilConstructionRecipe(ingredients, new AnvilOutput(result.toStack())).setTier(tier));
if(recipe != null) {
constructionRecipes.add(new AnvilConstructionRecipe(recipe.ingredients, new AnvilOutput(result.toStack())).setTier(tier));
}
}

View File

@ -67,6 +67,7 @@ public abstract class SerializableRecipe {
recipeHandlers.add(new ElectrolyserMetalRecipes());
recipeHandlers.add(new ArcWelderRecipes());
recipeHandlers.add(new ExposureChamberRecipes());
recipeHandlers.add(new AssemblerRecipes());
recipeHandlers.add(new MatDistribution());
recipeHandlers.add(new CustomMachineRecipes());

View File

@ -7,6 +7,7 @@ import java.util.List;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.inventory.recipes.AssemblerRecipes;
import com.hbm.inventory.recipes.AssemblerRecipes.AssemblerRecipe;
import com.hbm.items.ModItems;
import com.hbm.util.I18nUtil;
@ -37,8 +38,9 @@ public class ItemAssemblyTemplate extends Item {
public IIcon getIconFromDamage(int meta) {
ComparableStack stack = AssemblerRecipes.recipeList.get(meta);
AssemblerRecipe recipe = AssemblerRecipes.recipes.get(stack);
if(AssemblerRecipes.hidden.get(stack) != null)
if(recipe != null && !recipe.folders.contains(ModItems.template_folder))
return this.hiddenIcon;
return this.itemIcon;
@ -52,7 +54,9 @@ public class ItemAssemblyTemplate extends Item {
//LEGACY
if(out == null) out = AssemblerRecipes.recipeList.get(stack.getItemDamage());
if(AssemblerRecipes.hidden.get(out) != null)
AssemblerRecipe recipe = AssemblerRecipes.recipes.get(stack);
if(recipe != null && !recipe.folders.contains(ModItems.template_folder))
return this.hiddenIcon;
return this.itemIcon;
@ -144,12 +148,11 @@ public class ItemAssemblyTemplate extends Item {
ComparableStack out = readType(stack);
//LEGACY
if(out == null) out = AssemblerRecipes.recipeList.get(i);
Integer time = AssemblerRecipes.time.get(out);
if(time != null)
return time;
else
return 100;
AssemblerRecipe recipe = AssemblerRecipes.recipes.get(out);
if(recipe != null) return recipe.time;
return 100;
}
@Override
@ -174,7 +177,14 @@ public class ItemAssemblyTemplate extends Item {
out = AssemblerRecipes.recipeList.get(i);
nbtType = false;
}
HashSet<Item> folders = AssemblerRecipes.hidden.get(out);
AssemblerRecipe recipe = AssemblerRecipes.recipes.get(out);
if(recipe == null) {
list.add("I AM ERROR");
return;
}
HashSet<Item> folders = recipe.folders;
if(folders == null)
folders = new HashSet() {
@ -206,7 +216,7 @@ public class ItemAssemblyTemplate extends Item {
return;
}
Object[] in = AssemblerRecipes.recipes.get(out);
Object[] in = recipe.ingredients;
if(in == null) {
list.add("I AM ERROR");

View File

@ -285,7 +285,6 @@ public class MainRegistry {
Satellite.register();
HTTPHandler.loadStats();
CraftingManager.mainRegistry();
AssemblerRecipes.preInit(PreEvent.getModConfigurationDirectory());
SiegeTier.registerTiers();
HazardRegistry.registerItems();
HazardRegistry.registerTrafos();
@ -843,11 +842,9 @@ public class MainRegistry {
@EventHandler
public static void PostLoad(FMLPostInitializationEvent PostEvent) {
TileEntityNukeFurnace.registerFuels();
AssemblerRecipes.loadRecipes();
MagicRecipes.register();
LemegetonRecipes.register();
SILEXRecipes.register();
AnvilRecipes.register();
RefineryRecipes.registerRefinery();
GasCentrifugeRecipes.register();
@ -856,6 +853,9 @@ public class MainRegistry {
//the good stuff
SerializableRecipe.registerAllHandlers();
SerializableRecipe.initialize();
//Anvil has to come after serializables (i.e. anvil)
AnvilRecipes.register();
//has to register after cracking, and therefore after all serializable recipes
RadiolysisRecipes.registerRadiolysis();