From 2bea8ac29a2f4a6c8aeca759d3eef37e448e0a17 Mon Sep 17 00:00:00 2001 From: aidancbrady Date: Wed, 3 Feb 2016 11:08:36 -0500 Subject: [PATCH] Work on Thermodynamic Conductors --- .../client/render/RenderPartTransmitter.java | 11 +- .../java/mekanism/common/HeatNetwork.java | 4 - src/main/java/mekanism/common/Mekanism.java | 12 + src/main/java/mekanism/common/Tier.java | 87 ++++++ .../common/frequency/FrequencyManager.java | 5 +- .../common/frequency/IFrequencyHandler.java | 6 + .../common/multipart/ItemPartTransmitter.java | 7 +- .../multipart/MultipartHeatTransmitter.java | 116 -------- .../common/multipart/MultipartMekanism.java | 29 +- .../common/multipart/PartHeatTransmitter.java | 179 ------------ .../common/multipart/PartSidedPipe.java | 10 +- .../multipart/PartThermodynamicConductor.java | 274 ++++++++++++++++++ .../common/multipart/TransmitterType.java | 5 +- .../TileEntitySolarEvaporationController.java | 8 +- .../common/tile/TileEntityTeleporter.java | 24 +- .../resources/assets/mekanism/lang/en_US.lang | 5 + .../blocks/models/HeatTransmitter.png | Bin 1734 -> 0 bytes .../models/ThermodynamicConductorAdvanced.png | Bin 0 -> 1764 bytes .../models/ThermodynamicConductorBasic.png | Bin 0 -> 1775 bytes .../models/ThermodynamicConductorElite.png | Bin 0 -> 1771 bytes .../models/ThermodynamicConductorUltimate.png | Bin 0 -> 1786 bytes 21 files changed, 451 insertions(+), 331 deletions(-) create mode 100644 src/main/java/mekanism/common/frequency/IFrequencyHandler.java delete mode 100644 src/main/java/mekanism/common/multipart/MultipartHeatTransmitter.java delete mode 100644 src/main/java/mekanism/common/multipart/PartHeatTransmitter.java create mode 100644 src/main/java/mekanism/common/multipart/PartThermodynamicConductor.java delete mode 100644 src/main/resources/assets/mekanism/textures/blocks/models/HeatTransmitter.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorAdvanced.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorBasic.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorElite.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorUltimate.png diff --git a/src/main/java/mekanism/client/render/RenderPartTransmitter.java b/src/main/java/mekanism/client/render/RenderPartTransmitter.java index aa2f6cb33..cc914ef5b 100644 --- a/src/main/java/mekanism/client/render/RenderPartTransmitter.java +++ b/src/main/java/mekanism/client/render/RenderPartTransmitter.java @@ -10,14 +10,13 @@ import mekanism.client.render.MekanismRenderer.DisplayInteger; import mekanism.client.render.MekanismRenderer.Model3D; import mekanism.common.content.transporter.TransporterStack; import mekanism.common.item.ItemConfigurator; -import mekanism.common.multipart.MultipartTransporter; import mekanism.common.multipart.PartDiversionTransporter; -import mekanism.common.multipart.PartHeatTransmitter; import mekanism.common.multipart.PartLogisticalTransporter; import mekanism.common.multipart.PartMechanicalPipe; import mekanism.common.multipart.PartPressurizedTube; import mekanism.common.multipart.PartSidedPipe; import mekanism.common.multipart.PartSidedPipe.ConnectionType; +import mekanism.common.multipart.PartThermodynamicConductor; import mekanism.common.multipart.PartUniversalCable; import mekanism.common.multipart.TransmitterType; import mekanism.common.multipart.TransmitterType.Size; @@ -271,7 +270,7 @@ public class RenderPartTransmitter implements IIconSelfRegister pop(); } - public void renderContents(PartHeatTransmitter transmitter, Vector3 pos) + public void renderContents(PartThermodynamicConductor transmitter, Vector3 pos) { push(); CCRenderState.reset(); @@ -602,10 +601,10 @@ public class RenderPartTransmitter implements IIconSelfRegister renderTransparency(MekanismRenderer.energyIcon, cable.getModelForSide(side, true), new ColourRGBA(1.0, 1.0, 1.0, cable.currentPower)); } - public void renderHeatSide(ForgeDirection side, PartHeatTransmitter cable) + public void renderHeatSide(ForgeDirection side, PartThermodynamicConductor cable) { CCRenderState.changeTexture(MekanismRenderer.getBlocksTexture()); - renderTransparency(MekanismRenderer.heatIcon, cable.getModelForSide(side, true), ColourTemperature.fromTemperature(cable.getTransmitter().temperature, cable.getBaseColour())); + renderTransparency(MekanismRenderer.heatIcon, cable.getModelForSide(side, true), ColourTemperature.fromTemperature(cable.temperature, cable.getBaseColour())); } public void renderFluidInOut(ForgeDirection side, PartMechanicalPipe pipe) @@ -664,7 +663,7 @@ public class RenderPartTransmitter implements IIconSelfRegister PartMechanicalPipe.registerIcons(register); PartPressurizedTube.registerIcons(register); PartLogisticalTransporter.registerIcons(register); - PartHeatTransmitter.registerIcons(register); + PartThermodynamicConductor.registerIcons(register); } @Override diff --git a/src/main/java/mekanism/common/HeatNetwork.java b/src/main/java/mekanism/common/HeatNetwork.java index 1621721fc..939178463 100644 --- a/src/main/java/mekanism/common/HeatNetwork.java +++ b/src/main/java/mekanism/common/HeatNetwork.java @@ -1,15 +1,11 @@ package mekanism.common; -import java.util.Arrays; import java.util.Collection; -import java.util.Iterator; import java.util.Set; import mekanism.api.IHeatTransfer; import mekanism.api.transmitters.DynamicNetwork; import mekanism.api.transmitters.IGridTransmitter; -import mekanism.api.transmitters.TransmissionType; - import cpw.mods.fml.common.FMLCommonHandler; public class HeatNetwork extends DynamicNetwork diff --git a/src/main/java/mekanism/common/Mekanism.java b/src/main/java/mekanism/common/Mekanism.java index fcd3812c6..c7359e5de 100644 --- a/src/main/java/mekanism/common/Mekanism.java +++ b/src/main/java/mekanism/common/Mekanism.java @@ -627,6 +627,18 @@ public class Mekanism CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(new ItemStack(MekanismItems.PartTransmitter, 2, 17), new Object[] { "RRR", "SBS", "RRR", Character.valueOf('R'), "dustRedstone", Character.valueOf('S'), "ingotSteel", Character.valueOf('B'), Blocks.iron_bars })); + CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(new ItemStack(MekanismItems.PartTransmitter, 8, 18), new Object[] { + "SCS", Character.valueOf('S'), "ingotSteel", Character.valueOf('C'), "ingotCopper" + })); + CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(new ItemStack(MekanismItems.PartTransmitter, 8, 19), new Object[] { + "TTT", "TET", "TTT", Character.valueOf('E'), "alloyAdvanced", Character.valueOf('T'), new ItemStack(MekanismItems.PartTransmitter, 1, 18) + })); + CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(new ItemStack(MekanismItems.PartTransmitter, 8, 20), new Object[] { + "TTT", "TRT", "TTT", Character.valueOf('R'), "alloyElite", Character.valueOf('T'), new ItemStack(MekanismItems.PartTransmitter, 1, 19) + })); + CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(new ItemStack(MekanismItems.PartTransmitter, 8, 21), new Object[] { + "TTT", "TAT", "TTT", Character.valueOf('A'), "alloyUltimate", Character.valueOf('T'), new ItemStack(MekanismItems.PartTransmitter, 1, 20) + })); //Plastic stuff CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(new ItemStack(MekanismItems.Polyethene, 1, 1), new Object[] { diff --git a/src/main/java/mekanism/common/Tier.java b/src/main/java/mekanism/common/Tier.java index a25073570..9ccad9cb2 100644 --- a/src/main/java/mekanism/common/Tier.java +++ b/src/main/java/mekanism/common/Tier.java @@ -5,6 +5,7 @@ import mekanism.api.EnumColor; import mekanism.common.multipart.TransmitterType; import mekanism.common.util.LangUtils; import net.minecraft.util.ResourceLocation; +import codechicken.lib.colour.ColourRGBA; /** * Tier information for Mekanism. This currently includes tiers for Energy Cubes and Smelting Factories. @@ -481,6 +482,77 @@ public final class Tier } } + public static enum ConductorTier + { + BASIC(5, 1, 0, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_BASIC), + ADVANCED(5, 1, 0, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_ADVANCED), + ELITE(5, 1, 0, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_ELITE), + ULTIMATE(5, 1, 0, new ColourRGBA(0.2, 0.2, 0.2, 1), TransmitterType.THERMODYNAMIC_CONDUCTOR_ULTIMATE); + + public BaseTier getBaseTier() + { + return BaseTier.values()[ordinal()]; + } + + public double inverseConduction; + private double baseConduction; + + public double inverseHeatCapacity; + private double baseHeatCapacity; + + public double inverseConductionInsulation; + private double baseConductionInsulation; + + public ColourRGBA baseColour; + + public TransmitterType type; + + private ConductorTier(double inversek, double inverseC, double insulationInversek, ColourRGBA colour, TransmitterType transmitterType) + { + baseConduction = inverseConduction = inversek; + baseHeatCapacity = inverseHeatCapacity = inverseC; + baseConductionInsulation = inverseConductionInsulation = insulationInversek; + + baseColour = colour; + + type = transmitterType; + } + + protected void loadConfig() + { + inverseConduction = Mekanism.configuration.get("tier", getBaseTier().getName() + "ConductorInverseConduction", baseConduction).getDouble(); + inverseHeatCapacity = Mekanism.configuration.get("tier", getBaseTier().getName() + "ConductorHeatCapacity", baseHeatCapacity).getDouble(); + inverseConductionInsulation = Mekanism.configuration.get("tier", getBaseTier().getName() + "ConductorConductionInsulation", baseConductionInsulation).getDouble(); + } + + protected void readConfig(ByteBuf dataStream) + { + inverseConduction = dataStream.readDouble(); + inverseHeatCapacity = dataStream.readDouble(); + inverseConductionInsulation = dataStream.readDouble(); + } + + protected void writeConfig(ByteBuf dataStream) + { + dataStream.writeDouble(inverseConduction); + dataStream.writeDouble(inverseHeatCapacity); + dataStream.writeDouble(inverseConductionInsulation); + } + + public static ConductorTier get(BaseTier tier) + { + for(ConductorTier transmitter : values()) + { + if(transmitter.getBaseTier() == tier) + { + return transmitter; + } + } + + return BASIC; + } + } + public static void loadConfig() { for(CableTier tier : CableTier.values()) @@ -517,6 +589,11 @@ public final class Tier { tier.loadConfig(); } + + for(ConductorTier tier : ConductorTier.values()) + { + tier.loadConfig(); + } } public static void readConfig(ByteBuf dataStream) @@ -555,6 +632,11 @@ public final class Tier { tier.readConfig(dataStream); } + + for(ConductorTier tier : ConductorTier.values()) + { + tier.readConfig(dataStream); + } } public static void writeConfig(ByteBuf dataStream) @@ -593,5 +675,10 @@ public final class Tier { tier.writeConfig(dataStream); } + + for(ConductorTier tier : ConductorTier.values()) + { + tier.writeConfig(dataStream); + } } } diff --git a/src/main/java/mekanism/common/frequency/FrequencyManager.java b/src/main/java/mekanism/common/frequency/FrequencyManager.java index fdf39b848..3e0c05231 100644 --- a/src/main/java/mekanism/common/frequency/FrequencyManager.java +++ b/src/main/java/mekanism/common/frequency/FrequencyManager.java @@ -9,7 +9,6 @@ import java.util.Iterator; import java.util.Set; import mekanism.api.Coord4D; -import mekanism.common.tile.TileEntityTeleporter; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; @@ -247,12 +246,12 @@ public class FrequencyManager else { TileEntity tile = coord.getTileEntity(world); - if(!(tile instanceof TileEntityTeleporter)) + if(!(tile instanceof IFrequencyHandler)) { iter.remove(); } else { - Frequency freq = ((TileEntityTeleporter)tile).frequency; + Frequency freq = ((IFrequencyHandler)tile).getFrequency(); if(freq == null || !freq.equals(iterFreq)) { diff --git a/src/main/java/mekanism/common/frequency/IFrequencyHandler.java b/src/main/java/mekanism/common/frequency/IFrequencyHandler.java new file mode 100644 index 000000000..753e99d8f --- /dev/null +++ b/src/main/java/mekanism/common/frequency/IFrequencyHandler.java @@ -0,0 +1,6 @@ +package mekanism.common.frequency; + +public interface IFrequencyHandler +{ + public Frequency getFrequency(); +} diff --git a/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java b/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java index 9c6640398..42edc32c8 100644 --- a/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java +++ b/src/main/java/mekanism/common/multipart/ItemPartTransmitter.java @@ -152,6 +152,12 @@ public class ItemPartTransmitter extends JItemMultiPart list.add("- " + EnumColor.DARK_RED + LangUtils.localize("tooltip.diversionDesc")); break; } + case 18: case 19: case 20: case 21: + { + list.add(EnumColor.DARK_GREY + LangUtils.localize("tooltip.capableTrans") + ":"); + list.add("- " + EnumColor.PURPLE + LangUtils.localize("tooltip.heat") + " (Mekanism)"); + break; + } } } } @@ -161,7 +167,6 @@ public class ItemPartTransmitter extends JItemMultiPart { for(TransmitterType type : TransmitterType.values()) { - if(type == TransmitterType.HEAT_TRANSMITTER) continue; //TODO listToAddTo.add(new ItemStack(item, 1, type.ordinal())); } } diff --git a/src/main/java/mekanism/common/multipart/MultipartHeatTransmitter.java b/src/main/java/mekanism/common/multipart/MultipartHeatTransmitter.java deleted file mode 100644 index 7cf30dd9a..000000000 --- a/src/main/java/mekanism/common/multipart/MultipartHeatTransmitter.java +++ /dev/null @@ -1,116 +0,0 @@ -package mekanism.common.multipart; - -import mekanism.api.IHeatTransfer; -import mekanism.common.HeatNetwork; -import mekanism.common.util.HeatUtils; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; -import codechicken.lib.colour.ColourRGBA; - -/** - * Created by ben on 01/04/15. - */ -public class MultipartHeatTransmitter extends MultipartTransmitter implements IHeatTransfer -{ - public double temperature = 0; - public double clientTemperature = 0; - public double heatToAbsorb = 0; - - public HeatMaterial material = HeatMaterial.DEFAULT; - - public MultipartHeatTransmitter(PartHeatTransmitter multiPart) - { - super(multiPart); - } - - @Override - public double getTemp() - { - return temperature; - } - - @Override - public double getInverseConductionCoefficient() - { - return material.inverseConduction; - } - - @Override - public double getInsulationCoefficient(ForgeDirection side) - { - return material.inverseConductionInsulation; - } - - @Override - public void transferHeatTo(double heat) - { - heatToAbsorb += heat; - } - - @Override - public double[] simulateHeat() - { - return HeatUtils.simulate(this); - } - - @Override - public double applyTemperatureChange() - { - temperature += material.inverseHeatCapacity * heatToAbsorb; - heatToAbsorb = 0; - - if(Math.abs(temperature - clientTemperature) > (temperature / 100)) - { - clientTemperature = temperature; - getPart().sendTemp(); - } - - return temperature; - } - - @Override - public boolean canConnectHeat(ForgeDirection side) - { - return true; - } - - @Override - public IHeatTransfer getAdjacent(ForgeDirection side) - { - if(getPart().connectionMapContainsSide(getPart().getAllCurrentConnections(), side)) - { - TileEntity adj = coord().getFromSide(side).getTileEntity(world()); - - if(adj instanceof IHeatTransfer) - { - return (IHeatTransfer)adj; - } - } - - return null; - } - - @Override - public PartHeatTransmitter getPart() - { - return (PartHeatTransmitter)containingPart; - } - - public static enum HeatMaterial - { - DEFAULT(5, 1, 0, new ColourRGBA(0.2, 0.2, 0.2, 1)); - - double inverseConduction; - double inverseHeatCapacity; - double inverseConductionInsulation; - ColourRGBA baseColour; - - private HeatMaterial(double inversek, double inverseC, double insulationInversek, ColourRGBA colour) - { - inverseConduction = inversek; - inverseHeatCapacity = inverseC; - inverseConductionInsulation = insulationInversek; - baseColour = colour; - } - } -} diff --git a/src/main/java/mekanism/common/multipart/MultipartMekanism.java b/src/main/java/mekanism/common/multipart/MultipartMekanism.java index 6171cfc34..163c151df 100644 --- a/src/main/java/mekanism/common/multipart/MultipartMekanism.java +++ b/src/main/java/mekanism/common/multipart/MultipartMekanism.java @@ -1,21 +1,18 @@ package mekanism.common.multipart; +import static mekanism.common.block.BlockMachine.MachineBlock.MACHINE_BLOCK_1; +import static mekanism.common.block.BlockMachine.MachineBlock.MACHINE_BLOCK_2; import mekanism.common.MekanismBlocks; import mekanism.common.Tier; import mekanism.common.block.BlockMachine.MachineType; - import net.minecraft.item.ItemStack; -import cpw.mods.fml.common.event.FMLInterModComms; - import codechicken.microblock.BlockMicroMaterial; import codechicken.microblock.MicroMaterialRegistry; import codechicken.multipart.MultiPartRegistry; import codechicken.multipart.MultiPartRegistry.IPartFactory; import codechicken.multipart.MultipartGenerator; import codechicken.multipart.TMultiPart; - -import static mekanism.common.block.BlockMachine.MachineBlock.MACHINE_BLOCK_1; -import static mekanism.common.block.BlockMachine.MachineBlock.MACHINE_BLOCK_2; +import cpw.mods.fml.common.event.FMLInterModComms; public class MultipartMekanism implements IPartFactory { @@ -36,7 +33,9 @@ public class MultipartMekanism implements IPartFactory "mekanism:logistical_transporter_basic", "mekanism:logistical_transporter_advanced", "mekanism:logistical_transporter_elite", "mekanism:logistical_transporter_ultimate", "mekanism:restrictive_transporter", "mekanism:diversion_transporter", - "mekanism:heat_transmitter", "mekanism:glow_panel"}); + "mekanism:thermodynamic_conductor_basic", "mekanism:thermodynamic_conductor_advanced", + "mekanism:thermodynamic_conductor_elite", "mekanism:thermodynamic_conductor_ultimate", + "mekanism:glow_panel"}); MultipartGenerator.registerPassThroughInterface("mekanism.api.IConfigurable"); MultipartGenerator.registerPassThroughInterface("mekanism.api.energy.IStrictEnergyAcceptor"); @@ -136,9 +135,21 @@ public class MultipartMekanism implements IPartFactory { return new PartDiversionTransporter(); } - else if(name.equals("mekanism:heat_transmitter")) + else if(name.equals("mekanism:thermodynamic_conductor_basic")) { - return new PartHeatTransmitter(); + return new PartThermodynamicConductor(Tier.ConductorTier.BASIC); + } + else if(name.equals("mekanism:thermodynamic_conductor_advanced")) + { + return new PartThermodynamicConductor(Tier.ConductorTier.ADVANCED); + } + else if(name.equals("mekanism:thermodynamic_conductor_elite")) + { + return new PartThermodynamicConductor(Tier.ConductorTier.ELITE); + } + else if(name.equals("mekanism:thermodynamic_conductor_ultimate")) + { + return new PartThermodynamicConductor(Tier.ConductorTier.ULTIMATE); } else if(name.equals("mekanism:glow_panel")) { diff --git a/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java b/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java deleted file mode 100644 index 8ca7678ff..000000000 --- a/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java +++ /dev/null @@ -1,179 +0,0 @@ -package mekanism.common.multipart; - -import codechicken.lib.colour.ColourRGBA; -import codechicken.lib.data.MCDataInput; -import codechicken.lib.data.MCDataOutput; -import codechicken.lib.vec.Vector3; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import mekanism.api.IHeatTransfer; -import mekanism.api.transmitters.TransmissionType; -import mekanism.client.render.RenderPartTransmitter; -import mekanism.common.HeatNetwork; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.Collection; - -public class PartHeatTransmitter extends PartTransmitter -{ - public static TransmitterIcons heatIcons = new TransmitterIcons(1, 2); - - public PartHeatTransmitter() - { - transmitterDelegate = new MultipartHeatTransmitter(this); - } - - @Override - public HeatNetwork createNewNetwork() - { - return new HeatNetwork(); - } - - @Override - public HeatNetwork createNetworkByMerging(Collection networks) - { - return new HeatNetwork(networks); - } - - @Override - public int getCapacity() - { - return 0; - } - - @Override - public Object getBuffer() - { - return null; - } - - @Override - public void takeShare() {} - - @Override - public void updateShare() {} - - public static void registerIcons(IIconRegister register) - { - heatIcons.registerCenterIcons(register, new String[] {"HeatTransmitter"}); - heatIcons.registerSideIcons(register, new String[] {"SmallTransmitterVerticalBasic", "SmallTransmitterHorizontalBasic"}); - //TODO tiers - } - - @Override - public IIcon getCenterIcon(boolean opaque) - { - return heatIcons.getCenterIcon(0); - } - - @Override - public IIcon getSideIcon(boolean opaque) - { - return heatIcons.getSideIcon(0); - } - - @Override - public IIcon getSideIconRotated(boolean opaque) - { - return heatIcons.getSideIcon(1); - } - - @Override - public TransmitterType getTransmitterType() - { - return TransmitterType.HEAT_TRANSMITTER; - } - - @Override - public boolean isValidAcceptor(TileEntity tile, ForgeDirection side) - { - return tile instanceof IHeatTransfer && ((IHeatTransfer)tile).canConnectHeat(side.getOpposite()); - } - - @Override - public TransmissionType getTransmissionType() - { - return TransmissionType.HEAT; - } - - @Override - public String getType() - { - return "mekanism:heat_transmitter"; - } - - @Override - protected boolean onConfigure(EntityPlayer player, int part, int side) - { - getTransmitter().temperature += 10000; - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void renderDynamic(Vector3 pos, float f, int pass) - { - if(pass == 0) - { - RenderPartTransmitter.getInstance().renderContents(this, pos); - } - } - - @Override - public void load(NBTTagCompound nbtTags) - { - super.load(nbtTags); - - getTransmitter().temperature = nbtTags.getDouble("temperature"); - } - - @Override - public void save(NBTTagCompound nbtTags) - { - super.save(nbtTags); - - nbtTags.setDouble("temperature", getTransmitter().temperature); - } - - public void sendTemp() - { - MCDataOutput packet = getWriteStream(); - packet.writeBoolean(true); - packet.writeDouble(getTransmitter().temperature); - } - - @Override - public void writeDesc(MCDataOutput packet) - { - packet.writeBoolean(false); - - super.writeDesc(packet); - } - - @Override - public void readDesc(MCDataInput packet) - { - if(packet.readBoolean()) - { - getTransmitter().temperature = packet.readDouble(); - } - else { - super.readDesc(packet); - } - } - - public ColourRGBA getBaseColour() - { - return getTransmitter().material.baseColour; - } - - public MultipartHeatTransmitter getTransmitter() - { - return (MultipartHeatTransmitter)transmitterDelegate; - } -} diff --git a/src/main/java/mekanism/common/multipart/PartSidedPipe.java b/src/main/java/mekanism/common/multipart/PartSidedPipe.java index d4d86bfb2..1f49eac4e 100644 --- a/src/main/java/mekanism/common/multipart/PartSidedPipe.java +++ b/src/main/java/mekanism/common/multipart/PartSidedPipe.java @@ -131,8 +131,14 @@ public abstract class PartSidedPipe extends TMultiPart implements TSlottedPart, return new PartRestrictiveTransporter(); case DIVERSION_TRANSPORTER: return new PartDiversionTransporter(); - case HEAT_TRANSMITTER: - return new PartHeatTransmitter(); + case THERMODYNAMIC_CONDUCTOR_BASIC: + return new PartThermodynamicConductor(Tier.ConductorTier.BASIC); + case THERMODYNAMIC_CONDUCTOR_ADVANCED: + return new PartThermodynamicConductor(Tier.ConductorTier.ADVANCED); + case THERMODYNAMIC_CONDUCTOR_ELITE: + return new PartThermodynamicConductor(Tier.ConductorTier.ELITE); + case THERMODYNAMIC_CONDUCTOR_ULTIMATE: + return new PartThermodynamicConductor(Tier.ConductorTier.ULTIMATE); default: return null; } diff --git a/src/main/java/mekanism/common/multipart/PartThermodynamicConductor.java b/src/main/java/mekanism/common/multipart/PartThermodynamicConductor.java new file mode 100644 index 000000000..bba2e1d22 --- /dev/null +++ b/src/main/java/mekanism/common/multipart/PartThermodynamicConductor.java @@ -0,0 +1,274 @@ +package mekanism.common.multipart; + +import java.util.Collection; + +import mekanism.api.Coord4D; +import mekanism.api.IHeatTransfer; +import mekanism.api.transmitters.TransmissionType; +import mekanism.client.render.RenderPartTransmitter; +import mekanism.common.HeatNetwork; +import mekanism.common.Tier; +import mekanism.common.Tier.BaseTier; +import mekanism.common.Tier.ConductorTier; +import mekanism.common.util.HeatUtils; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraftforge.common.util.ForgeDirection; +import codechicken.lib.colour.ColourRGBA; +import codechicken.lib.data.MCDataInput; +import codechicken.lib.data.MCDataOutput; +import codechicken.lib.vec.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class PartThermodynamicConductor extends PartTransmitter implements IHeatTransfer +{ + public Tier.ConductorTier tier; + + public static TransmitterIcons conductorIcons = new TransmitterIcons(4, 8); + + public double temperature = 0; + public double clientTemperature = 0; + public double heatToAbsorb = 0; + + public PartThermodynamicConductor(Tier.ConductorTier conductorTier) + { + super(); + tier = conductorTier; + } + + @Override + public HeatNetwork createNewNetwork() + { + return new HeatNetwork(); + } + + @Override + public HeatNetwork createNetworkByMerging(Collection networks) + { + return new HeatNetwork(networks); + } + + @Override + public int getCapacity() + { + return 0; + } + + @Override + public Object getBuffer() + { + return null; + } + + @Override + public void takeShare() {} + + @Override + public void updateShare() {} + + public static void registerIcons(IIconRegister register) + { + conductorIcons.registerCenterIcons(register, new String[] {"ThermodynamicConductorBasic", "ThermodynamicConductorAdvanced", + "ThermodynamicConductorElite", "ThermodynamicConductorUltimate"}); + conductorIcons.registerSideIcons(register, new String[] {"SmallTransmitterVerticalBasic", "SmallTransmitterVerticalAdvanced", "SmallTransmitterVerticalElite", "SmallTransmitterVerticalUltimate", + "SmallTransmitterHorizontalBasic", "SmallTransmitterHorizontalAdvanced", "SmallTransmitterHorizontalElite", "SmallTransmitterHorizontalUltimate"}); + } + + @Override + public IIcon getCenterIcon(boolean opaque) + { + return conductorIcons.getCenterIcon(tier.ordinal()); + } + + @Override + public IIcon getSideIcon(boolean opaque) + { + return conductorIcons.getSideIcon(tier.ordinal()); + } + + @Override + public IIcon getSideIconRotated(boolean opaque) + { + return conductorIcons.getSideIcon(4+tier.ordinal()); + } + + @Override + public TransmitterType getTransmitterType() + { + return tier.type; + } + + @Override + public boolean isValidAcceptor(TileEntity tile, ForgeDirection side) + { + return tile instanceof IHeatTransfer && ((IHeatTransfer)tile).canConnectHeat(side.getOpposite()); + } + + @Override + public TransmissionType getTransmissionType() + { + return TransmissionType.HEAT; + } + + @Override + public String getType() + { + return "mekanism:thermodynamic_conductor_" + tier.name().toLowerCase(); + } + + @Override + protected boolean onConfigure(EntityPlayer player, int part, int side) + { + temperature += 10000; + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic(Vector3 pos, float f, int pass) + { + if(pass == 0) + { + RenderPartTransmitter.getInstance().renderContents(this, pos); + } + } + + @Override + public void load(NBTTagCompound nbtTags) + { + super.load(nbtTags); + + temperature = nbtTags.getDouble("temperature"); + } + + @Override + public void save(NBTTagCompound nbtTags) + { + super.save(nbtTags); + + nbtTags.setDouble("temperature", temperature); + } + + public void sendTemp() + { + MCDataOutput packet = getWriteStream(); + packet.writeBoolean(true); + packet.writeDouble(temperature); + } + + @Override + public void writeDesc(MCDataOutput packet) + { + packet.writeBoolean(false); + + super.writeDesc(packet); + + packet.writeInt(tier.ordinal()); + } + + @Override + public void readDesc(MCDataInput packet) + { + if(packet.readBoolean()) + { + temperature = packet.readDouble(); + } + else { + super.readDesc(packet); + + tier = ConductorTier.values()[packet.readInt()]; + } + } + + public ColourRGBA getBaseColour() + { + return tier.baseColour; + } + + @Override + public double getTemp() + { + return temperature; + } + + @Override + public double getInverseConductionCoefficient() + { + return tier.inverseConduction; + } + + @Override + public double getInsulationCoefficient(ForgeDirection side) + { + return tier.inverseConductionInsulation; + } + + @Override + public void transferHeatTo(double heat) + { + heatToAbsorb += heat; + } + + @Override + public double[] simulateHeat() + { + return HeatUtils.simulate(this); + } + + @Override + public double applyTemperatureChange() + { + temperature += tier.inverseHeatCapacity * heatToAbsorb; + heatToAbsorb = 0; + + if(Math.abs(temperature - clientTemperature) > (temperature / 100)) + { + clientTemperature = temperature; + sendTemp(); + } + + return temperature; + } + + @Override + public boolean canConnectHeat(ForgeDirection side) + { + return true; + } + + @Override + public IHeatTransfer getAdjacent(ForgeDirection side) + { + if(connectionMapContainsSide(getAllCurrentConnections(), side)) + { + TileEntity adj = Coord4D.get(tile()).getFromSide(side).getTileEntity(world()); + + if(adj instanceof IHeatTransfer) + { + return (IHeatTransfer)adj; + } + } + + return null; + } + + @Override + public boolean upgrade(int tierOrdinal) + { + if(tier.ordinal() < BaseTier.ULTIMATE.ordinal() && tierOrdinal == tier.ordinal()+1) + { + tier = ConductorTier.values()[tier.ordinal()+1]; + + markDirtyTransmitters(); + sendDesc = true; + + return true; + } + + return false; + } +} diff --git a/src/main/java/mekanism/common/multipart/TransmitterType.java b/src/main/java/mekanism/common/multipart/TransmitterType.java index d0c037a9c..ab01b58ea 100644 --- a/src/main/java/mekanism/common/multipart/TransmitterType.java +++ b/src/main/java/mekanism/common/multipart/TransmitterType.java @@ -24,7 +24,10 @@ public enum TransmitterType LOGISTICAL_TRANSPORTER_ULTIMATE("UltimateLogisticalTransporter", BaseTier.ULTIMATE, Size.LARGE, TransmissionType.ITEM, PartLogisticalTransporter.transporterIcons, true, 3, 3, 6, 10), RESTRICTIVE_TRANSPORTER("RestrictiveTransporter", BaseTier.BASIC, Size.LARGE, TransmissionType.ITEM, PartLogisticalTransporter.transporterIcons, false, 4, 8), DIVERSION_TRANSPORTER("DiversionTransporter", BaseTier.BASIC, Size.LARGE, TransmissionType.ITEM, PartLogisticalTransporter.transporterIcons, true, 5, 14, 6, 10), - HEAT_TRANSMITTER("HeatTransmitter", BaseTier.BASIC, Size.SMALL, TransmissionType.HEAT, PartHeatTransmitter.heatIcons, false, 0, 0); + THERMODYNAMIC_CONDUCTOR_BASIC("BasicThermodynamicConductor", BaseTier.BASIC, Size.SMALL, TransmissionType.HEAT, PartThermodynamicConductor.conductorIcons, false, 0, 0), + THERMODYNAMIC_CONDUCTOR_ADVANCED("AdvancedThermodynamicConductor", BaseTier.ADVANCED, Size.SMALL, TransmissionType.HEAT, PartThermodynamicConductor.conductorIcons, false, 1, 1), + THERMODYNAMIC_CONDUCTOR_ELITE("EliteThermodynamicConductor", BaseTier.ELITE, Size.SMALL, TransmissionType.HEAT, PartThermodynamicConductor.conductorIcons, false, 2, 2), + THERMODYNAMIC_CONDUCTOR_ULTIMATE("UltimateThermodynamicConductor", BaseTier.ULTIMATE, Size.SMALL, TransmissionType.HEAT, PartThermodynamicConductor.conductorIcons, false, 3, 3); private String unlocalizedName; private Size size; diff --git a/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java b/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java index bc29e4462..4a3a7383d 100644 --- a/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java +++ b/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java @@ -53,7 +53,7 @@ public class TileEntitySolarEvaporationController extends TileEntitySolarEvapora public float biomeTemp = 0; public float temperature = 0; - public float tempToAdd = 0; + public float heatToAbsorb = 0; public float lastGain = 0; @@ -328,8 +328,8 @@ public class TileEntitySolarEvaporationController extends TileEntitySolarEvapora temperatureSet = true; } - tempToAdd += getActiveSolars()*general.evaporationSolarMultiplier; - temperature += tempToAdd/(float)height; + heatToAbsorb += getActiveSolars()*general.evaporationSolarMultiplier; + temperature += heatToAbsorb/(float)height; float biome = biomeTemp-0.5F; float base = biome > 0 ? biome*20 : biomeTemp*40; @@ -342,7 +342,7 @@ public class TileEntitySolarEvaporationController extends TileEntitySolarEvapora temperature = (float)Math.min(general.evaporationMaxTemp, temperature + incr/(float)height); - tempToAdd = 0; + heatToAbsorb = 0; MekanismUtils.saveChunk(this); } diff --git a/src/main/java/mekanism/common/tile/TileEntityTeleporter.java b/src/main/java/mekanism/common/tile/TileEntityTeleporter.java index 352d0db8a..10168af77 100644 --- a/src/main/java/mekanism/common/tile/TileEntityTeleporter.java +++ b/src/main/java/mekanism/common/tile/TileEntityTeleporter.java @@ -1,9 +1,13 @@ package mekanism.common.tile; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + import mekanism.api.Chunk3D; import mekanism.api.Coord4D; import mekanism.common.Mekanism; @@ -13,6 +17,7 @@ import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.chunkloading.IChunkLoader; import mekanism.common.frequency.Frequency; import mekanism.common.frequency.FrequencyManager; +import mekanism.common.frequency.IFrequencyHandler; import mekanism.common.integration.IComputerIntegration; import mekanism.common.network.PacketPortalFX.PortalFXMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage; @@ -35,10 +40,11 @@ import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; import net.minecraftforge.common.util.ForgeDirection; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; -import java.util.*; - -public class TileEntityTeleporter extends TileEntityElectricBlock implements IComputerIntegration, IChunkLoader +public class TileEntityTeleporter extends TileEntityElectricBlock implements IComputerIntegration, IChunkLoader, IFrequencyHandler { private MinecraftServer server = MinecraftServer.getServer(); @@ -141,6 +147,12 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements ICo ChargeUtils.discharge(0, this); } + @Override + public Frequency getFrequency() + { + return frequency; + } + public Coord4D getClosest() { if(frequency != null) diff --git a/src/main/resources/assets/mekanism/lang/en_US.lang b/src/main/resources/assets/mekanism/lang/en_US.lang index 18f089554..32902aa36 100644 --- a/src/main/resources/assets/mekanism/lang/en_US.lang +++ b/src/main/resources/assets/mekanism/lang/en_US.lang @@ -180,6 +180,10 @@ item.MultipartTransmitter.EliteLogisticalTransporter.name=Elite Logistical Trans item.MultipartTransmitter.UltimateLogisticalTransporter.name=Ultimate Logistical Transporter item.MultipartTransmitter.RestrictiveTransporter.name=Restrictive Transporter item.MultipartTransmitter.DiversionTransporter.name=Diversion Transporter +item.MultipartTransmitter.BasicThermodynamicConductor.name=Basic Thermodynamic Conductor +item.MultipartTransmitter.AdvancedThermodynamicConductor.name=Advanced Thermodynamic Conductor +item.MultipartTransmitter.EliteThermodynamicConductor.name=Elite Thermodynamic Conductor +item.MultipartTransmitter.UltimateThermodynamicConductor.name=Ultimate Thermodynamic Conductor //Glow Panel item.GlowPanel.name=Glow Panel @@ -684,6 +688,7 @@ tooltip.insufficientFuel=Insufficient Fuel tooltip.readyForReaction=Ready for Reaction tooltip.speed=Speed tooltip.and=and +tooltip.heat=Heat tooltip.portableTank.bucketMode=Bucket Mode diff --git a/src/main/resources/assets/mekanism/textures/blocks/models/HeatTransmitter.png b/src/main/resources/assets/mekanism/textures/blocks/models/HeatTransmitter.png deleted file mode 100644 index cc7b6cddb19196f786e3c0c1cb23f131f9a9a20b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1734 zcmV;%208hOP)4Tx0C?Jsl+SMzWf;dlyYtSh2{;E+0gJ(jKY)-zwqTG3L3g{$wouDv+hW_8 znCoMPiX1$ccrw9X5iY<%0|`MxY)DKvl=ve=5-x_+!%TMv zXvO#R%=3Pq@AvyW?~{Sd=T+Z#(-zEnp{kVf*7(GvmAOHhXIMiwYpQnO=gQ?FfU57i zJaX>+ObX!I_LcAd^Q@`Kz=qTlK(iLuvyeIlx@-F?1mhO4=V<7Mka-s9QsWbokjVmF z^(Za?T~kp!4s@x}No`@q40Cbh4CzWGcl~Ud+tLC)h%7op= zT>sBA>$aBlHUVpcnUO=lR!ALdsDVlxe_~gQBfyK0y6lJf3a}Ycf3#-Ca={irt|ajcdi^v~yrE#?Sk1c_{KG&Z<^rEXG`|s$wbP5r0c> zEaucV)T)I;zz)#&b0k$o(qsyWjmLc~DwN1$;iG6Wje|=GiHAhtq@H93XBAu-iHhS6 zqK?F45ru=j3MNvx9b=key~v7PA}jWaA+b;F5q((VHSxOGFA5?n`o!LLZ8@QDQRjA> z=UrMzEGir!f4aN1wWD`Zz3tdnPThH+y7`D_x$Gx70Rm>)$nDAgFU^0qp~G=qoO|oq z+Dr2se%yTZTl%7YUB9K@&=)!g{a1ZKU(j!m!^NeJWEP2oha^ZiNcM06myjwhzv0nL z;2uz%_D*+qZtN?k?#TCs?+tUZr<2Y8lKnG#J^N|)Z1(quro7^mw2!o}wC}aAwQsZ^ zv9$Br1?>mzqV}csZQ`v~-;eg&lS_0f@m8F*#5MEgM)L);U_NKQWDa%s%=KokIbd!v z3+Bf5yCwCKy*NzZwx_zXR)ibF!{I0rML-o7kK+&Re_Sm#iC!`I(AMq|dqvx&Q8Wrh z4$IhP^clUzK_l1kXKXPFMxU|8C_b=t_9`971S;9*cBYU7%%E_XL*f!3LwPI&=x_SR zl~Zqo*3NA96)WfauCxX{dq2!{9w?>$izAtJe zwuBJoj;fNTDOFWb*EK%RbFwUB5e_q>X&OQZIOmv5COGE+Ff&33Giwn+L;z;~27>{< zsw%3gVmuzt5sApmSsceFl+K~5m>Fh9+qRh5LTFuoe#!)}v9ZBr;PCM9EYK*5xGJ2! zom?4#i2R2Px|hp_so|3(p=lcarBr+SC9K1n-*8YAy>`>~jlAHSHk_NmURhGzhw3T# z2wsmMdtWkqQuGq2Do#8ySRc&w{4$ImLh=CoF7Og$8|p{!sw|hYoA79}r}n4*+Hs52r>b10$Qjna-3FIDBlbIRGeHKxdVhNY ztX*Hjry?{WsA@mKFVHU_n{UzN8uqnDkAS1qO_3ym4s-p#T5? diff --git a/src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorAdvanced.png b/src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorAdvanced.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b5da27f67eec465effa6ab4b807860a094b42f GIT binary patch literal 1764 zcmV4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%S zl1W5CR7efAR?UhNK@k3?r>7^$qVXgMD;@+7Ij$n)wji>Qtd|851Yg0M;L#`W;9Ce@ z6IjHH2NCun=vDOK1E?WpGQZY0*&ZiDPsF%eP}4ot-CtFA{d9YS!Jz2(`&cX%01EiN z77n1Kue1-X`R_w1g&+vvc^PNKK?y zA3v1s|9&3b9##;V=Ub=82c!D$Klfi8PpdVjzFVDJB|XDV>6hjX&JceUeHQRM6cu>^ zZHy^H(T12+=xQfC-yPuDPvB(K?kgLsCSq3};VisP0a8E#_U8M-p}BmVh70=tIeoJs{o(o`_->F<;1?&`34#q$o(T*raMM zp!MpCWbPeFv?D!ri1<`pG)3E~kv+%@AL^llipZ z%YwwoQl=1?pn9sbJzMO~*rr*6=vNGu=PZ}Rm3x4@Aog$Uctr}vq78`v00004Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%S zok>JNR7efARy}VMK@fd+-n+9ML8y>Wf+&zETm~AtNC+X>p^1c$_z`qSl%%7g;9u|q zY$-xC6bLB|1uY^4=>g05e4or)XD;VsZ4@gRYkj-3vu|d0W_H)>^?K#z<|d}oDS#5K zmXQ{~m%eXWFoxq6eBVb91n@i$d7h&v3S?Pk`y6W{KZ+uYmm~=c!Q1V&fH%oQS(ZrC z)Gj9QY&NqBD9Jg3D$xKolHzqb9T-~97RPZlK_Lngltjx(9MeLAv(W>7n^ea$oTMgF z`T9&)oVGmvW%4@@bq~6gxZ(cRY3uD)eR%Hv$@7zH&1vlB`&Mx;uw&!W^xy*V=h>%# zm!YUEN|-PVZ7OPtsY2IxcsK$!fLFhPqki8dVtJarE#t$a**sfTc`zJ}Fue;*9|2N( zcsZ6_e?P+Dp<4+RFr7W$!0&8y7INNYR(u}_?+N(6%s!JE*#VMW;Dso55$lDm9ffil zcycI6v1m~>7tnhDhSbOdDYSh-?(ZRZD&uWnSDK3yFN-ty$!S%(DzaKEb>rQX7CuH` z_JHeR8EaGG;UbM^_i7g=k|QCN#ywj~KY`+lY|Zu?6yX(=UlSC+M4D{{g`otQ0ipF8 z`KJ6pvSs*vgzTdz`61B_$0&}a{|y-IxPz=1lgSLeD&WDjj0U&*NRGsV4?unhq@RFy zpO;CW@ri9cAZz6o$^4T$HEXX4<2F~hNn=0-)&sZL`rHKt|Fe93HS=A$6c5y>@np=S zBD1HSGVABL^49%EK?Kv53tI0`9Q+H#K-pk9YDKG`4+HHJp~92?(mPpIu|^mt4P2d1 z9_O1WzHle=X~CBTiNbPBAqa!&sj}?ZqMq@a;P)4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%S znMp)JR7efAR?UjkKoI`Y(@AD#(e)$>D;@+7b6mabZ9znsSuYDB_zYeJFM{CRH}C;` zfC(((#e)cY*@IWngAd?3jFU++iS;F0F%x=59Cr&U-Kp;Ws=Di^+Zzl9#rF0#X0sW9 z0-cT(_F<%NYzNlzzXM|oeBX!Xc~~qK$nzXomX&?}D^nhZVTqR{2`s_8-L8PQ$wN^T zNYk`jOyK!^UMk>BjuBLe29QaL*X#9QX*oHL<9dLTIGLa%T2A6WEhIRZJ7C+UCZ6RW zHIYuPy(!!O{p_7StsyMWw@E|uqWSyJ{V0D`uQ~Hwb#Arv96P07+B-N${3`ks@FEly zc>x;)K^ck~Vye*9j*lW>3wZexI35mNQ%aeJZ^s(gG^=8H-44c4gxMWn_5hIF!}E#6 z`nw3D`)(yvz;O1Ah3ReemSWyzR=fuUcLn@VMxRKI>;lO?@JtlDi1|Y9hJjQAPl|#h zizZcj0j)RJC3Ejdq8$qI@Bsc}`QHKdgMb;Hp^0 z+!TMfNd4Kr+=mUNB&5PTvz7D%$WP>Gc3vY7E}{6GAU~DautEKA?hf2kvQ`OP3V<&GOCFRHt$wJ5Zx0(+NvOR#rU~ zHtV^{Hf=*cgzd@&t#@eiCQ?v3s&tkkS2X+iFwj2NDIWVP?_>^=m?QL)I_W~ z4)LWsnNJJ8EEG)26#T%ipDL@KExI$d*&;>!D*?;%BA3LKdw{zj_HS?BKXohmnGpa0 N002ovPDHLkV1iE|WN!cf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorUltimate.png b/src/main/resources/assets/mekanism/textures/blocks/models/ThermodynamicConductorUltimate.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d1157e75c2c2f94c95373273aa590a86ce281f GIT binary patch literal 1786 zcmV4Tx062|}Rb6NtRTMtEb7vzY&QokOg>Hg1+lHrgWS zWcKdPn90sKGrRqvPeo9CG3uKX#J{(IASm?@+di}}l?o-=)F3E6wD^Ni=!>T7nL9I? zX}YoAW$t|Qo$sD|?zw001?ah|SeB6#0T!CBEf+H4bBB+JJu8rehoBb*p;u8ID_yBf z0ya+zcePvJL&AGs+11_tpRKn>9TgyPA7ZoSs0)aX0r00)%XR^J`jH<$>RKN5V(7Oq zK*TS4xZz{h!*f1C3ECFkK$#7nA@pGN!$;%jYvwjAKwmYb0gKL(K8 z-kPtb5${A?tlI~wzMrJ6wTdBr=Y%%%EaEMQ&o}4FQ^DA)s*}Z>!FI&AHCpoWI|RUq zx?7s@$8!5^Q=anY%X@i5{QA6kNcMelpE>R6eCYFpmMsVTrI(b06~u#xf1yS} z_UGdMvD``!0~u->P=lA4?YN`hilQ|3tHka)7T{2CGqw zjZfMwx$5irQN_*|e4l)UHmiYuz74Yp1t^#>hrJ3-SOXDcC_o0^7T9R1gAN8V6s;5) zieI5-7aQlmJn}lUna#nz!j%5V$X|o`xX!dHWQRV27P1=rj;t2bW$~+pTw@bIek?Zv zKPDL<64`^#UNTAck#RBsB6*5DP4<%UA_FqU$I>2EH_cM;u)Q~SI+rg`Rn{L_AC5qq~L$#SMj%U z$6Cz0vP{G5Y*=%5RT^yu;}-DInZ=349rJPVM6C3K^oO)8y(fJr{l>k`ead~!ea?NsT>_Ci%bnxC;Vy6=b6>{xYV#Ue-+LB$ z7`JEXmTRm^AtP)R9u{)KHsMiWGV&)32xCG~*nyU<>-!d;FP=Re4r3qYr~6#KE>;1F z`>_J_P5xC?ROxV(DIHdCO*p$HRQI@7^PwV@Pvuf+5K}u-6REM(K@W$s zrgorh0{i?O)v0c>QtHxU-hBdD(>iYJ4b2sIOVX2K8m~4gmYVA5h^QEb$V`rCQ-|7Z zS{nuL-t>?3n=-o(6I(7vocj#GzCZEo`!3>+v;dYIfPu#&ZWzzX2i^rZ^Mu;6+rb@? zNPG+6)c5T6zxpzGe*M(x+{AON=PiJ>H#?ob-|uwRK0yDg0B4PV0id6JRZw95ZvX%S zs7XXYR7efAR?UhNK@k3C(le7}(Rf-ARy+tEauHT9-WEi}WW6ki;N3?MJo*Gag%=+n zfklMHg9v+3@G9%UlP5LAOy<}6I$M*;WG0}yTTs*8)!koJcm4D@{eD01^?I1iW&m=u zT1MD|D}C3rU<}7CxULJ&^WZoR(lkYuWk{05_BmFjJO~1d7ex^a!Q1V&fLF;up67_; z*ls59d_K1dxRP@ORiXi8lHzqb9T-|p4#TjR;36(2D2bMnIHrXJC-Vest5n7_oTMhw zL-WkGYoBCIvJkZDw_iZTJ5L*uj)oeve?`e z@N2^UBY0*X*cQu}o8pf;(vs1=+=U6GB*enJvqt&}WS`_}c3vU#FCqUDA^Rn($s5S` z#mRICtyj-i*AFFHMkiw=??uUX@vc8X_D%X=kXO8jo+5ti2)|ZY+VSJ@o+<*b`J2oOQgSV54)-sEODY zasst$GM%tgB)00Quw2ho_P=f51u$)Sp!E$s!ty0jP&&#wt0q@8`}t#_eeP2{_8Z@1 zPLh}-_AW(1nJA|-*;Ye*