fixed acidizer not differentiating recipes by acid type

This commit is contained in:
Bob 2023-02-07 22:10:56 +01:00
parent 3192331173
commit 2b63226bfc
8 changed files with 77 additions and 58 deletions

View File

@ -9,6 +9,7 @@ import java.util.Set;
import com.hbm.config.ToolConfig;
import com.hbm.explosion.ExplosionNT;
import com.hbm.explosion.ExplosionNT.ExAttrib;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.CentrifugeRecipes;
import com.hbm.inventory.recipes.CrystallizerRecipes;
import com.hbm.inventory.recipes.CrystallizerRecipes.CrystallizerRecipe;
@ -440,7 +441,7 @@ public abstract class ToolAbility {
block = Blocks.redstone_ore;
ItemStack stack = new ItemStack(block, 1, meta);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(stack);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(stack, Fluids.ACID);
if(result != null) {
world.setBlockToAir(x, y, z);

View File

@ -4,8 +4,10 @@ import java.util.HashMap;
import com.hbm.inventory.FluidStack;
import com.hbm.inventory.RecipesCommon;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.CrystallizerRecipes.CrystallizerRecipe;
import com.hbm.util.Tuple.Pair;
import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage;
import net.minecraft.item.ItemStack;
@ -13,7 +15,7 @@ import net.minecraft.nbt.NBTTagCompound;
public class IMCCrystallizer extends IMCHandler {
public static HashMap<Object, CrystallizerRecipe> buffer = new HashMap();
public static HashMap<Pair<Object, FluidType>, CrystallizerRecipe> buffer = new HashMap();
@Override
public void process(IMCMessage message) {
@ -40,15 +42,16 @@ public class IMCCrystallizer extends IMCHandler {
if(acid.type == Fluids.NONE)
acid = new FluidStack(Fluids.ACID, 500);
CrystallizerRecipe recipe = new CrystallizerRecipe(out, time, acid);
CrystallizerRecipe recipe = new CrystallizerRecipe(out, time);
recipe.acidAmount = acid.fill;
if(in != null) {
buffer.put(new RecipesCommon.ComparableStack(in), recipe);
buffer.put(new Pair(new RecipesCommon.ComparableStack(in), acid.type), recipe);
} else {
String dict = data.getString("oredict");
if(!dict.isEmpty()) {
buffer.put(dict, recipe);
buffer.put(new Pair(dict, acid.type), recipe);
} else {
this.printError(message, "Input stack could not be read!");
}

View File

@ -324,18 +324,18 @@ public class CentrifugeRecipes extends SerializableRecipe {
new ItemStack(ModItems.ore_enriched, 1, i) });
EnumByproduct tier1 = ore.byproducts[0];
ItemStack by1 = tier1 == null ? new ItemStack(ModItems.dust) : DictFrame.fromOne(ModItems.ore_byproduct, tier1, 2);
ItemStack by1 = tier1 == null ? new ItemStack(ModItems.dust) : DictFrame.fromOne(ModItems.ore_byproduct, tier1, 1);
recipes.put(new ComparableStack(ModItems.ore_nitrated, 1, i), new ItemStack[] {
new ItemStack(ModItems.ore_nitrocrystalline, 2, i),
new ItemStack(ModItems.ore_nitrocrystalline, 2, i),
new ItemStack(ModItems.ore_nitrocrystalline, 1, i),
new ItemStack(ModItems.ore_nitrocrystalline, 1, i),
ItemStackUtil.carefulCopy(by1),
ItemStackUtil.carefulCopy(by1) });
EnumByproduct tier2 = ore.byproducts[1];
ItemStack by2 = tier2 == null ? new ItemStack(ModItems.dust) : DictFrame.fromOne(ModItems.ore_byproduct, tier2, 2);
ItemStack by2 = tier2 == null ? new ItemStack(ModItems.dust) : DictFrame.fromOne(ModItems.ore_byproduct, tier2, 1);
recipes.put(new ComparableStack(ModItems.ore_deepcleaned, 1, i), new ItemStack[] {
new ItemStack(ModItems.ore_enriched, 2, i),
new ItemStack(ModItems.ore_enriched, 2, i),
new ItemStack(ModItems.ore_enriched, 1, i),
new ItemStack(ModItems.ore_enriched, 1, i),
ItemStackUtil.carefulCopy(by2),
ItemStackUtil.carefulCopy(by2) });
}

View File

@ -10,12 +10,14 @@ import com.hbm.handler.imc.IMCCrystallizer;
import com.hbm.inventory.FluidStack;
import com.hbm.inventory.RecipesCommon.ComparableStack;
import com.hbm.inventory.RecipesCommon.OreDictStack;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemFluidIcon;
import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre;
import com.hbm.items.special.ItemPlasticScrap.ScrapType;
import com.hbm.main.MainRegistry;
import com.hbm.util.Tuple.Pair;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
@ -29,7 +31,7 @@ import net.minecraftforge.oredict.OreDictionary;
public class CrystallizerRecipes {
//'Object' is either a ComparableStack or the key for the ore dict
private static HashMap<Object, CrystallizerRecipe> recipes = new HashMap();
private static HashMap<Pair<Object, FluidType>, CrystallizerRecipe> recipes = new HashMap();
public static void register() {
@ -43,35 +45,35 @@ public class CrystallizerRecipes {
registerRecipe(REDSTONE.ore(), new CrystallizerRecipe(ModItems.crystal_redstone, baseTime));
registerRecipe(LAPIS.ore(), new CrystallizerRecipe(ModItems.crystal_lapis, baseTime));
registerRecipe(DIAMOND.ore(), new CrystallizerRecipe(ModItems.crystal_diamond, baseTime));
registerRecipe(U.ore(), new CrystallizerRecipe(ModItems.crystal_uranium, baseTime, sulfur));
registerRecipe(TH232.ore(), new CrystallizerRecipe(ModItems.crystal_thorium, baseTime, sulfur));
registerRecipe(PU.ore(), new CrystallizerRecipe(ModItems.crystal_plutonium, baseTime, sulfur));
registerRecipe(TI.ore(), new CrystallizerRecipe(ModItems.crystal_titanium, baseTime, sulfur));
registerRecipe(U.ore(), new CrystallizerRecipe(ModItems.crystal_uranium, baseTime), sulfur);
registerRecipe(TH232.ore(), new CrystallizerRecipe(ModItems.crystal_thorium, baseTime), sulfur);
registerRecipe(PU.ore(), new CrystallizerRecipe(ModItems.crystal_plutonium, baseTime), sulfur);
registerRecipe(TI.ore(), new CrystallizerRecipe(ModItems.crystal_titanium, baseTime), sulfur);
registerRecipe(S.ore(), new CrystallizerRecipe(ModItems.crystal_sulfur, baseTime));
registerRecipe(KNO.ore(), new CrystallizerRecipe(ModItems.crystal_niter, baseTime));
registerRecipe(CU.ore(), new CrystallizerRecipe(ModItems.crystal_copper, baseTime));
registerRecipe(W.ore(), new CrystallizerRecipe(ModItems.crystal_tungsten, baseTime, sulfur));
registerRecipe(W.ore(), new CrystallizerRecipe(ModItems.crystal_tungsten, baseTime), sulfur);
registerRecipe(AL.ore(), new CrystallizerRecipe(ModItems.crystal_aluminium, baseTime));
registerRecipe(F.ore(), new CrystallizerRecipe(ModItems.crystal_fluorite, baseTime));
registerRecipe(BE.ore(), new CrystallizerRecipe(ModItems.crystal_beryllium, baseTime));
registerRecipe(PB.ore(), new CrystallizerRecipe(ModItems.crystal_lead, baseTime));
registerRecipe(SA326.ore(), new CrystallizerRecipe(ModItems.crystal_schrabidium, baseTime, sulfur));
registerRecipe(LI.ore(), new CrystallizerRecipe(ModItems.crystal_lithium, baseTime, sulfur));
registerRecipe(STAR.ore(), new CrystallizerRecipe(ModItems.crystal_starmetal, baseTime, sulfur));
registerRecipe(CO.ore(), new CrystallizerRecipe(ModItems.crystal_cobalt, baseTime, sulfur));
registerRecipe(SA326.ore(), new CrystallizerRecipe(ModItems.crystal_schrabidium, baseTime), sulfur);
registerRecipe(LI.ore(), new CrystallizerRecipe(ModItems.crystal_lithium, baseTime), sulfur);
registerRecipe(STAR.ore(), new CrystallizerRecipe(ModItems.crystal_starmetal, baseTime), sulfur);
registerRecipe(CO.ore(), new CrystallizerRecipe(ModItems.crystal_cobalt, baseTime), sulfur);
registerRecipe("oreRareEarth", new CrystallizerRecipe(ModItems.crystal_rare, baseTime, sulfur));
registerRecipe("oreRareEarth", new CrystallizerRecipe(ModItems.crystal_rare, baseTime), sulfur);
registerRecipe("oreCinnabar", new CrystallizerRecipe(ModItems.crystal_cinnebar, baseTime));
registerRecipe(new ComparableStack(ModBlocks.ore_nether_fire), new CrystallizerRecipe(ModItems.crystal_phosphorus, baseTime));
registerRecipe(new ComparableStack(ModBlocks.ore_tikite), new CrystallizerRecipe(ModItems.crystal_trixite, baseTime, sulfur));
registerRecipe(new ComparableStack(ModBlocks.ore_tikite), new CrystallizerRecipe(ModItems.crystal_trixite, baseTime), sulfur);
registerRecipe(new ComparableStack(ModBlocks.gravel_diamond), new CrystallizerRecipe(ModItems.crystal_diamond, baseTime));
registerRecipe(SRN.ingot(), new CrystallizerRecipe(ModItems.crystal_schraranium, baseTime));
registerRecipe("sand", new CrystallizerRecipe(ModItems.ingot_fiberglass, utilityTime));
registerRecipe(REDSTONE.block(), new CrystallizerRecipe(ModItems.ingot_mercury, baseTime));
registerRecipe(CINNABAR.crystal(), new CrystallizerRecipe(new ItemStack(ModItems.ingot_mercury, 3), baseTime));
registerRecipe(BORAX.dust(), new CrystallizerRecipe(new ItemStack(ModItems.powder_boron_tiny, 3), baseTime, sulfur));
registerRecipe(BORAX.dust(), new CrystallizerRecipe(new ItemStack(ModItems.powder_boron_tiny, 3), baseTime), sulfur);
registerRecipe(COAL.block(), new CrystallizerRecipe(ModBlocks.block_graphite, baseTime));
registerRecipe(new ComparableStack(Blocks.cobblestone), new CrystallizerRecipe(ModBlocks.reinforced_stone, utilityTime));
@ -88,7 +90,7 @@ public class CrystallizerRecipes {
registerRecipe(new ComparableStack(ModItems.powder_meteorite), new CrystallizerRecipe(ModItems.fragment_meteorite, utilityTime));
registerRecipe(new ComparableStack(ModItems.meteorite_sword_treated), new CrystallizerRecipe(ModItems.meteorite_sword_etched, baseTime));
registerRecipe(new ComparableStack(ModItems.powder_impure_osmiridium), new CrystallizerRecipe(ModItems.crystal_osmiridium, baseTime, new FluidStack(Fluids.SCHRABIDIC, 1_000)));
registerRecipe(new ComparableStack(ModItems.powder_impure_osmiridium), new CrystallizerRecipe(ModItems.crystal_osmiridium, baseTime), new FluidStack(Fluids.SCHRABIDIC, 1_000));
for(int i = 0; i < ScrapType.values().length; i++) {
registerRecipe(new ComparableStack(ModItems.scrap_plastic, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.circuit_star_piece, 1, i), baseTime));
@ -103,9 +105,9 @@ public class CrystallizerRecipes {
int i = ore.ordinal();
registerRecipe(new ComparableStack(ModItems.ore_centrifuged, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_cleaned, 1, i), oreTime));
registerRecipe(new ComparableStack(ModItems.ore_separated, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_purified, 1, i), oreTime, sulfur));
registerRecipe(new ComparableStack(ModItems.ore_separated, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_nitrated, 1, i), oreTime, nitric));
registerRecipe(new ComparableStack(ModItems.ore_nitrocrystalline, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_deepcleaned, 1, i), oreTime, organic));
registerRecipe(new ComparableStack(ModItems.ore_separated, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_purified, 1, i), oreTime), sulfur);
registerRecipe(new ComparableStack(ModItems.ore_separated, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_nitrated, 1, i), oreTime), nitric);
registerRecipe(new ComparableStack(ModItems.ore_nitrocrystalline, 1, i), new CrystallizerRecipe(new ItemStack(ModItems.ore_deepcleaned, 1, i), oreTime), organic);
}
List<ItemStack> quartz = OreDictionary.getOres("crystalCertusQuartz");
@ -123,22 +125,25 @@ public class CrystallizerRecipes {
}
}
public static CrystallizerRecipe getOutput(ItemStack stack) {
public static CrystallizerRecipe getOutput(ItemStack stack, FluidType type) {
if(stack == null || stack.getItem() == null)
return null;
ComparableStack comp = new ComparableStack(stack.getItem(), 1, stack.getItemDamage());
Pair compKey = new Pair(comp, type);
if(recipes.containsKey(comp))
return recipes.get(comp);
if(recipes.containsKey(compKey))
return recipes.get(compKey);
String[] dictKeys = comp.getDictKeys();
for(String key : dictKeys) {
Pair dictKey = new Pair(key, type);
if(recipes.containsKey(key))
return recipes.get(key);
if(recipes.containsKey(dictKey))
return recipes.get(dictKey);
}
return null;
@ -148,43 +153,48 @@ public class CrystallizerRecipes {
HashMap<Object, Object> recipes = new HashMap<Object, Object>();
for(Entry<Object, CrystallizerRecipe> entry : CrystallizerRecipes.recipes.entrySet()) {
for(Entry<Pair<Object, FluidType>, CrystallizerRecipe> entry : CrystallizerRecipes.recipes.entrySet()) {
CrystallizerRecipe recipe = entry.getValue();
if(entry.getKey() instanceof String) {
OreDictStack stack = new OreDictStack((String) entry.getKey());
recipes.put(new Object[] {ItemFluidIcon.make(recipe.acid), stack}, recipe.output);
Pair<Object, FluidType> key = entry.getKey();
Object input = key.getKey();
FluidType acid = key.getValue();
if(input instanceof String) {
OreDictStack stack = new OreDictStack((String) input);
recipes.put(new Object[] {ItemFluidIcon.make(acid, recipe.acidAmount), stack}, recipe.output);
} else {
ComparableStack stack = (ComparableStack) entry.getKey();
ComparableStack stack = (ComparableStack) input;
if(stack.item == ModItems.scrap_plastic) continue;
recipes.put(new Object[] {ItemFluidIcon.make(recipe.acid), stack}, recipe.output);
recipes.put(new Object[] {ItemFluidIcon.make(acid, recipe.acidAmount), stack}, recipe.output);
}
}
return recipes;
}
// NYI
public static void registerRecipe(Object input, CrystallizerRecipe recipe) {
recipes.put(input, recipe);
registerRecipe(input, recipe, new FluidStack(Fluids.ACID, 500));
}
public static void registerRecipe(Object input, CrystallizerRecipe recipe, FluidStack stack) {
recipe.acidAmount = stack.fill;
recipes.put(new Pair(input, stack.type), recipe);
}
public static class CrystallizerRecipe {
public FluidStack acid;
public int acidAmount;
public int duration;
public ItemStack output;
public CrystallizerRecipe(Block output, int duration) { this(new ItemStack(output), duration, new FluidStack(Fluids.ACID, 500)); }
public CrystallizerRecipe(Item output, int duration) { this(new ItemStack(output), duration, new FluidStack(Fluids.ACID, 500)); }
public CrystallizerRecipe(ItemStack output, int duration) { this(output, duration, new FluidStack(Fluids.ACID, 500)); }
public CrystallizerRecipe(Block output, int duration, FluidStack acid) { this(new ItemStack(output), duration, acid); }
public CrystallizerRecipe(Item output, int duration, FluidStack acid) { this(new ItemStack(output), duration, acid); }
public CrystallizerRecipe(Block output, int duration) { this(new ItemStack(output), duration); }
public CrystallizerRecipe(Item output, int duration) { this(new ItemStack(output), duration); }
public CrystallizerRecipe(ItemStack output, int duration, FluidStack acid) {
public CrystallizerRecipe(ItemStack output, int duration) {
this.output = output;
this.duration = duration;
this.acid = acid;
this.acidAmount = 500;
}
}
}

View File

@ -139,7 +139,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme
private void processItem() {
CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0]);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0], tank.getTankType());
if(result == null) //never happens but you can't be sure enough
return;
@ -151,7 +151,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme
else if(slots[2].stackSize + stack.stackSize <= slots[2].getMaxStackSize())
slots[2].stackSize += stack.stackSize;
tank.setFill(tank.getFill() - result.acid.fill);
tank.setFill(tank.getFill() - result.acidAmount);
float freeChance = this.getFreeChance();
@ -168,14 +168,13 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme
if(power < getPowerRequired())
return false;
CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0]);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0], tank.getTankType());
//Or output?
if(result == null)
return false;
if(tank.getTankType() != result.acid.type) return false;
if(tank.getFill() < result.acid.fill) return false;
if(tank.getFill() < result.acidAmount) return false;
ItemStack stack = result.output.copy();
@ -225,7 +224,7 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme
public short getDuration() {
float durationMod = 1;
CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0]);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(slots[0], tank.getTankType());
int base = result != null ? result.duration : 600;
@ -336,9 +335,9 @@ public class TileEntityMachineCrystallizer extends TileEntityMachineBase impleme
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
CrystallizerRecipe recipe = CrystallizerRecipes.getOutput(itemStack);
CrystallizerRecipe recipe = CrystallizerRecipes.getOutput(itemStack, tank.getTankType());
if(i == 0 && recipe != null) {
return recipe.acid.type == tank.getTankType();
return true;
}
if(i == 1 && itemStack.getItem() instanceof IBatteryItem)

View File

@ -254,7 +254,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen
if(stack != null && stack.getItem() != null) {
if(hasCrystallizer()) {
CrystallizerRecipe result = CrystallizerRecipes.getOutput(stack);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(stack, Fluids.ACID);
if(result != null && result.output.getItem() != ModItems.scrap) {
worldObj.spawnEntityInWorld(new EntityItem(worldObj, targetX + 0.5, targetY + 0.5, targetZ + 0.5, result.output.copy()));
normal = false;

View File

@ -2363,7 +2363,10 @@ item.ore.tungsten=Wolfram
item.ore_bedrock.name=Bedrock-%serz
item.ore_centrifuged.name=Zentrifugiertes %serz
item.ore_cleaned.name=Gereinigtes %serz
item.ore_deepcleaned.name=Tiefengereinigtes %serz
item.ore_enriched.name=Reiches %serz
item.ore_nitrated.name=Nitriertes %serz
item.ore_nitrocrystalline.name=Nitrokristallines %serz
item.ore_purified.name=Pures %serz
item.ore_separated.name=Separiertes %serz
item.overfuse.name=Singularitätsschraubenzieher

View File

@ -3039,7 +3039,10 @@ item.ore.tungsten=Tungsten
item.ore_bedrock.name=%s Bedrock Ore
item.ore_centrifuged.name=Centrifuged %s Ore
item.ore_cleaned.name=Cleaned %s Ore
item.ore_deepcleaned.name=Deep Cleaned %s Ore
item.ore_enriched.name=Enriched %s Ore
item.ore_nitrated.name=Nitrated %s Ore
item.ore_nitrocrystalline.name=Nitrocrystalline %s Ore
item.ore_purified.name=Purified %s Ore
item.ore_separated.name=Separated %s Ore
item.overfuse.name=Singularity Screwdriver