public static void DirectionOutput(ElectricalOIinheritance SourceInstance,
                                       IntrinsicElectronicData Thiswire,
                                       CableLine RelatedLine = null)
    {
        if (Thiswire.Data.connections.Count == 0)
        {
            Thiswire.FindPossibleConnections();
        }

        if (!(Thiswire.Data.SupplyDependent.TryGetValue(SourceInstance, out ElectronicSupplyData outputSupplyingUsingData)))
        {
            outputSupplyingUsingData = Thiswire.Data.SupplyDependent[SourceInstance] = ElectricalPool.GetElectronicSupplyData();
        }

        foreach (IntrinsicElectronicData Relatedindata in Thiswire.Data.connections)
        {
            if (!(outputSupplyingUsingData.Upstream.Contains(Relatedindata)) && (!(Thiswire == Relatedindata)))
            {
                bool pass = true;
                if (RelatedLine != null)
                {
                    if (RelatedLine.Covering.Contains(Relatedindata))
                    {
                        pass = false;
                    }
                }
                if (!(outputSupplyingUsingData.Downstream.Contains(Relatedindata)) && pass)
                {
                    outputSupplyingUsingData.Downstream.Add(Relatedindata);
                    Relatedindata.DirectionInput(SourceInstance, Thiswire);
                }
            }
        }
    }
    public static void DirectionInput(ElectricalOIinheritance SourceInstance,
                                      IntrinsicElectronicData ComingFrom,
                                      IntrinsicElectronicData Thiswire)
    {
        //Logger.Log(Thiswire.Categorytype + "DirectionInput");
        if (Thiswire.Data.connections.Count == 0)
        {
            Thiswire.FindPossibleConnections();             //plz don't remove it is necessary for preventing incomplete cleanups when there has been multiple
        }
        if (!(Thiswire.Data.SupplyDependent.ContainsKey(SourceInstance)))
        {
            Thiswire.Data.SupplyDependent[SourceInstance] = ElectricalPool.GetElectronicSupplyData();
        }
        if (ComingFrom != null)
        {
            Thiswire.Data.SupplyDependent[SourceInstance].Upstream.Add(ComingFrom);
        }

        if (Thiswire.ConnectionReaction.ContainsKey(ComingFrom.Categorytype))
        {
            var Reaction = Thiswire.ConnectionReaction[ComingFrom.Categorytype];
            if (Reaction.DirectionReaction || Reaction.ResistanceReaction)
            {
                if (SourceInstance != null)
                {
                    if (!Thiswire.Data.ResistanceToConnectedDevices.ContainsKey(SourceInstance))
                    {
                        Thiswire.Data.ResistanceToConnectedDevices[SourceInstance] = new Dictionary <Resistance, HashSet <IntrinsicElectronicData> >();
                    }
                    if (!Thiswire.Data.ResistanceToConnectedDevices[SourceInstance].ContainsKey(Reaction.ResistanceReactionA.Resistance))
                    {
                        Thiswire.Data.ResistanceToConnectedDevices[SourceInstance][Reaction.ResistanceReactionA.Resistance]
                            = new HashSet <IntrinsicElectronicData>();
                    }

                    Thiswire.Data.ResistanceToConnectedDevices[SourceInstance][Reaction.ResistanceReactionA.Resistance]
                    .Add(ComingFrom);
                    SourceInstance.connectedDevices.Add(Thiswire);
                    ElectricalManager.Instance.electricalSync.InitialiseResistanceChange.Add(Thiswire.ControllingDevice);
                }
                if (Thiswire.ConnectionReaction[ComingFrom.Categorytype].DirectionReactionA.YouShallNotPass)
                {
                    return;
                }
            }
        }

        if (Thiswire.Data.connections.Count > 2)
        {
            ElectricalManager.Instance.electricalSync.DirectionWorkOnNextListWaitADD(Thiswire);
        }
        else
        {
            ElectricalManager.Instance.electricalSync.DirectionWorkOnNextListADD(Thiswire);
        }
    }
    public static void DirectionInput(ElectricalOIinheritance SourceInstance,
                                      IntrinsicElectronicData ComingFrom,
                                      IntrinsicElectronicData Thiswire)
    {
        if (Thiswire.Data.connections.Count == 0)
        {
            Thiswire.FindPossibleConnections();             //plz don't remove it is necessary for preventing incomplete cleanups when there has been multiple
        }

        if (!Thiswire.Data.SupplyDependent.TryGetValue(SourceInstance, out ElectronicSupplyData supplyDep))
        {
            supplyDep = Thiswire.Data.SupplyDependent[SourceInstance] = ElectricalPool.GetElectronicSupplyData();
        }

        if (ComingFrom != null)
        {
            supplyDep.Upstream.Add(ComingFrom);
        }

        if (Thiswire.ConnectionReaction.TryGetValue(ComingFrom.Categorytype, out PowerInputReactions reaction))
        {
            if (reaction.DirectionReaction || reaction.ResistanceReaction)
            {
                if (SourceInstance != null)
                {
                    if (!Thiswire.Data.ResistanceToConnectedDevices.TryGetValue(SourceInstance, out var resToConDev))
                    {
                        resToConDev = Thiswire.Data.ResistanceToConnectedDevices[SourceInstance] = new Dictionary <Resistance, HashSet <IntrinsicElectronicData> >();
                    }

                    if (!resToConDev.TryGetValue(reaction.ResistanceReactionA.Resistance, out HashSet <IntrinsicElectronicData> resToConDevHash))
                    {
                        resToConDevHash = resToConDev[reaction.ResistanceReactionA.Resistance] = new HashSet <IntrinsicElectronicData>();
                    }
                    resToConDevHash.Add(ComingFrom);

                    SourceInstance.connectedDevices.Add(Thiswire);
                    ElectricalManager.Instance.electricalSync.InitialiseResistanceChange.Add(Thiswire.ControllingDevice);
                }
                if (reaction.DirectionReactionA.YouShallNotPass)
                {
                    return;
                }
            }
        }

        if (Thiswire.Data.connections.Count > 2)
        {
            ElectricalManager.Instance.electricalSync.DirectionWorkOnNextListWaitADD(Thiswire);
        }
        else
        {
            ElectricalManager.Instance.electricalSync.DirectionWorkOnNextListADD(Thiswire);
        }
    }