From 25df777b84eb57f52bd188ac1ce90795230b7403 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Tue, 17 Feb 2015 21:27:35 -0500 Subject: [PATCH] Work on fusion fuel creation mechanics, allowed Chemical Washer to accept upgrades --- src/main/java/mekanism/api/gas/GasStack.java | 7 ++ .../client/gui/GuiChemicalWasher.java | 4 +- .../mekanism/client/gui/GuiElectricPump.java | 3 +- .../ElectrolyticSeparatorRecipeHandler.java | 61 +++++++++--------- .../client/render/MekanismRenderer.java | 2 + .../java/mekanism/common/HeatNetwork.java | 2 + src/main/java/mekanism/common/Mekanism.java | 21 +++--- .../java/mekanism/common/MekanismItems.java | 2 + src/main/java/mekanism/common/Upgrade.java | 5 +- .../common/item/ItemBlockMachine.java | 2 +- .../common/recipe/inputs/FluidInput.java | 5 +- .../common/recipe/inputs/GasInput.java | 9 ++- .../machines/ChemicalInfuserRecipe.java | 4 +- .../recipe/machines/CrystallizerRecipe.java | 4 +- .../recipe/machines/DissolutionRecipe.java | 4 +- .../recipe/machines/GasCentrifugeRecipe.java | 6 +- .../recipe/machines/OxidationRecipe.java | 4 +- .../recipe/machines/SeparatorRecipe.java | 4 +- .../common/recipe/machines/WasherRecipe.java | 8 +-- .../common/recipe/outputs/GasOutput.java | 8 ++- .../tile/TileEntityAmbientAccumulator.java | 4 +- .../common/tile/TileEntityBasicMachine.java | 1 + .../tile/TileEntityChemicalCrystallizer.java | 1 + .../TileEntityChemicalDissolutionChamber.java | 5 +- .../tile/TileEntityChemicalOxidizer.java | 3 + .../common/tile/TileEntityChemicalWasher.java | 55 +++++++++++++--- .../common/tile/TileEntityDigitalMiner.java | 1 + .../common/tile/TileEntityElectricPump.java | 43 ++++++++---- .../common/tile/TileEntityFactory.java | 1 + .../tile/TileEntityMetallurgicInfuser.java | 2 + .../tile/component/TileComponentUpgrade.java | 6 ++ .../mekanism/common/util/MekanismUtils.java | 12 +++- .../resources/assets/mekanism/lang/en_US.lang | 4 ++ .../mekanism/render/ChemicalCrystallizer.png | Bin 4807 -> 5493 bytes .../render/ChemicalDissolutionChamber.png | Bin 4656 -> 5769 bytes .../mekanism/render/ChemicalInfuser.png | Bin 2103 -> 4115 bytes .../assets/mekanism/render/ChemicalWasher.png | Bin 5342 -> 7088 bytes .../textures/blocks/LiquidHeavyWater.png | Bin 0 -> 13294 bytes .../blocks/LiquidHeavyWater.png.mcmeta | 5 ++ .../mekanism/textures/items/FilterUpgrade.png | Bin 0 -> 1435 bytes 40 files changed, 210 insertions(+), 98 deletions(-) create mode 100644 src/main/resources/assets/mekanism/textures/blocks/LiquidHeavyWater.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/LiquidHeavyWater.png.mcmeta create mode 100644 src/main/resources/assets/mekanism/textures/items/FilterUpgrade.png diff --git a/src/main/java/mekanism/api/gas/GasStack.java b/src/main/java/mekanism/api/gas/GasStack.java index ec1549163..05e5ae689 100644 --- a/src/main/java/mekanism/api/gas/GasStack.java +++ b/src/main/java/mekanism/api/gas/GasStack.java @@ -45,6 +45,13 @@ public class GasStack { return type; } + + public GasStack withAmount(int newAmount) + { + amount = newAmount; + + return this; + } /** * Writes this GasStack to a defined tag compound. diff --git a/src/main/java/mekanism/client/gui/GuiChemicalWasher.java b/src/main/java/mekanism/client/gui/GuiChemicalWasher.java index 9e2731031..30f650404 100644 --- a/src/main/java/mekanism/client/gui/GuiChemicalWasher.java +++ b/src/main/java/mekanism/client/gui/GuiChemicalWasher.java @@ -21,7 +21,6 @@ import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.tile.TileEntityChemicalWasher; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; - import net.minecraft.entity.player.InventoryPlayer; import net.minecraftforge.fluids.FluidTank; import cpw.mods.fml.relauncher.Side; @@ -40,12 +39,13 @@ public class GuiChemicalWasher extends GuiMekanism tileEntity = tentity; guiElements.add(new GuiRedstoneControl(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiChemicalWasher.png"))); + guiElements.add(new GuiUpgradeTab(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiChemicalWasher.png"))); guiElements.add(new GuiBucketIO(this, MekanismUtils.getResource(ResourceType.GUI, "GuiChemicalWasher.png"))); guiElements.add(new GuiEnergyInfo(new IInfoHandler() { @Override public List getInfo() { - String multiplier = MekanismUtils.getEnergyDisplay(tileEntity.ENERGY_USAGE); + String multiplier = MekanismUtils.getEnergyDisplay(tileEntity.energyUsage); return ListUtils.asList("Using: " + multiplier + "/t", "Needed: " + MekanismUtils.getEnergyDisplay(tileEntity.getMaxEnergy()-tileEntity.getEnergy())); } }, this, MekanismUtils.getResource(ResourceType.GUI, "GuiChemicalWasher.png"))); diff --git a/src/main/java/mekanism/client/gui/GuiElectricPump.java b/src/main/java/mekanism/client/gui/GuiElectricPump.java index dcc573ed8..feb84df06 100644 --- a/src/main/java/mekanism/client/gui/GuiElectricPump.java +++ b/src/main/java/mekanism/client/gui/GuiElectricPump.java @@ -8,7 +8,6 @@ import mekanism.common.tile.TileEntityElectricPump; import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; - import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidTank; @@ -41,7 +40,7 @@ public class GuiElectricPump extends GuiMekanism } }, GuiGauge.Type.STANDARD, this, guiLocation, 6, 13)); guiElements.add(new GuiRedstoneControl(this, tileEntity, guiLocation)); - + guiElements.add(new GuiUpgradeTab(this, tileEntity, guiLocation)); } @Override diff --git a/src/main/java/mekanism/client/nei/ElectrolyticSeparatorRecipeHandler.java b/src/main/java/mekanism/client/nei/ElectrolyticSeparatorRecipeHandler.java index 19ad4813d..9185bc26a 100644 --- a/src/main/java/mekanism/client/nei/ElectrolyticSeparatorRecipeHandler.java +++ b/src/main/java/mekanism/client/nei/ElectrolyticSeparatorRecipeHandler.java @@ -1,6 +1,10 @@ package mekanism.client.nei; -import java.awt.*; +import static codechicken.lib.gui.GuiDraw.changeTexture; +import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; + +import java.awt.Point; +import java.awt.Rectangle; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -22,11 +26,11 @@ import mekanism.client.gui.GuiSlot.SlotOverlay; import mekanism.client.gui.GuiSlot.SlotType; import mekanism.common.ObfuscatedNames; import mekanism.common.recipe.RecipeHandler.Recipe; -import mekanism.common.recipe.inputs.ChemicalPairInput; +import mekanism.common.recipe.inputs.FluidInput; +import mekanism.common.recipe.machines.SeparatorRecipe; import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; - import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraftforge.fluids.FluidStack; @@ -38,9 +42,6 @@ import codechicken.nei.PositionedStack; import codechicken.nei.recipe.GuiRecipe; import codechicken.nei.recipe.TemplateRecipeHandler; -import static codechicken.lib.gui.GuiDraw.changeTexture; -import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; - public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler { private int ticksPassed; @@ -110,7 +111,7 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler return "mekanism.electrolyticseparator"; } - public Set> getRecipes() + public Set> getRecipes() { return Recipe.ELECTROLYTIC_SEPARATOR.get().entrySet(); } @@ -135,21 +136,21 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler if(recipe.fluidInput != null) { - fluidInput.setDummyType(recipe.fluidInput.getFluid()); + fluidInput.setDummyType(recipe.fluidInput.ingredient.getFluid()); fluidInput.renderScale(0, 0, -xOffset, -yOffset); } - if(recipe.outputPair.leftGas != null) + if(recipe.outputPair.recipeOutput.leftGas != null) { - displayGauge(28, 59-xOffset, 19-yOffset, 176, 68, 28, null, recipe.outputPair.leftGas); - leftGas.setDummyType(recipe.outputPair.leftGas.getGas()); + displayGauge(28, 59-xOffset, 19-yOffset, 176, 68, 28, null, recipe.outputPair.recipeOutput.leftGas); + leftGas.setDummyType(recipe.outputPair.recipeOutput.leftGas.getGas()); leftGas.renderScale(0, 0, -xOffset, -yOffset); } - if(recipe.outputPair.rightGas != null) + if(recipe.outputPair.recipeOutput.rightGas != null) { - displayGauge(28, 101-xOffset, 19-yOffset, 176, 68, 28, null, recipe.outputPair.rightGas); - rightGas.setDummyType(recipe.outputPair.rightGas.getGas()); + displayGauge(28, 101-xOffset, 19-yOffset, 176, 68, 28, null, recipe.outputPair.recipeOutput.rightGas); + rightGas.setDummyType(recipe.outputPair.recipeOutput.rightGas.getGas()); rightGas.renderScale(0, 0, -xOffset, -yOffset); } } @@ -180,9 +181,9 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler } else if(outputId.equals("gas") && results.length == 1 && results[0] instanceof GasStack) { - for(Map.Entry irecipe : getRecipes()) + for(Map.Entry irecipe : getRecipes()) { - if(irecipe.getValue().containsType((GasStack)results[0])) + if(irecipe.getValue().recipeOutput.containsType((GasStack)results[0])) { arecipes.add(new CachedIORecipe(irecipe)); } @@ -198,7 +199,7 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler { if(inputId.equals("fluid") && ingredients.length == 1 && ingredients[0] instanceof FluidStack) { - for(Map.Entry irecipe : getRecipes()) + for(Map.Entry irecipe : getRecipes()) { if(irecipe.getKey().isFluidEqual((FluidStack)ingredients[0])) { @@ -221,15 +222,15 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler if(xAxis >= 6 && xAxis <= 22 && yAxis >= 11+7 && yAxis <= 69+7) { - currenttip.add(LangUtils.localizeFluidStack(((CachedIORecipe)arecipes.get(recipe)).fluidInput)); + currenttip.add(LangUtils.localizeFluidStack(((CachedIORecipe)arecipes.get(recipe)).fluidInput.ingredient)); } else if(xAxis >= 59 && xAxis <= 75 && yAxis >= 19+7 && yAxis <= 47+7) { - currenttip.add(((CachedIORecipe)arecipes.get(recipe)).outputPair.leftGas.getGas().getLocalizedName()); + currenttip.add(((CachedIORecipe)arecipes.get(recipe)).outputPair.recipeOutput.leftGas.getGas().getLocalizedName()); } else if(xAxis >= 101 && xAxis <= 117 && yAxis >= 19+7 && yAxis <= 47+7) { - currenttip.add(((CachedIORecipe)arecipes.get(recipe)).outputPair.rightGas.getGas().getLocalizedName()); + currenttip.add(((CachedIORecipe)arecipes.get(recipe)).outputPair.recipeOutput.rightGas.getGas().getLocalizedName()); } return super.handleTooltip(gui, currenttip, recipe); @@ -248,15 +249,15 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler if(xAxis >= 6 && xAxis <= 22 && yAxis >= 11+7 && yAxis <= 69+7) { - fluid = ((CachedIORecipe)arecipes.get(recipe)).fluidInput; + fluid = ((CachedIORecipe)arecipes.get(recipe)).fluidInput.ingredient; } else if(xAxis >= 59 && xAxis <= 75 && yAxis >= 19+7 && yAxis <= 47+7) { - gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.leftGas; + gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.recipeOutput.leftGas; } else if(xAxis >= 101 && xAxis <= 117 && yAxis >= 19+7 && yAxis <= 47+7) { - gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.rightGas; + gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.recipeOutput.rightGas; } if(gas != null) @@ -310,15 +311,15 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler if(xAxis >= 6 && xAxis <= 22 && yAxis >= 11+7 && yAxis <= 69+7) { - fluid = ((CachedIORecipe)arecipes.get(recipe)).fluidInput; + fluid = ((CachedIORecipe)arecipes.get(recipe)).fluidInput.ingredient; } else if(xAxis >= 59 && xAxis <= 75 && yAxis >= 19+7 && yAxis <= 47+7) { - gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.leftGas; + gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.recipeOutput.leftGas; } else if(xAxis >= 101 && xAxis <= 117 && yAxis >= 19+7 && yAxis <= 47+7) { - gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.rightGas; + gas = ((CachedIORecipe)arecipes.get(recipe)).outputPair.recipeOutput.rightGas; } if(gas != null) @@ -367,8 +368,8 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler public class CachedIORecipe extends TemplateRecipeHandler.CachedRecipe { - public FluidStack fluidInput; - public ChemicalPairInput outputPair; + public FluidInput fluidInput; + public SeparatorRecipe outputPair; @Override public PositionedStack getResult() @@ -376,7 +377,7 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler return null; } - public CachedIORecipe(FluidStack input, ChemicalPairInput pair) + public CachedIORecipe(FluidInput input, SeparatorRecipe pair) { fluidInput = input; outputPair = pair; @@ -384,7 +385,7 @@ public class ElectrolyticSeparatorRecipeHandler extends BaseRecipeHandler public CachedIORecipe(Map.Entry recipe) { - this((FluidStack)recipe.getKey(), (ChemicalPairInput)recipe.getValue()); + this((FluidInput)recipe.getKey(), (SeparatorRecipe)recipe.getValue()); } } } diff --git a/src/main/java/mekanism/client/render/MekanismRenderer.java b/src/main/java/mekanism/client/render/MekanismRenderer.java index 859026932..80a593886 100644 --- a/src/main/java/mekanism/client/render/MekanismRenderer.java +++ b/src/main/java/mekanism/client/render/MekanismRenderer.java @@ -110,11 +110,13 @@ public class MekanismRenderer } FluidRegistry.getFluid("brine").setIcons(event.map.registerIcon("mekanism:LiquidBrine")); + FluidRegistry.getFluid("heavywater").setIcons(event.map.registerIcon("mekanism:LiquidHeavyWater")); if(RenderPartTransmitter.getInstance() != null) { RenderPartTransmitter.getInstance().resetDisplayInts(); } + RenderDynamicTank.resetDisplayInts(); RenderSalinationController.resetDisplayInts(); RenderPortableTank.resetDisplayInts(); diff --git a/src/main/java/mekanism/common/HeatNetwork.java b/src/main/java/mekanism/common/HeatNetwork.java index 234f9eb76..dc07ce67c 100644 --- a/src/main/java/mekanism/common/HeatNetwork.java +++ b/src/main/java/mekanism/common/HeatNetwork.java @@ -136,6 +136,7 @@ public class HeatNetwork extends DynamicNetwork newHeatLost += d[1]; } } + for(IGridTransmitter transmitter : transmitters) { if(transmitter instanceof IHeatTransfer) @@ -145,6 +146,7 @@ public class HeatNetwork extends DynamicNetwork } } } + heatLost = newHeatLost; heatTransferred = newHeatTransferred; meanTemp = newSumTemp / transmitters.size(); diff --git a/src/main/java/mekanism/common/Mekanism.java b/src/main/java/mekanism/common/Mekanism.java index c9c8de4c2..90bfe42a7 100644 --- a/src/main/java/mekanism/common/Mekanism.java +++ b/src/main/java/mekanism/common/Mekanism.java @@ -32,7 +32,6 @@ import mekanism.common.Tier.EnergyCubeTier; import mekanism.common.Tier.FactoryTier; import mekanism.common.base.IFactory.RecipeType; import mekanism.common.base.IModule; -import mekanism.common.content.boiler.BoilerCache; import mekanism.common.content.boiler.BoilerManager; import mekanism.common.content.boiler.SynchronizedBoilerData; import mekanism.common.content.matrix.MatrixCache; @@ -75,7 +74,6 @@ import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import mekanism.common.voice.VoiceServerManager; import mekanism.common.world.GenHandler; - import net.minecraft.entity.EnumCreatureType; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -91,12 +89,20 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.event.world.ChunkDataEvent; import net.minecraftforge.event.world.ChunkEvent; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.RecipeSorter.Category; import net.minecraftforge.oredict.ShapelessOreRecipe; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import rebelkeithy.mods.metallurgy.api.IOreInfo; +import rebelkeithy.mods.metallurgy.api.MetallurgyAPI; +import codechicken.multipart.handler.MultipartProxy; import cpw.mods.fml.client.event.ConfigChangedEvent; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.IFuelHandler; @@ -114,12 +120,6 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; -import codechicken.multipart.handler.MultipartProxy; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import rebelkeithy.mods.metallurgy.api.IOreInfo; -import rebelkeithy.mods.metallurgy.api.MetallurgyAPI; - /** * Mekanism - a Minecraft mod * @author AidanBrady @@ -286,6 +286,9 @@ public class Mekanism CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(MekanismItems.EnergyUpgrade), new Object[] { " G ", "ADA", " G ", Character.valueOf('G'), "blockGlass", Character.valueOf('A'), MekanismItems.EnrichedAlloy, Character.valueOf('D'), "dustGold" })); + CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(MekanismItems.FilterUpgrade), new Object[] { + " G ", "ADA", " G ", Character.valueOf('G'), "blockGlass", Character.valueOf('A'), MekanismItems.EnrichedAlloy, Character.valueOf('D'), "dustTin" + })); CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(MekanismItems.AtomicDisassembler.getUnchargedItem(), new Object[] { "AEA", "ACA", " O ", Character.valueOf('A'), MekanismItems.EnrichedAlloy, Character.valueOf('E'), MekanismItems.EnergyTablet.getUnchargedItem(), Character.valueOf('C'), MekanismItems.AtomicAlloy, Character.valueOf('O'), "ingotRefinedObsidian" })); @@ -1038,6 +1041,8 @@ public class Mekanism GasRegistry.register(new Gas("fusionFuelDT")).registerFluid(); GasRegistry.register(new Gas("steam")).registerFluid(); + FluidRegistry.registerFluid(new Fluid("heavyWater")); + for(Resource resource : Resource.values()) { String name = resource.getName(); diff --git a/src/main/java/mekanism/common/MekanismItems.java b/src/main/java/mekanism/common/MekanismItems.java index 01b2bd201..b4669ebeb 100644 --- a/src/main/java/mekanism/common/MekanismItems.java +++ b/src/main/java/mekanism/common/MekanismItems.java @@ -50,6 +50,7 @@ public class MekanismItems public static final ItemEnergized EnergyTablet = (ItemEnergized)new ItemEnergized(1000000).setUnlocalizedName("EnergyTablet"); public static final Item SpeedUpgrade = new ItemUpgrade(Upgrade.SPEED).setUnlocalizedName("SpeedUpgrade"); public static final Item EnergyUpgrade = new ItemUpgrade(Upgrade.ENERGY).setUnlocalizedName("EnergyUpgrade"); + public static final Item FilterUpgrade = new ItemUpgrade(Upgrade.FILTER).setUnlocalizedName("FilterUpgrade"); public static final ItemRobit Robit = (ItemRobit)new ItemRobit().setUnlocalizedName("Robit"); public static final ItemAtomicDisassembler AtomicDisassembler = (ItemAtomicDisassembler)new ItemAtomicDisassembler().setUnlocalizedName("AtomicDisassembler"); public static final Item EnrichedIron = new ItemMekanism().setUnlocalizedName("EnrichedIron"); @@ -104,6 +105,7 @@ public class MekanismItems GameRegistry.registerItem(EnergyTablet, "EnergyTablet"); GameRegistry.registerItem(SpeedUpgrade, "SpeedUpgrade"); GameRegistry.registerItem(EnergyUpgrade, "EnergyUpgrade"); + GameRegistry.registerItem(FilterUpgrade, "HeavyWaterUpgrade"); GameRegistry.registerItem(Robit, "Robit"); GameRegistry.registerItem(AtomicDisassembler, "AtomicDisassembler"); GameRegistry.registerItem(EnrichedAlloy, "EnrichedAlloy"); diff --git a/src/main/java/mekanism/common/Upgrade.java b/src/main/java/mekanism/common/Upgrade.java index a900c652f..10abd55a6 100644 --- a/src/main/java/mekanism/common/Upgrade.java +++ b/src/main/java/mekanism/common/Upgrade.java @@ -19,7 +19,8 @@ import net.minecraftforge.common.util.Constants.NBT; public enum Upgrade { SPEED("speed", 8, EnumColor.RED), - ENERGY("energy", 8, EnumColor.BRIGHT_GREEN); + ENERGY("energy", 8, EnumColor.BRIGHT_GREEN), + FILTER("filter", 1, EnumColor.DARK_AQUA); private String name; private int maxStack; @@ -66,6 +67,8 @@ public enum Upgrade return new ItemStack(MekanismItems.SpeedUpgrade); case ENERGY: return new ItemStack(MekanismItems.EnergyUpgrade); + case FILTER: + return new ItemStack(MekanismItems.FilterUpgrade); } return null; diff --git a/src/main/java/mekanism/common/item/ItemBlockMachine.java b/src/main/java/mekanism/common/item/ItemBlockMachine.java index e4995aa1b..2f5ed6e70 100644 --- a/src/main/java/mekanism/common/item/ItemBlockMachine.java +++ b/src/main/java/mekanism/common/item/ItemBlockMachine.java @@ -521,7 +521,7 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec return itemstack; } - FluidStack fluid = MekanismUtils.getFluid(world, coord.xCoord, coord.yCoord, coord.zCoord); + FluidStack fluid = MekanismUtils.getFluid(world, coord.xCoord, coord.yCoord, coord.zCoord, false); if(fluid != null && (getFluidStack(itemstack) == null || getFluidStack(itemstack).isFluidEqual(fluid))) { diff --git a/src/main/java/mekanism/common/recipe/inputs/FluidInput.java b/src/main/java/mekanism/common/recipe/inputs/FluidInput.java index 54ac66181..72c230bc3 100644 --- a/src/main/java/mekanism/common/recipe/inputs/FluidInput.java +++ b/src/main/java/mekanism/common/recipe/inputs/FluidInput.java @@ -24,13 +24,14 @@ public class FluidInput extends MachineInput return ingredient != null; } - public boolean useFluid(FluidTank fluidTank, boolean deplete) + public boolean useFluid(FluidTank fluidTank, boolean deplete, int scale) { if(fluidTank.getFluid().containsFluid(ingredient)) { - fluidTank.drain(ingredient.amount, deplete); + fluidTank.drain(ingredient.amount*scale, deplete); return true; } + return false; } diff --git a/src/main/java/mekanism/common/recipe/inputs/GasInput.java b/src/main/java/mekanism/common/recipe/inputs/GasInput.java index 984cec26c..ccf9a0ed4 100644 --- a/src/main/java/mekanism/common/recipe/inputs/GasInput.java +++ b/src/main/java/mekanism/common/recipe/inputs/GasInput.java @@ -24,13 +24,15 @@ public class GasInput extends MachineInput return ingredient != null; } - public boolean useGas(GasTank gasTank, boolean deplete) + public boolean useGas(GasTank gasTank, boolean deplete, int scale) { - if(gasTank.getGasType() == ingredient.getGas() && gasTank.getStored() >= ingredient.amount) + if(gasTank.getGasType() == ingredient.getGas() && gasTank.getStored() >= ingredient.amount*scale) { - gasTank.draw(ingredient.amount, deplete); + gasTank.draw(ingredient.amount*scale, deplete); + return true; } + return false; } @@ -47,6 +49,7 @@ public class GasInput extends MachineInput { return !other.isValid(); } + return other.ingredient.hashCode() == ingredient.hashCode(); } diff --git a/src/main/java/mekanism/common/recipe/machines/ChemicalInfuserRecipe.java b/src/main/java/mekanism/common/recipe/machines/ChemicalInfuserRecipe.java index fb89ab12d..25f93cf36 100644 --- a/src/main/java/mekanism/common/recipe/machines/ChemicalInfuserRecipe.java +++ b/src/main/java/mekanism/common/recipe/machines/ChemicalInfuserRecipe.java @@ -24,14 +24,14 @@ public class ChemicalInfuserRecipe extends MachineRecipe return new GasOutput(output.copy()); } - public boolean applyOutputs(GasTank gasTank, boolean doEmit) + public boolean applyOutputs(GasTank gasTank, boolean doEmit, int scale) { - if(gasTank.canReceive(output.getGas()) && gasTank.getNeeded() >= output.amount) + if(gasTank.canReceive(output.getGas()) && gasTank.getNeeded() >= output.amount*scale) { - gasTank.receive(output.copy(), doEmit); + gasTank.receive(output.copy().withAmount(output.amount*scale), doEmit); + return true; } + return false; } } diff --git a/src/main/java/mekanism/common/tile/TileEntityAmbientAccumulator.java b/src/main/java/mekanism/common/tile/TileEntityAmbientAccumulator.java index 796c51c3f..fdf60644a 100644 --- a/src/main/java/mekanism/common/tile/TileEntityAmbientAccumulator.java +++ b/src/main/java/mekanism/common/tile/TileEntityAmbientAccumulator.java @@ -43,9 +43,9 @@ public class TileEntityAmbientAccumulator extends TileEntityContainerBlock imple cachedRecipe = RecipeHandler.getDimensionGas(new IntegerInput(cachedDimensionId)); } - if(cachedRecipe != null && gasRand.nextDouble() < 0.05 && cachedRecipe.getOutput().applyOutputs(collectedGas, false)) + if(cachedRecipe != null && gasRand.nextDouble() < 0.05 && cachedRecipe.getOutput().applyOutputs(collectedGas, false, 1)) { - cachedRecipe.getOutput().applyOutputs(collectedGas, true); + cachedRecipe.getOutput().applyOutputs(collectedGas, true, 1); } } } diff --git a/src/main/java/mekanism/common/tile/TileEntityBasicMachine.java b/src/main/java/mekanism/common/tile/TileEntityBasicMachine.java index 483f49517..403f631a1 100644 --- a/src/main/java/mekanism/common/tile/TileEntityBasicMachine.java +++ b/src/main/java/mekanism/common/tile/TileEntityBasicMachine.java @@ -238,6 +238,7 @@ public abstract class TileEntityBasicMachine, ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); case ENERGY: //and SPEED fall-through. energyPerTick = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_PER_TICK); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } diff --git a/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java b/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java index 66ecfec21..8a6dd21ad 100644 --- a/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java +++ b/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java @@ -502,6 +502,7 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); case ENERGY: energyUsage = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_USAGE); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } } diff --git a/src/main/java/mekanism/common/tile/TileEntityChemicalDissolutionChamber.java b/src/main/java/mekanism/common/tile/TileEntityChemicalDissolutionChamber.java index c882d75f0..2e903976f 100644 --- a/src/main/java/mekanism/common/tile/TileEntityChemicalDissolutionChamber.java +++ b/src/main/java/mekanism/common/tile/TileEntityChemicalDissolutionChamber.java @@ -214,16 +214,18 @@ public class TileEntityChemicalDissolutionChamber extends TileEntityNoisyElectri public double getScaledProgress() { - return ((double)operatingTicks) / ((double)BASE_TICKS_REQUIRED); + return ((double)operatingTicks) / ((double)ticksRequired); } public DissolutionRecipe getRecipe() { ItemStackInput input = getInput(); + if(cachedRecipe == null || !input.testEquality(cachedRecipe.getInput())) { cachedRecipe = RecipeHandler.getDissolutionRecipe(getInput()); } + return cachedRecipe; } @@ -464,6 +466,7 @@ public class TileEntityChemicalDissolutionChamber extends TileEntityNoisyElectri ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); case ENERGY: energyUsage = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_USAGE); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } } diff --git a/src/main/java/mekanism/common/tile/TileEntityChemicalOxidizer.java b/src/main/java/mekanism/common/tile/TileEntityChemicalOxidizer.java index 78a26f219..9da089444 100644 --- a/src/main/java/mekanism/common/tile/TileEntityChemicalOxidizer.java +++ b/src/main/java/mekanism/common/tile/TileEntityChemicalOxidizer.java @@ -201,10 +201,12 @@ public class TileEntityChemicalOxidizer extends TileEntityNoisyElectricBlock imp public OxidationRecipe getRecipe() { ItemStackInput input = getInput(); + if(cachedRecipe == null || !input.testEquality(cachedRecipe.getInput())) { cachedRecipe = RecipeHandler.getOxidizerRecipe(getInput()); } + return cachedRecipe; } @@ -384,6 +386,7 @@ public class TileEntityChemicalOxidizer extends TileEntityNoisyElectricBlock imp ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); case ENERGY: energyUsage = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_USAGE); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } } diff --git a/src/main/java/mekanism/common/tile/TileEntityChemicalWasher.java b/src/main/java/mekanism/common/tile/TileEntityChemicalWasher.java index 889d56121..356ed0763 100644 --- a/src/main/java/mekanism/common/tile/TileEntityChemicalWasher.java +++ b/src/main/java/mekanism/common/tile/TileEntityChemicalWasher.java @@ -1,5 +1,7 @@ package mekanism.common.tile; +import io.netty.buffer.ByteBuf; + import java.util.ArrayList; import mekanism.api.Coord4D; @@ -14,19 +16,21 @@ import mekanism.api.gas.IGasHandler; import mekanism.api.gas.IGasItem; import mekanism.api.gas.ITubeConnection; import mekanism.common.Mekanism; +import mekanism.common.Upgrade; import mekanism.common.base.IRedstoneControl; import mekanism.common.base.ISustainedData; +import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.inputs.GasInput; import mekanism.common.recipe.machines.WasherRecipe; +import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; import mekanism.common.util.FluidContainerUtils; import mekanism.common.util.InventoryUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.PipeUtils; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; @@ -42,9 +46,7 @@ import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidContainerItem; import net.minecraftforge.fluids.IFluidHandler; -import io.netty.buffer.ByteBuf; - -public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock implements IGasHandler, ITubeConnection, IRedstoneControl, IFluidHandler, ISustainedData +public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock implements IGasHandler, ITubeConnection, IRedstoneControl, IFluidHandler, IUpgradeTile, ISustainedData { public FluidTank fluidTank = new FluidTank(MAX_FLUID); public GasTank inputTank = new GasTank(MAX_GAS); @@ -65,9 +67,13 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple public double prevEnergy; - public final double ENERGY_USAGE = usage.chemicalWasherUsage; + public final double BASE_ENERGY_USAGE = usage.chemicalWasherUsage; + + public double energyUsage = usage.chemicalWasherUsage; public WasherRecipe cachedRecipe; + + public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 4); /** This machine's current RedstoneControl type. */ public RedstoneControl controlType = RedstoneControl.DISABLED; @@ -75,7 +81,7 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple public TileEntityChemicalWasher() { super("washer", "ChemicalWasher", MachineType.CHEMICAL_WASHER.baseEnergy); - inventory = new ItemStack[4]; + inventory = new ItemStack[5]; } @Override @@ -114,13 +120,13 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple outputTank.draw(GasTransmission.addGas(inventory[2], outputTank.getGas()), true); } - if(canOperate(recipe) && getEnergy() >= ENERGY_USAGE && MekanismUtils.canFunction(this)) + if(canOperate(recipe) && getEnergy() >= energyUsage && MekanismUtils.canFunction(this)) { setActive(true); operate(recipe); - setEnergy(getEnergy() - ENERGY_USAGE); + setEnergy(getEnergy() - energyUsage); } else { if(prevEnergy >= getEnergy()) @@ -151,10 +157,12 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple public WasherRecipe getRecipe() { GasInput input = getInput(); + if(cachedRecipe == null || !input.testEquality(cachedRecipe.getInput())) { cachedRecipe = RecipeHandler.getChemicalWasherRecipe(getInput()); } + return cachedRecipe; } @@ -170,7 +178,7 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple public void operate(WasherRecipe recipe) { - recipe.operate(inputTank, fluidTank, outputTank); + recipe.operate(inputTank, fluidTank, outputTank, getUpgradedUsage()); } private void manageBuckets() @@ -244,7 +252,15 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple } } } - + + public int getUpgradedUsage() + { + int possibleProcess = Math.min(inputTank.getStored(), outputTank.getNeeded()); + possibleProcess = Math.min((int)Math.pow(2, upgradeComponent.getUpgrades(Upgrade.SPEED)), possibleProcess); + + return Math.min(fluidTank.getFluidAmount()/WATER_USAGE, possibleProcess); + } + @Override public void handlePacketData(ByteBuf dataStream) { @@ -612,4 +628,23 @@ public class TileEntityChemicalWasher extends TileEntityNoisyElectricBlock imple inputTank.setGas(GasStack.readFromNBT(itemStack.stackTagCompound.getCompoundTag("inputTank"))); outputTank.setGas(GasStack.readFromNBT(itemStack.stackTagCompound.getCompoundTag("outputTank"))); } + + @Override + public TileComponentUpgrade getComponent() + { + return upgradeComponent; + } + + @Override + public void recalculateUpgradables(Upgrade upgrade) + { + super.recalculateUpgradables(upgrade); + + switch(upgrade) + { + case ENERGY: + energyUsage = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_USAGE); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); + } + } } diff --git a/src/main/java/mekanism/common/tile/TileEntityDigitalMiner.java b/src/main/java/mekanism/common/tile/TileEntityDigitalMiner.java index ce6759f6a..36f2a6b84 100644 --- a/src/main/java/mekanism/common/tile/TileEntityDigitalMiner.java +++ b/src/main/java/mekanism/common/tile/TileEntityDigitalMiner.java @@ -1478,6 +1478,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I delayLength = MekanismUtils.getTicks(this, 80); case ENERGY: energyUsage = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_USAGE); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } } diff --git a/src/main/java/mekanism/common/tile/TileEntityElectricPump.java b/src/main/java/mekanism/common/tile/TileEntityElectricPump.java index f03043769..7d3f212d4 100644 --- a/src/main/java/mekanism/common/tile/TileEntityElectricPump.java +++ b/src/main/java/mekanism/common/tile/TileEntityElectricPump.java @@ -1,5 +1,7 @@ package mekanism.common.tile; +import io.netty.buffer.ByteBuf; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -12,13 +14,15 @@ import mekanism.api.Coord4D; import mekanism.api.EnumColor; import mekanism.api.IConfigurable; import mekanism.api.MekanismConfig.usage; +import mekanism.common.Upgrade; import mekanism.common.base.IRedstoneControl; import mekanism.common.base.ISustainedTank; +import mekanism.common.base.IUpgradeTile; +import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; import mekanism.common.util.FluidContainerUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.PipeUtils; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -35,9 +39,7 @@ import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidContainerItem; import net.minecraftforge.fluids.IFluidHandler; -import io.netty.buffer.ByteBuf; - -public class TileEntityElectricPump extends TileEntityElectricBlock implements IFluidHandler, ISustainedTank, IConfigurable, IRedstoneControl +public class TileEntityElectricPump extends TileEntityElectricBlock implements IFluidHandler, ISustainedTank, IConfigurable, IRedstoneControl, IUpgradeTile { /** This pump's tank */ public FluidTank fluidTank = new FluidTank(10000); @@ -47,11 +49,16 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I /** This machine's current RedstoneControl type. */ public RedstoneControl controlType = RedstoneControl.DISABLED; + + public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 3); public TileEntityElectricPump() { super("ElectricPump", 10000); - inventory = new ItemStack[3]; + inventory = new ItemStack[4]; + + upgradeComponent.clearSupportedTypes(); + upgradeComponent.setSupported(Upgrade.FILTER); } @Override @@ -131,8 +138,7 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I suck(true); } } - else - { + else { ticker--; } } @@ -158,6 +164,11 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I } } } + + public boolean hasFilter() + { + return upgradeComponent.getInstalledTypes().contains(Upgrade.FILTER); + } public boolean suck(boolean take) { @@ -171,13 +182,13 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I if(MekanismUtils.isFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord)) { - if(fluidTank.getFluid() == null || MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord).isFluidEqual(fluidTank.getFluid())) + if(fluidTank.getFluid() == null || MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord, hasFilter()).isFluidEqual(fluidTank.getFluid())) { if(take) { setEnergy(getEnergy() - usage.electricPumpUsage); recurringNodes.add(wrapper.clone()); - fluidTank.fill(MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord), true); + fluidTank.fill(MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord, hasFilter()), true); worldObj.setBlockToAir(wrapper.xCoord, wrapper.yCoord, wrapper.zCoord); } @@ -192,12 +203,12 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I { if(MekanismUtils.isFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord)) { - if(fluidTank.getFluid() == null || MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord).isFluidEqual(fluidTank.getFluid())) + if(fluidTank.getFluid() == null || MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord, hasFilter()).isFluidEqual(fluidTank.getFluid())) { if(take) { setEnergy(getEnergy() - usage.electricPumpUsage); - fluidTank.fill(MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord), true); + fluidTank.fill(MekanismUtils.getFluid(worldObj, wrapper.xCoord, wrapper.yCoord, wrapper.zCoord, hasFilter()), true); worldObj.setBlockToAir(wrapper.xCoord, wrapper.yCoord, wrapper.zCoord); } @@ -214,13 +225,13 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I { if(MekanismUtils.isFluid(worldObj, side.xCoord, side.yCoord, side.zCoord)) { - if(fluidTank.getFluid() == null || MekanismUtils.getFluid(worldObj, side.xCoord, side.yCoord, side.zCoord).isFluidEqual(fluidTank.getFluid())) + if(fluidTank.getFluid() == null || MekanismUtils.getFluid(worldObj, side.xCoord, side.yCoord, side.zCoord, hasFilter()).isFluidEqual(fluidTank.getFluid())) { if(take) { setEnergy(getEnergy() - usage.electricPumpUsage); recurringNodes.add(side); - fluidTank.fill(MekanismUtils.getFluid(worldObj, side.xCoord, side.yCoord, side.zCoord), true); + fluidTank.fill(MekanismUtils.getFluid(worldObj, side.xCoord, side.yCoord, side.zCoord, hasFilter()), true); worldObj.setBlockToAir(side.xCoord, side.yCoord, side.zCoord); } @@ -495,4 +506,10 @@ public class TileEntityElectricPump extends TileEntityElectricBlock implements I { return true; } + + @Override + public TileComponentUpgrade getComponent() + { + return upgradeComponent; + } } diff --git a/src/main/java/mekanism/common/tile/TileEntityFactory.java b/src/main/java/mekanism/common/tile/TileEntityFactory.java index 7b05752f2..229b3f916 100644 --- a/src/main/java/mekanism/common/tile/TileEntityFactory.java +++ b/src/main/java/mekanism/common/tile/TileEntityFactory.java @@ -944,6 +944,7 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I secondaryEnergyPerTick = MekanismUtils.getSecondaryEnergyPerTickMean(this, recipeType.getSecondaryEnergyPerTick()); case ENERGY: energyPerTick = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_PER_TICK); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } } \ No newline at end of file diff --git a/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java b/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java index 8d6d7d722..6e83fa87b 100644 --- a/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java +++ b/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java @@ -241,6 +241,7 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i for(Object obj : Recipe.METALLURGIC_INFUSER.get().keySet()) { InfusionInput input = (InfusionInput)obj; + if(input.inputStack.isItemEqual(itemstack)) { return true; @@ -543,6 +544,7 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i ticksRequired = MekanismUtils.getTicks(this, BASE_TICKS_REQUIRED); case ENERGY: energyPerTick = MekanismUtils.getEnergyPerTick(this, BASE_ENERGY_PER_TICK); + maxEnergy = MekanismUtils.getMaxEnergy(this, BASE_MAX_ENERGY); } } } \ No newline at end of file diff --git a/src/main/java/mekanism/common/tile/component/TileComponentUpgrade.java b/src/main/java/mekanism/common/tile/component/TileComponentUpgrade.java index 7e2d1ba73..f750d170c 100644 --- a/src/main/java/mekanism/common/tile/component/TileComponentUpgrade.java +++ b/src/main/java/mekanism/common/tile/component/TileComponentUpgrade.java @@ -142,6 +142,11 @@ public class TileComponentUpgrade implements ITileComponent { return supported; } + + public void clearSupportedTypes() + { + supported.clear(); + } @Override public void read(ByteBuf dataStream) @@ -181,6 +186,7 @@ public class TileComponentUpgrade implements ITileComponent public void read(NBTTagCompound nbtTags) { upgrades = Upgrade.buildMap(nbtTags); + for(Upgrade upgrade : getSupportedTypes()) { tileEntity.recalculateUpgradables(upgrade); diff --git a/src/main/java/mekanism/common/util/MekanismUtils.java b/src/main/java/mekanism/common/util/MekanismUtils.java index 59d4c5db1..630430e2f 100644 --- a/src/main/java/mekanism/common/util/MekanismUtils.java +++ b/src/main/java/mekanism/common/util/MekanismUtils.java @@ -745,7 +745,7 @@ public final class MekanismUtils */ public static boolean isFluid(World world, int x, int y, int z) { - return getFluid(world, x, y, z) != null; + return getFluid(world, x, y, z, false) != null; } /** @@ -756,7 +756,7 @@ public final class MekanismUtils * @param z - z coordinate * @return the fluid at the certain location, null if it doesn't exist */ - public static FluidStack getFluid(World world, int x, int y, int z) + public static FluidStack getFluid(World world, int x, int y, int z, boolean filter) { Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); @@ -768,7 +768,13 @@ public final class MekanismUtils if((block == Blocks.water || block == Blocks.flowing_water) && meta == 0) { - return new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME); + if(!filter) + { + return new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME); + } + else { + return new FluidStack(FluidRegistry.getFluid("heavywater"), 10); + } } else if((block == Blocks.lava || block == Blocks.flowing_lava) && meta == 0) { diff --git a/src/main/resources/assets/mekanism/lang/en_US.lang b/src/main/resources/assets/mekanism/lang/en_US.lang index fcc6c1cb1..9fcc00c43 100644 --- a/src/main/resources/assets/mekanism/lang/en_US.lang +++ b/src/main/resources/assets/mekanism/lang/en_US.lang @@ -10,6 +10,7 @@ item.AtomicAlloy.name=Atomic Alloy item.EnergyTablet.name=Energy Tablet item.SpeedUpgrade.name=Speed Upgrade item.EnergyUpgrade.name=Energy Upgrade +item.FilterUpgrade.name=Filter Upgrade item.Robit.name=Robit item.AtomicDisassembler.name=Atomic Disassembler item.ElectricBow.name=Electric Bow @@ -275,6 +276,7 @@ fluid.hydrogenChloride=Liquid Hydrogen Chloride fluid.brine=Brine fluid.ethene=Liquid Ethylene fluid.sodium=Liquid Sodium +fluid.heavyWater=Heavy Water //OreGas names oregas.iron=Iron Ore @@ -299,6 +301,8 @@ upgrade.energy=Energy upgrade.energy.desc=Increases energy efficiency !nand capacity of machinery. upgrade.speed=Speed upgrade.speed.desc=Increases speed of machinery. +upgrade.filter=Filter +upgrade.filter.desc=A filter that separates !nheavy water from regular water. //Key description text key.mode=Mode Switch diff --git a/src/main/resources/assets/mekanism/render/ChemicalCrystallizer.png b/src/main/resources/assets/mekanism/render/ChemicalCrystallizer.png index ff177a7f109cb79a0c556801eeef9266818f4de9..c4d0ff88e2e59e2191d75f909372aad568688172 100644 GIT binary patch literal 5493 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 literal 4807 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 QKb-)SfvJ8e(k}9U0QLz2{r~^~ diff --git a/src/main/resources/assets/mekanism/render/ChemicalDissolutionChamber.png b/src/main/resources/assets/mekanism/render/ChemicalDissolutionChamber.png index 06241ca67c01b8add03a7e0932db2e43f73dee34..7b1e34027b91469b0d0ac37af85ec16a699721f6 100644 GIT binary patch literal 5769 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 literal 4656 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 XrKBY8PR8heA9A|)^tB2!tV8|>i{P-y literal 5342 zcma)AXIN89yWOBv=?6&&O^8S*bb?fs-ULAfh0sJ02wiEB(1g(CP?ajxf`XzHsfH5i zVCdD*TaaEPzy&<#yZ6_<_s5=Rmzj6gTJJmSnLUw4hFbKr5Ly5L=ykN!Zvg<=$t@5> zO?lGJe5pA7aNgmX!8HK*7=M9eLviv<hbbRYj;Qq#JNAs`kw|)w6I{^zP---6&&pnkol=4 zi>4@o*3~4??7*+xM7^(^P`Y_xCEL59*G5LJ@PIuM!$tomKE-w0sVNM(q7o#c)f>{) zRnoXPtdW+L6@lL@lgP{pZ*6^4Sy@AiFT?xlKVfUUi6yMtz*Q6&a5$Wew-Rk*o()*j z$DQ?=;s_(hq2PB{)|n?Yz9Oes>BGYMxfd5|ilneku^PF>kMTI6XkSb4vGf!U(snOx9si}#3@>h42!46^7Zf}1c9hM#V zTZoP^{8ias^9k!y#hHk%hq4P77m?2L-cGbRniE73ho5mFE>-i@~LZ?5-HZ_l9j0exLXY*d4_sQV5Hg3kAj z*!zEmjE{^k1O#k-*ILX~fLkA2vgG_KD6#VbWNV=$WvOo=Q)vOOsNngb(YWKNq${#h zEH`Kfb0~vgo>TthZA*TG`0HW3@oKyI47dHSvRfTAt;%5~I1c@wW4;T`-aYu1O&dJQwQml+nw)^ zc20lOgtEh=Z$OBSo}A@AFR7w1T8(Hn^ZKL@Z6=yyl}TbYtLd&?<$lF|b=Cui(v~bp}znNVpPO)2#4-kvOehR`M@AyiEZUJGOe{8Wq~|;RX5H zrJgPj-ag&4X-L43{n42G8A3wj$GMP4=l$G!sQ;#&pAv*YXv((IL6>ddJgVhxu5Q?w zt;<_a{NF_U$vzVY`4wc-cL-H|Ebaxr`bG|liDCU{w_f=IK{cxYS)~;94rP0Fo;0Oo zVbPpmI5s&vsuN3LJHw2C)Dnq-`aXNZ-tC`E&GDE|1}}FF@3|u%F3YOdu;r$yF zz8`kCq(l?QBQr9KO#Tv^2*(m4Yg=1oR_J%}dPezLzFl@t?cpx22Tz49*=gz!;Q{ha3?}cx+VK9J(4m6ETxTMfUaR*_x#~kR%(#+AQe+6Hv zI&|~h#+kE(bGO-W1%<~6#f52bw~CB{k04|{%TNS_94VbIkex&(zR%4QYm$c}c9of3 znMu@)@RcY}pQvA4R89WS7Kfa=3y&cl6sDIUxkbK2#4M|*Ymn%0vOm}vw4^-}wES%& z6G+nJIb>>Un-_wqUwU3bw?UO9{pR+M@c3wnt4i8s`?U}%4A%4?cLPdX4{gP-mkHp4LGLg1a8I|M@b!9>896}~>#-OD2r})lcx%lLf z8!aP?vo3dT&^Ig(b|M=PZUT|?!8-2L#-lN;Oto#{$oCXXjPuM{C=<3OjXFQc`JEj( zPEFnoW>(pg)#x)V2z-;DKgmjR0m<~Jsbn%B+uN(W)9x8;jgGSTJI|GGyjLv2OBb2U zg|tZz!sg*Ek{06my~dn|h603*4PgY_Ba0^@pRWCnPlk<-#ZN}nD&_&)0foH>_fd4c z>GHfRzS%`_`%ANxyo|Czgb>gLHi%Qk4@sH z2k4E8@ZIxr@$3~Z&Md{~TkV7^>*OT42u0+_c;Mp(`~Z`P>`M0SkA`Z`&7dqo6s8w~ zc-_XgJmubPG%~7^pl*=OrzQct-=j@iP+ENmnGL@F!Ed_9(ID85C{@=Txree&Fi8K2 z!+RmEv$`RnV=KrGr?tSqqDHUHnp{2DNKIZz){FaQ)X%Hr11qWHxU2l$R}4F(Hy3EW zj+HQ9%+@!2S*lq3+1*sJHlycOvp zYcutSJNNgt2dy0F)vB^XUr>bv9HYebPo!F=gne0y63GKJ&ka{UX4=n2AMM|S2K|Y) zdsLOqD<6>l_*^d@=sDO7(L0^A>v=sVS<-<*n%^Ze5}xXYGP#-E!v1zb^avCPC(Tml zjCFtOI7guT8QCzF9dEtnsu-(wGLD8@gaaVXTh9esuXYDeopD(>WdFVVtMrr4vi8yN@3cENFm*^-H9T6(QA{R5k;7}P7=V^#ks;Uo z&LS;xSdi1M(O{3Af1s~-3FRMn*3St5ldY*4?HoB>9yu5yK^js!oX-=dPwA{#-SJ}X zK~1g!O!2@O47I&2l3C|G(6LL8g^8Ug6L$C}6&I_6 zdwruB6EWMF=<;;|(F58NubG>B_ZDYdUW`Z_527bGb=`O5CKWIkhb_shfyCDA(gwbp;&SMK9RqH(L%cRiE#a0mxvqyZlgYd0_imQj)3_xUi_- zBw$YugJDCfhfDTdq2nT-*9kghRkG)lpIBy}qCpQ(yp3uoSnJPow)%kWIlzzF#Q=9= zBX+4B)t%}L_WE9ZSTI=BVP-E>fIrUjZ+v?CV{+MIyTjf$6N)arb5-H~L-U2lZ}K%l z3Vy6jgIgqb6bv=^{Pk~=eSk3H$qa-xx~0TSXcNCSFmWjhZ|D7n>MOWqgC4RY=D%l` ze)(}KQ^?w7iT%^qc!kFos#$aO0~Oh*ByD8+f~~?(}m<2zRtdt zw)99LoQJTM>XGsLMi2GHZ*LKg<481CBAFRtWuh1`;Ut0>Ma-K9Nm|ZtER?C!qCX`= za+rHfZIgY+fIcm3KEs28HHoDQcXRV`&CS{Vg>}q1*k#WBzsmp6=>smAZ4Y5grf?GGk)%PU%ujSLnE~Fs*{#y&`v=DU+>t%}QXf^&@F-V%b; z=RsPhRrXrs{2kiAn5E>k!Z=MVb$vOt(klBnY*_1*w2s2wC7%K59OpNpEw{)?bOf1w1V{r zx}RB<4n|sL!53TQ#BY+N9A7APQWCxLTU^Z&eANWjr@9@~Tg@l9^l`0a`jL0~BuBZyw& z@v!X!*y%Q5>vm$+5gc~5w z;uf6R`?S75!7F+!ikEunY(ga!*4&d}=VF4c>=V)S)vuMtG3Csy&MNFp5Bynsxp@G; zE-jmgMwIVtL=dysm38O6Iwz$qQpPW4HRa3VOQByI7Ld%WxP{yOW~s_0O+q$&+St^S z%HMN36Q+QbXLsAaV{tvt0oJ&74~Ao^o1n~RwsDL|qv@{0mKmgJl$;Y0D`bgL$4H;T zqNXQUvpf_MEN2$8HR%@hm@1N>Jr#QF)TP+%Rzv;m{Sg*)>u(%1O~D~1-S?wjAW7i1 z<;wp!2H1;7hDys?ie#3lmBE?#(|3enx-v#$_KBY%JHxxv%9CsX+r|9fO~>>zMyU>T z{ZY?S!Qx|p5vJA-LO{9 zRtrl}ldz5L(u?-`<9n>2Xn$l&c9~6#IfZ&t#!J;XH47F&tZ8=)nEzHWYf&6QJSv(p z=bssaFnfxw>diG@Sp{vVu%4K0ViyF?9 zX@T{WgXk$?jv%?IKh!D~&2HD997jYuuRx8?7a`a|yt*;qQI^+Z8XoHsH`CYWUBGsC z$e2IA4lmUW*2Q2-EHH_1&~R?0BQWx>jtPXV{{Gu6po0Q6e#0DeHfGhndZFSXwU$%t%}?TdWWipIiKw@liRuaqEy)4#u$dR}H)>qQnk- zP`m_-iq>fGt9Sc{5K}Lahy=QV8-3hu&boa=c=I!nGa zuR*w(z5jR$$aO|5Z9{f)SUX# z$BfopDG(xR%%?00i^)BDvY*KN7#Ju|GX5`dN460aen4d} zm{$gCQ{b-qErl<^V}eiBoP81nfAPa|>pSK>!000+2M2J0$`|)=Q zdmyyYRD}W_{RKwmHCzf>2EnuSrv{l-mBU{001INLmCBMT>~(1bJ}PAuYtGTXi>1FFwaZe!NfDTr`k!qPDZxJmrOdqefFp^1 zuuYcC4|T=w3-K{Iu#tPXlnDJo11M%@2@`C(R3_3jC}9FHg$*jCn?=3GS2>?~8`ORA z!Cf`*^p&h$EXrTk5M08X#B}h$L!$uD{X%p~*&x8Lt72pq$OttWU&6G0MGxo za}Mnat)Cc+@^D>4+L$kpgYgjuQ>+?4+f8c^;_A4x_4d4~8S#in5p^J240Erz;aI~y zkJr4LQtM5D8D}xey-Ad1NFC=6Q;gEMb*6I_?!QI>83q?NDjGj$f&k#n!zX%s3c~9C z0f^qa=l$}*W!tB1)95Ztn3P*pNuCbb4jCP5{a=>bjw2>e!{g*RSpfK=99$(QP{I?x|r`dWqV5Ika$MD6{e}{7@Db<4c1>->68}FY9N>RY4x{5|yT^InW=aH4e z4J%$R4t@{brWMP-j_i9`uD~*zFJKjRuf1K4QF5kZjG86HI8s8ZNHa z_Y=cPd1ju_*a&4*y4?WT-)?iyY!sjn&@R8+goamlSv@mkto1ts)&DUUtNFupM~gTN z*fm^P6O(&pwCyDqc%kVc%r5@7TW`YdMjHp~JK@N282KL$Rsv8q6nW7X z@kj#Z`K}y{)%%Y*P5SszU1L-|7C~k)A8#ZD+2T|SJ_)S2lxB^;(D!wuXXQPm@ZiH+OkXZ7J9P6tar=h&xAKQ7Ak;{4{;4$O-Db zlTP3G9D1oq1aKK0&&QmD`ijj&z<67vgtXu_K=N*Qw z@&AcFrhNso8qq3wjsXnzE%4(t)5{;L*69r4j^eZCJ>)T}CeiMoFnAhmT`&xKqzmri z@+Ol<2os&+rt}?klPuILgCS!MLn?| zz^kLys>pC?3VsB)QTqo;U+aXM_ux?&BK5~E>LIIw=RpRQxPud`a?$UeY_0?nOSD7* zgZzVTw%$K4Pk^@>hI$Pur%kyo36gX4Y|OJWf9S0CeY$bs44;H+ST@ zU%O`JfuodsC6T1n3BWtXq~+h)Xhlqrbqo*>KyDqVnIpX!Vt9()9c(r8X}wn#7zgo{ zzMvoj1dtm`G@Lg~(!!1vlr$k~xzls1g-HmBaP%1qVzzBM8i=Q7TRrktCr3IAJ~VM` z^;q-%ghG0k1Y2DK;Dk8Trf0AZ^fau*ZKym}G+01HXSdVV)~z(fagXJb{WrE7%5zkf zI}NRl)dPQC3B6oIZ($0%M9BId_8Y1?2*3?N1;0y*GWrFJ2#&d)l=!+>eW3OEQ7SohDV02fhO7akhGRx9?!H3-DC5COf81i&d%6W-1 z^UX8DB);u!mHGsLNeSw=t;}8mFypeTfUijH3F|J^G0#g6<)cYcgXp_rHqVaOKRqDo z|FW?u;Voqw!;V(3CvT_fGcL#d-)Ahss6$z$Rd=F*aMUb;xnEx00E_0&$Pi$;t z6QA66+Hg(hT|Dq`1ugvjA6r_+l#Jvis4Q&6t6^P!I z^tciMFgb+OINx@Dmf(Ca(vxj7cvyAf)?O;AMbYj8for<1H@eISA|~-hD3Zg%!}UIZ z1zQhe8fDB+H`Jg2FfB~z`snXf_eKnYvUdA5g_V(1E4WlaO@@3<0?Ml%9KcRo;WE5* z$)@+am^t4tmu33o);_iy;1Y7{oB3?yc0DNUBfR5xvDph}=FO)<{7qpPfVsY->(mLO z!>rqeRX_X(>oN`x1OCWuXAL%q6-Wh`psctbL~G-4d+JrUO|=Gs|lm;J_DOeS%%(h8o_%HcY-7ko@5>sFnbs@ zbv~W%EUaw$wCgy`xHsIz|6YIiR2F>0$-KEjQHyc```9xk!*@4kl~ z0N(U^77%t$_d`!=CKBiMZ^4e??F&Guc- zU`=WzfyBfFpcCt`b*FB7|-kk_W91Q@iR>PpzI*oGYkI#z@#Q<1 zr;BK40^W!_hZM7$p^IT>5Bq?DFK(r{TF)e z5t2#PH7{4M>imNfL?nciMTi-lM;{nP;vIq-@1y>AVi zlT;|9<%yTgOjb!dGk_G3g6=wsncFux`JDe&)%k+)xDCX+~IoL83*PXVr-363$i~`8K$r|ZKIT8)=d;F(1e8T_Gm)N zMpn)Rn8S>poI1QdE!9cp@rAa2b9wnQy|Os3X$?gR6dY88H=2Pg)e>a8C2a_`dGmHE zq%7W+^A)$tWl7q%#yHg$)~ryLXb<%i4GD>+7&1W#0!HdvC#in+awnhWeMB0{$ooIl zcx&rCbFA=-v(ZYBX2)ijq?%}(s#DPp0_C1}QbOm1AtEtGj2W;G3NymW6j+QWtDD-V zpZT?S3u(ctx$vGh9$Glf&?b=aj4`SaWfo6ZP4zALkn54y0-}UDzxB64=|C=TB5Wfo zm%G~bqBN9S!yK*Q+l^=bTT2H4Q$mV4}$Fr5}6j$cmX*J|i>Jn{V>S zgs>d<;b<5h0dLf&X^fj-7FCkue;qd*UTc{NqK{4yBjo~KR>*<2>A3-Q#w?7LE~&{e z{45JmxIN-uL#FIZ?s(vN<`+g3J=&1oV{2Za2Aw>=VKT^Kl`#g?m*wThAYA=d12vMu zVJW#QM(>iq z`;m4DCJ?T9{r+AS&xb6Q4h`8nK*Hps;-7M78R5G+bkReXih|y&t_>scWtN#k!>tpu z914{DGOG0-<*tX_zdM<)e!&&aM9G}O37%PNKFnOa^cj+zUg9&Sq>Y){`6V)?6aXOV z7zOW0f5agutTc!R5zkb1l1z&WP&K=9c zt5hScXb)bHgfAf?S<*KSg44S%07yUir`vBCg5Q^*HmAT~^Qv)e{I-*C)hrrM&+6BE z5?oi=oR6M6T{b*P*Yfw7O-GNJd!sZgCdu_JFX|6jxVmL4jpUFy4zkJqwe>`tDt3?= zZ&=>=Kn08E@-lL(8*^~)Hn^OygO_eTCDo-xSWvEzuZ54VgujQ36KwW9pOLjBUr$C zTb{oA$cfeI;TSIC3l;z%9ah7kp)O`T6Xax+Ngyu-SznQvF_W@bQ}@4iarWM02UMLM zi!Ko`GS}JLmd)z#Z*(26x8~z;?@FE3>kG?RlD-~w=E`;^_fJ;-`_AwL?6`sa6GOX` zY3!Pe#`)l~Z`pf7>@YLsI$CNxfOk3#_~v+cZIpvNOM2V4pZg}C3G_}&`miOdBP1rQ zsSXeEvF8IYHNs`gr`^gMCU7GNtqw*=NU-jxQA1vf>Iopx9?ob!jJUDUA|oy>eok0061{)k6LO| z`knH>-t163(5njWMmo`|Fp=Ljs#vCFiKNjS4LnQ|i}&YMdXuWH^sn^~w%0F9)3Rsl ztZ}i?<$W>o_5_apC*af0N|LkR+Fz%RO_b3qobsLTNl=`^PAJvZhV==( z&NM5bf$|4_D!Kc^TEx`I?JJVbAVmczmYB(RoYUNLV9C966d>FBDv@PCDK6v0JA93s zWt>)K`NGe908b)9=L`rCar&t`fJe31hN`7y0HLl7%4g`vxcL_db)SF&3a968FU78t zBT?N1rsH(_20!}%grE9t3U0C_->iV6dC#8Q!2vLW!Fj$GC>wwhA?}JLrOGt*EiGFs zsMCiI3cRTSr796C6}x(NBco63x&Guxx&0@w-4huQ`ej*tM(Q{D*IJNjAy_lyntr$G zp;9?OT)g+^BlM8m^k#Fg1ejHewmYLbxJj2iEhioX; zRXneIGK7*Ag}}TZNfNM{)E;&{8}jU2wBqfLS8*vG0~-$MCl9Z);Q0(2k@Ze*?tA|hT4IN@%I;R zk9zmFJXsXFL$*rwQEkpr@u+%!K1OgRrc=U@P$}$+cHs)A5GlOl08nolG^1FEaRd@k zl_vBY++@i=prm76(jD#-Ek@6%1$}8zO=wu~=yGLPRr%FawSIm(Wod#a9V=T@Q=lWG zmz-GFTVKfKqgVPC7OCBe^+t``FL=Dw*6zpwHgP}N@oth1`6N;>&RnY}-`(Ym4N@|?bal-<`!%CHA-XEZ@F za-OvO(?D#Vw#j2#coy_AYka&Ult}9WVp-ItG`{Si}!jzIIgjL%Oi|y3%<`lK~qFJ zZme+cN^U)GeDfb*8}PN)>vBJ^0^mK9$5Do{tk>FS40^!q+>%V$8&^M;?eLvp6zSIK za)c;3lv=6PRMX$zK#o%ZHSJYb+bP_eEi(YWQ>L=WXb~G&0!?6^ijZ^42jdhgzz&@$ z;Qq+!s@DD$f#`Dc8Hk#{Kl18Sb({tk4&?34zK8-I$*Tniqy#KeT?9WReuf4%&%bMB z&6>fio1FA0PzNBZL8E9g25@};$cmjiRkJ1{I}43JLSO#)iy`O0R}!)MLNOVN($ybv z`ez|8yCT0^KgoReq6En>R$Hq$WVhuC^8~PEvG7&`qNeA9-}h(~`Be&~jqsX7YCkVO z^}cv^!6g2;FqIt>Kp>^1AbnAp8aKd698)jKhVG@XeTp$q#vjaD{( z&x!zepHaV#*mQ5x6U(o2m?PE_^npl<4LG@4pV78Q1{!gqOu{_jmbtjVv_i&(Yg!x8 zQ`~{1s_GI*u=AoOeqWuZ(mRFG?Jr7DtN_qBvJwkxdyW>AR}T(8i3(#@+q`8pW@X8q z{sT*rTy`sgwDFWu{o8jm_AA;QbLElDdMR|!?yJ^#WT4Hh;36=7Vf0cyRP%<93v$`H zacv|a&k+9R%J^rKBxYl-T>&{8cmgRhL%1z=(#mv8DIhCv#av8}} z;p%@c@;Iy{&c5}*%k*PyMZ6;Pv4@Uxdc^EaZtGN%;aS}X-JSt+Nh;tlEIhoovUD>4 zok`v&C#Z`;GhdsGP@`LYymA=XIv=z>Ewd4y5f ztz?pb8Mbd&>67rmit}Gy8+jLXgE9V0Sqg9f-X(CM6EZ!b;WTSIHz9(Mp8BsxYm4}woHDKnS!V!U zud2PYo61(E`?V5SNR9Ao$qK#eb63%X%&!7i(;y>^N)CldJbxQz(J2AGQF2!jqlWZF zWW)e|&tkdaC6E~?5X`#0asTVsH+8(^ME633PY*cTQRDV_Vl|VPHQ7!g#YE42VK9o3n#8d zKaR^c_{<4DezMCQlgL=#jfzz9Md%MT3Da+DQ5_C;Y=Sggd9pX%sLfH`Z;oGo!vLIC-0(de@ibv(v@r7EUBFyOtYVIqxQx5um z(YpHa7SXvF))qZ@Jq780o}J;?j+TX+m|t)G=}8nzMYV!GYf6Ik!^BJqu>4|F}9xNw1zP(}lI+E5XbXDI)V zjIOU|_ENxt$Ls!ka_A5mEV$CQjO2MkXd9qq~ENkS2OYlm^0&&B%IH$d@FNx5@tNjbsm9@W+hP$X}gy z*AFV2A(u-tzR=YYXVhVcZUvS-1Gz}^%;~Y+w%CxeZ{L-q!`LZ_9l%TI% z8`Lydidr#^n`LOraEsniIVf4BwnnU(UzG-2lD2^Z{slT3KCWhQug{3VS0GOIuje3l z!%mKJYB0yZk~wmKZu9I1>BF_@9tN5dP`UWyn=Q4}5u3w$eV4QZ3v^6%0G{s-lp8k@ z+>OdD{0jZM>eci^ud-<1E;{m#-n~=fuiP!Gen0r#Dw5n0DX60@v>IwTJQtW|4Q2p& z&?8Ra-a|d5p~8Mk`WH9isgKsd1E*{Ewu?M;S4t*<{xGM@^`7@BsXM00-`#ZFRMbHi zzr+pyC7`BM+9xQ-RXCU)b9m&=;rjr;(oiV-N``@B=FHh`()hxtJ&0fQG50kd0eC&e;D}C&3W27O~dVB7NKz;|KNe>b*{~5 zoj!@|-EdKDwa^R>j!dWM4ERrT#OFof#VIpg$TCWy%055Ff?G4b&36EA0B9H~F=pP4 zEIXHReP+hzuol3QL*$kGwX%}e5u-I#(O zcwABMFD&-?b_EU_Tk;?kgtU{u|2!A=&Xbj-aj* z8-xUlq?H+Xrg^(5_S$df-To;k=Rsrub36B70^L%-&bm@udi=$Bw8+TE zsO8E&1~?ixAzCP%Jf;a5ycB?BILM0jaKHF=RdpRdGZ!UGB#Q}9X4Q9!OrM;IZS943 z(eEVec-22T>*CBXDxy<-Abm8jYzs%DkChHr>=-X3brLb5j+@Xc-Q}}@`0$Kgayxf`(8EG znJSo^(E)d6;y;s^m6Yf2*NR~9%3SO%-04y*d*E2mwASW&Yjs#=lQ7EQ0dYF{BM!OL z-W#UE1Y~35Ga2yiRsj(U=G+BZ?O-cks!~wB5rc@A26nApK+K`JJywF?KnCFtD>B6U zmGwJmn*sr*8rhq)U9HWrD;J@Z3{OB7mL=^F~%gixdUCZv{m+cLB+m?5|0n;Y}|6sUNGm7>l&z7Kn3zg zUX05NVY=k!kuDn(XDAe3DaYVPNabc}imIS)Mtxl-eJ+cgVVc>A^JD|JSz^!MGM(V3 zhjV7*Kz0iW*Lt6wUvi@IhQF6GKsJwGIl?+u%(gDKLUJSw^BTS>Wf$4or)Gijf>=PS z$5;8kV-EEUyh1#gzlO7wA=Y?a(EVpq_dF{-XiM{I{yMkRCih`$I@N7+#c1!7tCI&N zY$01gL(h~Ilw`;j1=ML3lD#Knp6))BRqNe9+cM0{^<1x6sJGU1&l!)T-)+&Uh-T?fAr`&R_^0;N~PJJtg9CL`h z)o#?R@Ykczvh963g)w$CAorU7b~=rfJsNU*2`a4n6(DJ%ileZ6;RSg(2o)5d%mbac zxx9!k-G{o#VyhZgl z@M0Z{Y}tvQB^(_ZkPF6w?JsvN><76rNivl2Rq~Emdk^9@m~kqyWWMj{$k)StCi$x> zk4UT!Ero!^0B-=;pkF+VRmg8?{%&KOec(01&#xXLrx6?+o=&NJeF#MASbhQL!*vB` z^YPgww>R>!1oyMFp7u$(!c-gPklTHmaf!sj5r@2HT4dHZ_5(k}9Xn;iI1+IR*kBbxPh# z4Hq)Jq=ik~KxXPvr1NCu)HES~mQzZjm3u3~0W)gbNDnYDF z4%Ifv+eF3l6aRg?iQr2xWQoSch!#fAKk^z)XhDiTfqq65W zG9&p-fxE%{>}O3LcVm~(g`uYP(paY&L#ZcrMVMIFOr@1t&9 zkV8$TBdf_aJi~Shhf9r{9Ex?9xkAzX?@r!%e$2Z!(G-WnrCqbfX7E?M; zGdGpV_E7u45?l%_({;)p*qmzfJ+J+p%mZUz`MtjR0#8H5vblaB>r5p6MC8AFnVY^U zza3R+=0)%>Cv#JHndCj{?{ zlrl`1y`DBKZtvUJikQg`N!U2t%8&*No|Kp$ASGNoeW8~Ril2Js0&@z6+)1snWSlB`KJavn#!^4HLJ(d5wp*FFEetuK zGgFFZ64x0{s19v%R)R*8jSMR>;}Hq#H%`E{CX4jb^hyEFSOE@U!DB1RH_AU+%CD{_ zqdZ@>GK@v{i98SW`y`)s!rF7yOtTG8pZ%_HK9y63^31;2geB#0;CDrn#!j!`!VaCed^tv%JAa9JVK;5Ec2@_ENwuLiyo+1wPytsAl6&# zKlJOMlgd+?Uzt9+Dv~LSeamKD$wez_fWlSnffGLW=0WQ`0BnB!2*n(~OL3|k&)-4+ zoOIYW#EBUxV4oR-GLMLfuHbvco)$;4>&}znZ>~d?9TdktCZI}tM2Ve*b!KiGr-C_% zv3iN$ql$y`PcbZSS~&P;zK6z&PlmemF|=~VmoUrr4x^30vyc`CLzys^hf&2j2resWhGpXx85!5+OYleV$!qDg+bup4uM>QUc!t-3z5 z9X6@Bfz{$wUSo0VBy)YXgQXTs7op`mhq@!T`iI#$)qP!So<5-)1d^Z_rDVt~ZkC(8}*Yb3?daT?PeoMc3{xv?h zLA9KFX2`-;h{XKV~q zK`y%yK5G2GuIqefFdV_&D{{U0{8vNdO8y|%D}$H`{U9G`VK3V|H~y--x9o+;Plf(7 zI1HsoQ4j8hSf+~(VbQ1cpPSyR;xzXoAC=L3Ee$XBz*zlqvBSFHJ|338!euI3Z^T%6 z=?qWnQO^(I)wL3QeJk-Y20c3J*0v>zR!kOu{o;qBeN%-6wcd8uO%V3N=>?LC`*No{ zGDya27RLkE9=Ms?f9o?VkPY{9j%M^TXm)?^-*n|~MrUBfa;z`FxFr;)tNcmxM%Ona z2_%|2vAIHbEs2!?ZgLW<6J$|2I z_@1ZJ6LGrRupSq!*1J{S14(z|9(Zl4*8?FakMLj?Y#pNwBKu-$gsKt(vL!)o zgkQ~}z$H~@-(EFOK89ovH4SwC$D&!@venmm)@T1@_ze!FSsOC4R_c!vY@J~N7j*1S zqs!=poc;bzur0os_>)<#JwD*EaT~E4*jay8HPtg^*Nbn@1+9u#N-Ng%gmSj`v zp7P7-)20mJ!y?fBPedJ2=dUVCBFwoT-_@&}A7X3(#_<|8*DfQVr0I2%KrN3 z);N65^1F*%vtZwm$KL>69m_)Xbz=#v;riRK?7qTNQr*%lU}dFj;GQMSY~w%fR=NI5q|HZI>m1_&C(jS?O%1uu01by}?A~c_TzR-R( z73)$nBhKUt$xsjr`)ZrJT7gT|_*g`8{EK@(-pFThwOli!GhC90QL3EFaC8^sVu!2- z(0edeWuL`Cq5_W$wvwUkqMG`5+WfgM2jCTm_Q$*7B^*~avdzMJko_pBfuC}JMwDy) zz5hp7Sm&;T&Kw*X-iVQ^FzQ`$ZRt7NE}5Y)i2k2n|M$k84uk!z@ zv&RelQf*3q(1p@!HlAeZ+j^}0_q=G@CKn-R8{ofo?D@vf1*8d!!vcRj&eYwYcl^!}}D zaDTBAU@O4agY^^-VBPnPB)Sy?rHyY@u+L~I4~a0_o$Ms}#J%_4d@)FZgzEJXJmVzj z&(a5A9JP+Uzl5fb%)Fac%h3v38+q8IpXo9t(C|9 znTh8|STZ4d_Q2<3lV@Z!r{D?Oy~W*MKem;&*M{5w?v92phsPU`tRWpf9htz>>REBO q!9$<3dC5iHa7g-s;u00k1IX55FlW8lRu21T4nSQ+8(O7g74d%!2Yh`1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/textures/blocks/LiquidHeavyWater.png.mcmeta b/src/main/resources/assets/mekanism/textures/blocks/LiquidHeavyWater.png.mcmeta new file mode 100644 index 000000000..4b721e09a --- /dev/null +++ b/src/main/resources/assets/mekanism/textures/blocks/LiquidHeavyWater.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/mekanism/textures/items/FilterUpgrade.png b/src/main/resources/assets/mekanism/textures/items/FilterUpgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..74f69f181e8019c53e8f8ea6d1a916ac08ca4530 GIT binary patch literal 1435 zcmV;M1!Ve(P)4Tx062|}Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p z!y3<%FD&-MT1y7yn6sb)!Q?bPctR~al{zD z)gwn`;BtJ2T)KI@;5$r!jAp0|h>#eOSabL80gZ?&r;&i11KQr_uFbow?VP~I`OI=G pXEv{lWqV2002ovPDHLkV1gLNw_pGO literal 0 HcmV?d00001