private void ConfigurePollutedWaterOutput()
    {
        Storage storage = null;
        Tag     tag     = ElementLoader.FindElementByHash(SimHashes.DirtyWater).tag;

        Storage[] components = GetComponents <Storage>();
        foreach (Storage storage2 in components)
        {
            if (storage2.storageFilters.Contains(tag))
            {
                storage = storage2;
                break;
            }
        }
        ElementConverter[] components2 = GetComponents <ElementConverter>();
        foreach (ElementConverter elementConverter in components2)
        {
            ElementConverter.OutputElement[] outputElements = elementConverter.outputElements;
            for (int k = 0; k < outputElements.Length; k++)
            {
                ElementConverter.OutputElement outputElement = outputElements[k];
                if (outputElement.elementHash == SimHashes.DirtyWater)
                {
                    elementConverter.SetStorage(storage);
                    break;
                }
            }
        }
        pollutedWaterStorage = storage;
    }
        public static void Postfix(WaterPurifierConfig __instance, ref GameObject go)
        {
            Debug.Log("=============== Water Purifier Changed =======================");

            ElementConverter elementConverter = go.AddOrGet <ElementConverter>();

            //ElementConverter.OutputElement[] oldOutputElements = elementConverter.outputElements;
            ElementConverter.OutputElement[] newOutputElements;

            newOutputElements = new ElementConverter.OutputElement[]
            {
                new ElementConverter.OutputElement(5f, SimHashes.Water, 0f, true, 0f, 0.5f, true, 0.75f, 255, 0),
                new ElementConverter.OutputElement(0.2f, SimHashes.ToxicSand, 0f, true, 0f, 0.5f, true, 0.25f, 255, 0)
            };

            elementConverter.outputElements = newOutputElements;

            //elementConverter = go.AddOrGet<ElementConverter>();
            //checkNewElements = elementConverter.outputElements;
            //Debug.Log("Total elements: " + checkNewElements.Count().ToString());
            //foreach (var item in checkNewElements)
            //Debug.Log("outputElements: " + item.element.id.ToString());

            Debug.Log("=================== END ======================");
        }
        internal static PortDisplayOutput AddOutput(GameObject go, CellOffset offset, SimHashes elementHash)
        {
            Element     element     = ElementLoader.GetElement(elementHash.CreateTag());
            ConduitType conduitType = element.IsGas ? ConduitType.Gas : element.IsLiquid ? ConduitType.Liquid : ConduitType.Solid;

            // port color
            Color32 color = element.substance.conduitColour;

            color.a = 255; // for some reason the alpha channel is set to invisible for some elements (hydrogen only?)

            if (color.r == 0 && color.g == 0 && color.b == 0)
            {
                // avoid completely black icons since the background is black
                color.r = 25;
                color.g = 25;
                color.b = 25;
            }

            PortDisplayOutput outputPort = new PortDisplayOutput(conduitType, offset, null, color);

            PortDisplayController controller = go.AddOrGet <PortDisplayController>();

            controller.Init(go);

            controller.AssignPort(go, outputPort);

            ElementConverter converter = go.GetComponent <ElementConverter>();

            if (converter != null)
            {
                for (int i = 0; i < converter.outputElements.Length; ++i)
                {
                    ElementConverter.OutputElement item = converter.outputElements[i];
                    if (item.elementHash == elementHash)
                    {
                        converter.outputElements[i].storeOutput = true;

                        PipedDispenser dispenser = go.AddComponent <PipedDispenser>();
                        dispenser.elementFilter = new SimHashes[] { elementHash };
                        dispenser.AssignPort(outputPort);
                        dispenser.alwaysDispense     = true;
                        dispenser.SkipSetOperational = true;

                        PipedOptionalExhaust exhaust = go.AddComponent <PipedOptionalExhaust>();
                        exhaust.dispenser   = dispenser;
                        exhaust.elementHash = elementHash;
                        exhaust.elementTag  = elementHash.CreateTag();
                        exhaust.capacity    = item.massGenerationRate * converter.OutputMultiplier * 5;

                        break;
                    }
                }
            }
            else
            {
                EnergyGenerator energyGenerator = go.GetComponent <EnergyGenerator>();
                if (energyGenerator != null)
                {
                    for (int i = 0; i < energyGenerator.formula.outputs.Length; ++i)
                    {
                        EnergyGenerator.OutputItem item = energyGenerator.formula.outputs[i];
                        if (item.element == elementHash)
                        {
                            energyGenerator.formula.outputs[i].store = true;

                            PipedDispenser dispenser = go.AddComponent <PipedDispenser>();
                            dispenser.elementFilter = new SimHashes[] { elementHash };
                            dispenser.AssignPort(outputPort);
                            dispenser.alwaysDispense     = true;
                            dispenser.SkipSetOperational = true;

                            PipedOptionalExhaust exhaust = go.AddComponent <PipedOptionalExhaust>();
                            exhaust.dispenser   = dispenser;
                            exhaust.elementHash = elementHash;
                            exhaust.elementTag  = elementHash.CreateTag();
                            exhaust.capacity    = item.creationRate * 5;

                            break;
                        }
                    }
                }
            }
            return(outputPort);
        }